我最近将一个项目从Maven迁移到Gradle(即:用build.gradle文件替换了pom.xml文件)。由于我的公司仍有几个下游Maven项目依赖于它,因此我们必须继续发布一个pom文件以及类、源代码和javadoc JAR到我们的Nexus存储库,以便下游项目仍然可以将此项目作为Maven依赖项使用。这就是Gradle中'maven-publish'插件的作用。以下是我的build.gradle文件中针对'maven-publish'插件的配置:
这将生成一个Gradle“publish”任务,该任务将生成所需的pom.xml文件以及类、源代码和javadoc JAR包。完成后,它将将JAR包发布到“build-test-snapshot”Nexus存储库。
在我的电脑以及我们的构建服务器上以及大多数同事的电脑上,这完全正常运行。然而,一些同事抱怨说,“gradlew publish”命令(请注意,项目中已包含Gradle 2.4包装程序)失败,并显示此类错误:
有趣的是,“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”任务编码的片段:
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插件停止因文件编码问题出错吗?