Gradle发布带有不同分类器的JAR包,依赖项丢失。

3

Gradle新的maven-publish插件:

对于具有不同分类器的多个JAR文件,例如:

源集

src/foo/java
src/bar/java

dependencies {
    fooCompile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    barCompile sourceSets.foo.output
}

需要构建的Jars:

productName-1.0-foo.jar
productName-1.0-bar.jar

bar.jar 依赖于 foo jar 的编译。

Gradle:

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId 'com.example'
            artifactId 'productName'
            version '1.0'

            artifact fooJar {
                classifier 'foo'
            }

            artifact barJar {
                classifier 'bar'
            }
        }
    }

    publishing {
        repositories {
            maven {
                url "$buildDir/repo"
            }
        }
    }
}

已发布的代码库:

build/repo/com/example/productName/1.0/productName-1.0-foo.jar
build/repo/com/example/productName/1.0/productName-1.0-bar.jar
build/repo/com/example/productName/1.0/productName-1.0.pom

只有一个POM文件,没有任何依赖。

现在将其分离为不同的artifactId(s)。

publishing {
    publications {
        foo(MavenPublication) {
            groupId 'com.example'
            artifactId 'productName-foo'
            version '1.0'

            artifact fooJar {

            }
        }

        bar(MavenPublication) {
            groupId 'com.example'
            artifactId 'productName-bar'
            version '1.0'

            artifact barJar {

            }
        }
    }

    publishing {
        repositories {
            maven {
                url "$buildDir/repo"
            }
        }
    }
}

每个 Jar 都有自己的 POM 文件:

build/repo/com/example/productName-foo/1.0/productName-foo-1.0.jar
build/repo/com/example/productName-foo/1.0/productName-foo-1.0.pom

build/repo/com/example/productName-bar/1.0/productName-bar-1.0.jar
build/repo/com/example/productName-bar/1.0/productName-bar-1.0.pom

两个问题:

  1. 分类器(foo,bar)不在jar名称后面。
  2. 为foo和bar生成的POM.xml文件没有依赖关系。

你解决了吗? - Denis Itskovich
我相信我也遇到了同样的问题:https://github.com/gradle/gradle/issues/21038 - Vojtěch
@eastwater你是怎么解决这个问题的? - Vojtěch
不要为foo和bar单独拥有pom文件。因此,pom文件内的依赖关系将无法工作。 - eastwater
1个回答

0

这里是一种适用于我个人的替代方法,类似的方法可能也适用于你:

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'  
    from sourceSets.main.allSource
}
// If needed the javadoc task can be commented, comment javadoc from artifacts and publish as well.
task javadocJar(type: Jar, dependsOn: javadoc){
    classifier = 'javadoc'
    from javadoc.destinationDir
}

task testJar(type: Jar, dependsOn: testClasses) {
    from sourceSets.test.output
    appendix 'test'
}

artifacts{
    archives sourcesJar
    archives javadocJar
    archives testJar
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
            artifact sourcesJar
            artifact javadocJar
        }
        mavenTest(MavenPublication) {
            artifactId project.name + "-test"
            artifact testJar {
                appendix 'test'
            }
        }
    }
}

artifactory {
    publish {
        defaults {
            publications ('mavenJava', 'mavenTest')
        }
    }
}

这在发布时很有用,但当您想在项目内部链接测试工件而不从已发布的Maven存储库中读取它时,它是无效的。 - Vojtěch
你可能对使用testFixtures而不是手动构建'testJar'感兴趣。请参阅https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures。 - Ludovic Ronsin

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