Encoding 格拉德尔';maven publish';插件失败,返回“0”;用于编码的不可映射字符";错误

Encoding 格拉德尔';maven publish';插件失败,返回“0”;用于编码的不可映射字符";错误,encoding,gradle,perforce,maven-publish,Encoding,Gradle,Perforce,Maven Publish,我最近将一个项目从Maven迁移到Gradle(即:将pom.xml文件替换为build.Gradle文件)。由于我的公司仍然有几个依赖它的下游Maven项目,我们必须继续将pom文件以及类、源和javadoc JAR发布到我们的Nexus存储库中,以便下游项目仍然可以将此项目作为Maven依赖项使用。这就是Gradle的“maven publish”插件的用途。以下是我的build.gradle文件与maven publish插件的配置类似: apply插件:“java” 应用插件:“mave

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

apply插件:“java”
应用插件:“maven发布”
组='com.my.company'
版本='myProduct SNAPSHOT'
存储库{
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' }
}
依赖关系{
//东西
}
源集{
主要{
//东西
}
}
任务源Jar(类型:Jar){
分类器='sources'
来自sourceset.main.allJava
}
任务javadocJar(类型:Jar,dependsOn:javadoc){
分类器='javadoc'
来自javadoc.destinationDir
}
出版{
出版物{
mavenJars(mavenJars出版物){
//班级
来自components.java
//来源
工件(sourcesJar){
分类器='sources'
}
//Javadoc
工件(javadocJar){
分类器='javadoc'
}
}
}
存储库{
马文{
url'http://nexus.my.company.net/nexus/content/repositories/build-test-snapshot'
证书{
用户名“用户”
密码“password”
}
}
}
}
这将生成一个Gradle“publish”任务,该任务将生成所需的pom.xml文件以及类、源和javadoc jar。完成后,它会将JAR发布到“构建测试快照”Nexus存储库

这在我的机器、我们的构建服务器和大多数同事的机器上都能很好地工作。但是,一些同事一直在抱怨,因为“gradlew publish”命令(请注意,项目中包含了一个Gradle 2.4包装器)在他们身上失败,出现如下错误:

C:\Users\user\Perforce\WORKSPACE\project\src\main\java\com\my\company\test\randomizati
on\RandomHelper.java:18:错误:编码Cp1252的不可映射字符
私有静态最终字符串非英语字符=“1234567890─Ç─?─é─â─ä─à─å─ç─ê─ë─è─ï─î─?─Ä─?─?─æ─Æ─ô─ö─ò─û─ù─ÿ─Ö
─Ü─¢─£─?─₧─ƒ─á─í─ó─ú─ñ─Ñ─ª─º─¿─⌐─¬─½─¼─¡─«─»─░─▒─▓─│─┤─╡─╢─╖─╕─╣─║─╗─╝─╜─╛─┐┼Ç┼?┼é┼â┼ä┼à┼å┼ç┼ê┼ë┼è┼ï┼î┼?┼Ä┼?┼?┼æ┼Æ┼ô┼ö┼ò
┼û┼ù┼ÿ┼Ö┼Ü┼¢┼£┼?┼₧┼ƒ┼á┼í┼ó┼ú┼ñ┼Ñ┼ª┼º┼¿┼⌐┼¬┼½┼¼┼¡┼«┼»┼░┼▒┼▓┼│┼┤┼╡┼╢┼╖┼╕┼╣┼║┼╗┼╝┼╜┼╛┼┐╞Ç╞?╞é╞â╞ä╞à╞å╞ç╞ê╞ë╞è╞ï╞î╞?╞Ä╞?╞Æ╞á
╞í╞»╟?╟Ä╟?╟?╟æ╟Æ╟ô╟ö╟ò╟û╟ù╟ÿ╟Ö╟Ü╟¢╟£╟║╟╗╟╝╟╜╟╛╟┐├Ç├?├é├â├ä├à├å├ç├ê├ë├è├ï├î├?├Ä├?├?├æ├Æ├ô├ö├ò├û├ù├ÿ├Ö├Ü├¢├£├?├₧├ƒ├á├í├ó├ú
äåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ&-.*$";
有趣的是,“gradlew build”命令(使用javac编译项目)在每个人的机器上都可以正常执行。在某些机器上出现问题的是“gradlew publish”命令(在Mac和Windows上通过或失败)

我不知道这里的关键区别是什么,但我怀疑受影响的用户的Perforce客户端配置错误(未指定P4CHARSET)并将所有项目文件以默认编码同步到他们的机器上。我不清楚如何检查同步时使用的编码性能,所以这只是一个理论。据我所知,即使他们修复了配置,他们仍然需要删除登记并从Performc下载所有内容再次访问服务器以获取所有编码正确的文件(utf16le bom)

不管任何性能问题,责任都落在我身上,因为我是第一个将我们转到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发布插件停止trippin
// Force character encoding in case the workspace was not set up correctly
tasks.withType(Javadoc) {
    options.encoding = 'x-UTF-16LE-BOM'
}