Gradle的'maven-publish'插件失败,出现"编码无法映射的字符"错误

3
我最近将一个项目从Maven迁移到Gradle(即:用build.gradle文件替换了pom.xml文件)。由于我的公司仍有几个下游Maven项目依赖于它,因此我们必须继续发布一个pom文件以及类、源代码和javadoc JAR到我们的Nexus存储库,以便下游项目仍然可以将此项目作为Maven依赖项使用。这就是Gradle中'maven-publish'插件的作用。以下是我的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“publish”任务,该任务将生成所需的pom.xml文件以及类、源代码和javadoc JAR包。完成后,它将将JAR包发布到“build-test-snapshot”Nexus存储库。
在我的电脑以及我们的构建服务器上以及大多数同事的电脑上,这完全正常运行。然而,一些同事抱怨说,“gradlew publish”命令(请注意,项目中已包含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 publish”命令在某些计算机上有问题(无论是在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“Compile”任务编码的片段:
tasks.withType(Compile) {
    options.encoding = 'x-UTF-16LE-BOM'
}

很遗憾,这个方法只适用于“编译”任务,而项目已经成功编译。我不确定maven-publish插件生成哪种类型的任务,所以我不知道如何为这些任务应用这种方法(是否可能?)。

还有什么可以尝试使Gradle maven-publish插件停止因文件编码问题出错吗?

1个回答

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。

这解决了我在根目录中使用“tasks.withType(Javadoc){options.encoding ='UTF-8'}”时遇到的问题。谢谢。 - Maher Abuthraa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接