【Intellij Idea 插件 番外】使用Gradle编译插件,解决中文乱码

简介

本篇博客主要是介绍Intellij Idea 插件开发过程中,使用Gradle进行编译时(默认是Ant),配置和使用相关的问题。由于官方文档此处说的不是特别明白,我在此将自己的配置进行讲解,并讲解如何解决使用Gradle 编译时出现中文乱码问题。如有错误,请在留言中指正,谢谢。 系列汇总地址


实践

为什么要使用Gradle

肯定有很多人还是有疑惑,既然Gradle使用起来还需要看各种配置,而且还有各种坑,为什么还要使用Gradle 呢? 其原因就需要知道GradleAnt的区别了,其实和EclipseAndroid Studio 的比较一样,使用Ant的时候你的依赖需要下各种jar包,进行手动依赖,Gradle 只需配置好对应的Mavent 仓库,然后设置好依赖的库的名字和版本即可,方便程度不言而喻。想想eclipse 再想想Android Studio 是不是已经迫不及待开始搞起了?好,下面我开始讲如何使用Gradle 编译插件。

配置Gradle

首先我们选择File->New Project,然后按照下图步骤操作:

设置项目

图1

步骤如下:第一步选择Gradle,第二步选择Project SDK(此处如果不明白可去基础的AnAction,了解Project SDK 相关知识),第三步 选择Next

然后,显示如图所示:

设置项目

图2

此处,会让你配置GroupId以及ArtifactIdVersion这些信息。你可以根据自己的需求进行配置即可,没特别要求,然后一路默认选择Next ,最后选择Finish,这样就完成了,官方教程也大概只写到这里。

此时你看到的目录结构应该如下所示:

设置项目

图3

此时,依照图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,用于标识你的plugin(必填,且唯一)-->
    <id>com.simon.plugin.gradle.demo</id>
    <!--这个用于显示你的plugin name(必填)-->
    <name>GradleDemoPluginName</name>
    <!--这个地方填写你的plugin version,gradle 配置的以build.gradle内的为准-->
    <version>1.0</version>
    <!--邮箱和公司地址和公司名称-->
    <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>
    <!--插件的内容描述-->
    <description><![CDATA[
    ]]></description>
    <!--插件的更新日志-->
    <change-notes><![CDATA[
    ]]>
    </change-notes>

    <!--编译支持的版本,类似android的版本限制-->
    <idea-version since-build="145.0"/>


    <extensions defaultExtensionNs="com.intellij">
        <!-- Add your extensions here -->
    </extensions>

    <actions>
        <!-- Add your actions here -->
    </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决定是否配置即可,其他的按照上面的配置即可。

当然如果你觉得麻烦,或者仍然配置有问题,可以下载此文件复制过来即可。

那么,怎么知道是否配置成功呢 ?

你可以按照如下步骤进行查看:

设置项目

图4

如果最后显示了如图所示的Task ,则说明配置成功了。

如何同时兼容JavaKotlin的编译呢?

在此之前我们应该在build.gradle 里面配置了kotlin有关的依赖,然后在src下面建立main文件夹,再分别建javakotlin文件夹,内部分别存放对应的代码即可。不理解的地方,可以参照此文件,进行配置。

如何使用Gradle 进行编译呢?

  • Gradle 直接运行:你可以看刚才的图4,里面显示了Tasksintellij内 ,它有个runIdeTask,你可以使用命令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中文乱码

当你开开心心的使用Gradle编译完成后,然后安装上你的插件,你这时候会发现你的插件说明中,中文成了乱码,如果你使用的都是英文的话,那就当我没说….

当时遇见这个问题的时候感觉很奇怪,为什么会出现乱码呢?明明Ant编译的时候并没有问题啊,为什么Gradle 编译就有问题了呢?那既然改变的条件是这个,那就应该从此处出发。

然后我解压了打包后的插件,发现里面的plugin.xml的编码方式为Ansi ,而我原本的plugin.xml文件是UTF-8的,而Ant打包后是UTF-8。继续下扒,由于Ansi 格式的文件,是无法正常显示中文的,这个地方应该是关键问题。既然如此,我们去扒一下Gradle打包期间的流程,我们打包的时候,使用了gradle-intellij-plugin 插件,我们去看下它的源码,后面终于找到了有关xml打包TaskPatchPluginXmlTask),下面看下它的关键代码:

@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进行编译时,配置和使用过程中可能遇到的问题和解决方案,温故知新,内容持续加入中,敬请期待~

学完了内容后,多回顾多思考,继续后续内容

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值