Gradle' maven-publish'插件失败,编码为#34;不可映射的字符"错误

时间:2015-06-25 04:39:59

标签: encoding gradle perforce maven-publish

我最近将项目从Maven迁移到了Gradle(IE:用build.gradle文件替换了pom.xml文件)。由于我的公司仍有几个依赖它的下游Maven项目,我们必须继续将pom文件以及class,source和javadoc JAR发布到我们的Nexus存储库,以便下游项目仍然可以将此项目作为Maven依赖项使用。这就是' maven-publish' Gradle的插件适合。以下是我的build.gradle文件与maven-publish插件的配置相似:

apply plugin: 'java'
apply plugin: 'maven-publish'

group = 'com.my.company'
version = 'myProduct-SNAPSHOT'

repositories {
    mavenLocal()
    maven { url 'http://nexus.my.company.net/nexus/content/repositories/build-test-release' }
    maven { url 'http://nexus.my.company.net/nexus/content/repositories/build-test-snapshot' }
    maven { url 'http://nexus.my.company.net/nexus/content/repositories/central' }
    maven { url 'http://nexus.my.company.net/nexus/content/repositories/thirdparty' }
}

dependencies {
    // Stuff
}

sourceSets {
    main {
        // Stuff
    }
}

task sourcesJar (type: Jar) {
    classifier = 'sources'
    from sourceSets.main.allJava
}

task javadocJar (type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

publishing {
    publications {
        mavenJars(MavenPublication) {

            // Classes
            from components.java

            // Sources
            artifact(sourcesJar) {
                classifier = 'sources'
            }

            // Javadoc
            artifact(javadocJar) {
                classifier = 'javadoc'
            }
        }
    }
    repositories {
        maven {
            url 'http://nexus.my.company.net/nexus/content/repositories/build-test-snapshot'
            credentials {
                username 'user'
                password 'password'
            }
        }
    }
}

这会生成Gradle'发布'任务将生成所需的pom.xml文件以及类,源和javadoc JAR。一旦完成,它将把罐子发布到' build-test-snapshot' Nexus存储库。

这对我的机器以及我们的构建服务器和我的大多数同事来说都非常好。框。然而,一些同事一直在抱怨,因为“gradlew”发表了“&gra;命令(请注意,项目中包含Gradle 2.4包装器)失败,并出现以下错误:

C:\Users\user\Perforce\WORKSPACE\project\src\main\java\com\my\company\test\randomizati
on\RandomHelper.java:18: error: unmappable character for encoding Cp1252
    private static final String NON_ENGLISH_CHARACTERS = "1234567890─Ç─?─é─â─ä─à─å─ç─ê─ë─è─ï─î─?─Ä─?─?─æ─Æ─ô─ö─ò─û─ù─ÿ─Ö
─Ü─¢─£─?─₧─ƒ─á─í─ó─ú─ñ─Ñ─ª─º─¿─⌐─¬─½─¼─¡─«─»─░─▒─▓─│─┤─╡─╢─╖─╕─╣─║─╗─╝─╜─╛─┐┼Ç┼?┼é┼â┼ä┼à┼å┼ç┼ê┼ë┼è┼ï┼î┼?┼Ä┼?┼?┼æ┼Æ┼ô┼ö┼ò
┼û┼ù┼ÿ┼Ö┼Ü┼¢┼£┼?┼₧┼ƒ┼á┼í┼ó┼ú┼ñ┼Ñ┼ª┼º┼¿┼⌐┼¬┼½┼¼┼¡┼«┼»┼░┼▒┼▓┼│┼┤┼╡┼╢┼╖┼╕┼╣┼║┼╗┼╝┼╜┼╛┼┐╞Ç╞?╞é╞â╞ä╞à╞å╞ç╞ê╞ë╞è╞ï╞î╞?╞Ä╞?╞Æ╞á
╞í╞»╟?╟Ä╟?╟?╟æ╟Æ╟ô╟ö╟ò╟û╟ù╟ÿ╟Ö╟Ü╟¢╟£╟║╟╗╟╝╟╜╟╛╟┐├Ç├?├é├â├ä├à├å├ç├ê├ë├è├ï├î├?├Ä├?├?├æ├Æ├ô├ö├ò├û├ù├ÿ├Ö├Ü├¢├£├?├₧├ƒ├á├í├ó├ú
äåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ&-.*$";

有趣的是,' gradlew build'命令(使用javac编译项目)对每个人都执行得很好。机器。这是“gradlew发布”的主题。在某些计算机上出现问题的命令(在Mac和Windows上都通过或失败)。

我无法分辨这里的关键区别,但我怀疑受影响的用户的Perforce客户端配置错误(未指定P4CHARSET)并且所有项目文件都使用默认编码同步到他们的计算机。我不清楚如何检查Perforce在同步时使用的编码,所以这只是一个理论。据我所知,即使他们修复了他们的配置,他们仍然需要消除他们的征兵并再次从Perforce服务器下载所有文件以获得正确的编码(utf16le-bom)。

无论任何Perforce问题,责任都归咎于我,因为我是那个首先将我们转移到Gradle的人。如果我可以通过某种方式配置maven-publish插件来解决问题,那么我更愿意这样做。如果javac可以将这些文件中的非标准字符编译成类,那么插件就没有理由不能读取它们并为它们生成javadoc,对吗?也许需要明确告诉使用什么编码?

我已经尝试过使用JAVA_OPTS和GRADLE_OPTS中的-Dfile.encoding = x-UTF-16LE-BOM选项(这没什么区别)。我还发现以下代码段用于指定编译'编译' Gradle中的任务:

tasks.withType(Compile) {
    options.encoding = 'x-UTF-16LE-BOM'
}

不幸的是,这是为了编译'任务,项目已经成功编译。我不确定maven-publish插件正在生成什么类型​​的任务,所以我不知道如何将这种方法应用于这些任务(这可能吗?)。

我还可以尝试使Gradle maven-publish插件停止跳过文件编码?

1 个答案:

答案 0 :(得分:1)

在深入了解Gradle API后,我提出了这个问题:

// Force character encoding in case the workspace was not set up correctly
tasks.withType(Javadoc) {
    options.encoding = 'x-UTF-16LE-BOM'
}

这解决了以前在运行'gradlew publish'时出现编码错误失败的计算机上的问题。

注意:对于大多数用例,options.encoding应设置为UTF8而不是x-UTF-16LE-BOM。