本篇博客主要是介绍Intellij Idea
插件开发过程中,使用Gradle
进行编译时(默认是Ant
),配置和使用相关的问题。由于官方文档此处说的不是特别明白,我在此将自己的配置进行讲解,并讲解如何解决使用Gradle
编译时出现中文乱码问题。如有错误,请在留言中指正,谢谢。 系列汇总地址
Gradle
肯定有很多人还是有疑惑,既然Gradle
使用起来还需要看各种配置,而且还有各种坑,为什么还要使用Gradle
呢? 其原因就需要知道Gradle
和Ant
的区别了,其实和Eclipse
和 Android Studio
的比较一样,使用Ant
的时候你的依赖需要下各种jar
包,进行手动依赖,Gradle
只需配置好对应的Mavent
仓库,然后设置好依赖的库的名字和版本即可,方便程度不言而喻。想想eclipse
再想想Android Studio
是不是已经迫不及待开始搞起了?好,下面我开始讲如何使用Gradle
编译插件。
首先我们选择File->New Project
,然后按照下图步骤操作:
步骤如下:第一步选择Gradle
,第二步选择Project SDK
(此处如果不明白可去基础的AnAction,了解Project SDK
相关知识),第三步 选择Next
然后,显示如图所示:
此处,会让你配置GroupId
以及ArtifactId
和Version
这些信息。你可以根据自己的需求进行配置即可,没特别要求,然后一路默认选择Next
,最后选择Finish
,这样就完成了,官方教程也大概只写到这里。
此时你看到的目录结构应该如下所示:
此时,依照图3 ,依次展开src->main->java
,你可以在此处新建包,然后新建你的java
类,使用java
去编写插件。当然,如果你需要使用kotlin
的话,首先需要在src->main
下新建一个kotlin
文件夹,和java
同级,将你的kotlin
代码放置此处即可,不过仅仅如此还不够,还需要修改build.gradle
的配置,后续讲解build.gradle
的配置的时候会具体说明。
为了你的Gradle
编译的插件能够使用,还需要新建一个plugin.xml
文件,放置在src->main->resources->META-INF
(没有的自行新建) 目录下,注意要选择UTF-8
编码,否则不支持中文哦。plugin.xml
的内容可以参考下方代码:
<idea-plugin>
<id>com.simon.plugin.gradle.demoid>
<name>GradleDemoPluginNamename>
<version>1.0version>
<vendor email="[email protected]" url="http://www.yourcompany.com">YourCompanyvendor>
<description>description>
<change-notes>
change-notes>
<idea-version since-build="145.0"/>
<extensions defaultExtensionNs="com.intellij">
extensions>
<actions>
actions>
idea-plugin>
当然仅仅如此还不够,还需要配置你的build.gradle
文件,配置如下:
// 1.配置仓库
buildscript {
//kotlin 版本配置,不需要kotlin的可删除此处
ext.kotlin_version = '1.2.0'
//仓库地址配置
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots/"
}
maven {
url 'http://dl.bintray.com/jetbrains/intellij-plugin-service'
}
}
dependencies {
classpath "org.jetbrains.intellij.plugins:gradle-intellij-plugin:0.3.0-SNAPSHOT"
//kotlin 配置,不需要kotlin的可删除此处
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
//2.插件 配置
plugins {
id "org.jetbrains.intellij" version '0.2.17'
}
//2.1 插件配置
// 这两个插件是必备
apply plugin: 'idea'
apply plugin: 'org.jetbrains.intellij'
//编译java必备
apply plugin: 'java'
//编译kotlin必备(不需要Kotlin的可删除此处)
apply plugin: 'kotlin'
//2.2
//此处也必须设置用于 下载kotlin和其他库
repositories {
mavenCentral()
}
//3.此处是用于设置基于的intellij的版本 并且会下载源码!!
intellij {
//此处版本需要按照后面的配置一致,否则此处报错!!!!(IC-version)
version '173.3727.127' //这个是你要下载的源码的版本,参考此处https://www.jetbrains.com/intellij-repository/releases
plugins 'coverage' //Bundled plugin dependencies
pluginName 'gradle_config_plugin'//插件的名称
}
//4.依赖
dependencies {
//此处用于填写你所依赖的内容,比如此处依赖kotlin(不需要Kotlin的可删除此处)
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}
//配置生成的Intellij Idea 的插件相关内容
group 'GradleConfigDemo'
//此处配置版本后,plugin.xml中的配置将失效
version '1.0-SNAPSHOT'
上面的注释应该足够清晰了,注释中表示只有当使用kotlin
时才需要的配置,视是否使用kotlin
决定是否配置即可,其他的按照上面的配置即可。
当然如果你觉得麻烦,或者仍然配置有问题,可以下载此文件复制过来即可。
那么,怎么知道是否配置成功呢 ?
你可以按照如下步骤进行查看:
如果最后显示了如图所示的Task
,则说明配置成功了。
如何同时兼容
Java
和Kotlin
的编译呢?
在此之前我们应该在build.gradle
里面配置了kotlin
有关的依赖,然后在src
下面建立main
文件夹,再分别建java
和kotlin
文件夹,内部分别存放对应的代码即可。不理解的地方,可以参照此文件,进行配置。
如何使用
Gradle
进行编译呢?
Gradle
直接运行:你可以看刚才的图4,里面显示了Tasks
里intellij
内 ,它有个runIde
的Task
,你可以使用命令gradle runIde
或者直接点击 上图中显示的位置即可,使用命令的前提需要配置好Gradle
的环境,具体如何配置Gradle
环境自行百度。Gradle
编译后导入运行:你可以直接使用gradle clean
(清理编译内容),然后使用gradle build
即可完成项目编译。
注意:这些Gradle
命令,运行的前提首要的是需要配置对应的环境,其次必须在项目的文件路径上执行(切换到项目的文件目录),或者使用IDE
下面的terminal
,它已经切换路径到当前项目的文件目录了,可以直接输入Gradle
命令。
Gradle
编译的内容在哪呢?如何使用?
我们刚才看图2中项目的文件目录结构,当你编译过后,它里面会有个build
文件夹,是用于存储生成的文件的,然后点击打开可以看到idea-sanbox
,然后再打开可以看到plugins
,再打开看到的就是与你的plugin name
相同名称的文件夹,将此文件夹打包成zip
格式即可导入到intellij idea
平台ide
使用。
注意:gradle clean 会清除build 文件夹以及文件夹内的内容。
到此,你已经完成了所有的Gradle
的配置,现在应该是可以编译和运行了,如果还有配置不清楚的,请参考此文件
当你开开心心的使用Gradle
编译完成后,然后安装上你的插件,你这时候会发现你的插件说明中,中文成了乱码,如果你使用的都是英文的话,那就当我没说….
当时遇见这个问题的时候感觉很奇怪,为什么会出现乱码呢?明明Ant
编译的时候并没有问题啊,为什么Gradle
编译就有问题了呢?那既然改变的条件是这个,那就应该从此处出发。
然后我解压了打包后的插件,发现里面的plugin.xml
的编码方式为Ansi
,而我原本的plugin.xml
文件是UTF-8
的,而Ant
打包后是UTF-8
。继续下扒,由于Ansi
格式的文件,是无法正常显示中文的,这个地方应该是关键问题。既然如此,我们去扒一下Gradle
打包期间的流程,我们打包的时候,使用了gradle-intellij-plugin
插件,我们去看下它的源码,后面终于找到了有关xml
打包Task
(PatchPluginXmlTask),下面看下它的关键代码:
@TaskAction
void patchPluginXmlFiles() {
def files = getPluginXmlFiles()
files.each { file ->
def pluginXml = Utils.parseXml(file)
patchTag(pluginXml, "idea-version", null, [
"since-build": getSinceBuild(),
"until-build": getUntilBuild()])
patchTag(pluginXml, "description", getPluginDescription())
patchTag(pluginXml, "change-notes", getChangeNotes())
patchTagIf(getVersion() != Project.DEFAULT_VERSION,
pluginXml, "version", getVersion())
patchTag(pluginXml, "id", getPluginId())
def writer
try {
//核心原因就是因为此处,使用了FileWriter,它的文件格式默认就是Ansi的
writer = new PrintWriter(new FileWriter(new File(getDestinationDir(), file.getName())))
def printer = new XmlNodePrinter(writer)
printer.preserveWhitespace = true
printer.print(pluginXml)
}
finally {
if (writer) {
writer.close()
}
}
}
}
通过上面的注释我们看到了原因,就是使用了FileWriter
,所以导致无法成为UTF-8
格式的文件,好,既然如此,我们怎么去修改呢? 看了下它的参数,似乎没有给予修改文件编码的方式,那我们只能自己修改了,那怎么修改呢?后面思考后,可以在PatchPluginXmlTask
后面加个功能,完成xml
文件的格式转换,具体代码如下:
//-----------------------------------change xml file encoding---------------------------------------------
project.patchPluginXml.doLast {
loopFileDirectoryChangeFileEncoding((File) project.patchPluginXml.getDestinationDir())
}
/**
* Traverse the folder, modifying the file format to utf-8
*/
void loopFileDirectoryChangeFileEncoding(File xmlFileDirectory) {
//check directory
if (xmlFileDirectory != null && xmlFileDirectory.isDirectory()) {
File[] files = xmlFileDirectory.listFiles()
//loop file
for (File tempXmlFile : files) {
if (tempXmlFile.isFile()) {
String xmlPath = tempXmlFile.getPath()
project.changeFileEncodingToUtf8(xmlPath)
}
}
}
}
/**
* Modifying the xml file to utf - 8
*/
void changeFileEncodingToUtf8(String xmlPath) {
try {
//read xml file
BufferedReader bfr = new BufferedReader(new FileReader(xmlPath))
String line = bfr.readLine()
StringBuilder sb = new StringBuilder()
while (line != null) {
sb.append(line)
sb.append("\n")
line = bfr.readLine()
}
bfr.close()
//write xml file
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(xmlPath, false), "UTF-8"))
writer.write(sb.toString())
writer.flush()
writer.close()
} catch (IOException e) {
System.out.println("read err:" + e.toString())
}
}
上面的代码可以放到你的build.gradle
的最下面,即可,然后可以正常的编译,运行,无需额外操作,即可。上面的原理就是将编译完成的xml
文件修改为UTF-8
编码,好,问题解决~
至此已经基本了解了Intellij Idea
的插件中,使用Gradle
进行编译时,配置和使用过程中可能遇到的问题和解决方案,温故知新,内容持续加入中,敬请期待~
学完了内容后,多回顾多思考,继续后续内容。