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“发布”任务,该任务将生成所需的 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 中指定“编译”任务的编码:

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

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

我还能尝试什么让 Gradle maven-publish 插件停止绊倒文件编码?

4

1 回答 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。

于 2015-06-25T18:00:03.360 回答