maven - Gradle Maven 插件为自定义配置生成不正确的 POM 依赖项

标签 maven gradle

我有一个 Gradle 项目,它做一些正交的事情:

  1. 编译并运行一些 Java。
  2. 生成并发布 Artifact 。

此 Artifact 与 Java 无关;它由自定义 JavaExec 任务生成。但是,自动生成的 POM(来自 Maven 插件)似乎包含错误的依赖项。 问题:如何防止这种情况发生?

我的 build.gradle 看起来像这样:

apply plugin: "java"
apply plugin: "maven"

configurations {
    foo  // Custom configuration for the artifact I want to build and publish
}

// Dependencies for Java configurations (nothing to do with foo)
dependencies {
    compile "foo:foo:1.1"
    testCompile "bar:bar:2.2"
}

// Custom task
task generateFoo(type: JavaExec) {
    ext.outputFile = new File(buildDir, "foo.bar")
    ...
}

artifacts {
    foo    file: generateFoo.outputFile, builtBy: generateFoo
}

uploadFoo {
    repositories {
        mavenDeployer { ... }
    }
}

我这样调用 Gradle:

./gradlew uploadFoo

AFAICS,foo 配置与 Java 配置无关。所以我期望发布的 POM 不列出任何依赖项。但是,我观察列出的所有不相关依赖项。

Maven 插件的 Gradle 文档 hint at dependency mapping with conf2ScopeMappings ,但我完全不清楚我应该用它做什么(如果有的话)。


<子> 注意:我使用的是 Gradle wrapper 1.6;我会尝试最新的,看看这是否有所作为......

最佳答案

我设法使用 mavenmaven-publish gradle 插件设置了类似的配置。

在我的例子中,我使用了带有自定义配置的自定义 Jar 任务,但它应该可以工作,因为在这两种情况下都使用了 artifacts { ... }

使用 maven 插件,您的 build.gradle 将如下所示:

apply plugin: "java"
apply plugin: "maven"

configurations {
    foo  // Custom configuration for the artifact I want to build and publish
}

// Dependencies for Java configurations (nothing to do with foo)
dependencies {
    compile "foo:foo:1.1"
    testCompile "bar:bar:2.2"
}

// Custom task
task generateFoo(type: JavaExec) {
    ext.outputFile = new File(buildDir, "foo.bar")
    ...
}

artifacts {
    foo    file: generateFoo.outputFile, builtBy: generateFoo
}

uploadFoo {
    repositories {
        mavenDeployer { 
            pom.scopeMappings.with {
                mappings.clear()
                addMapping(300, configurations.foo, 'runtime')
            }
            pom.artifactId = 'other artifact id than main jar'
            ... 
        }
    }
}

此解决方案的灵感来自于以下线程:
http://gradle.1045684.n5.nabble.com/pom-generation-and-inherited-dependencies-td1436197.html

注意这一行:

addMapping(300, configurations.foo, 'runtime')

您也可以添加其他配置,或者使用除“运行时”范围之外的其他 Maven 范围。
300代表优先级,在本例中并不重要。

这个解决方案的优点是我们可以很好地控制依赖关系及其映射。缺点是这不适用于 install 任务。我们需要为安装任务设置不同的 poms,这可能是可能的,但这超出了我的知识范围。

使用 maven-publish 插件的替代方法:

apply plugin: "java"
apply plugin: "maven-publish"

configurations {
    foo  // Custom configuration for the artifact I want to build and publish
}

// Dependencies for Java configurations (nothing to do with foo)
dependencies {
    compile "foo:foo:1.1"
    testCompile "bar:bar:2.2"
}

// Custom task
task generateFoo(type: JavaExec) {
    ext.outputFile = new File(buildDir, "foo.bar")
    ...
}

artifacts {
    foo    file: generateFoo.outputFile, builtBy: generateFoo
}

publishing {
    publications {
        foo(MavenPublication) {
            from new org.gradle.api.internal.java.JavaLibrary(\
                configurations.api.artifacts.toArray()[0], \
                configurations.api.allDependencies)
            artifactId 'other artifact id than main jar'
        }
    }
    repositories {
        maven { ... }
    }
}

gradle tasks 将为您提供可能的发布命令:

publish - Publishes all publications produced by this project.
publishFooPublicationToMavenLocal - Publishes Maven publication 'foo' to the local Maven repository.
publishFooPublicationToMavenRepository - Publishes Maven publication 'foo' to Maven repository 'maven'.
publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache.
...

maven-publish 替代方案的优势在于它适用于本地和远程 maven 存储库。缺点可能是我们使用的内部 API 可能会在未来发生变化,并且所有依赖项都映射到“运行时”maven 范围。如果我们想使用其他一些 Maven 范围或应用一些范围映射,MavenPublication 片段也会更加冗长并且会使用更多内部 API。

我正在使用 Gradle 1.10

关于maven - Gradle Maven 插件为自定义配置生成不正确的 POM 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508542/

相关文章:

java - Maven : Custom . jar 在引用时未解析正确的依赖关系

java - Jersey 1.6 和 Spring 3.0.5 使用 Maven

eclipse - 如何仅编译 gwt 模块的更改部分?

java - 将AAR指向自身而不是Maven版本

android - 如何结合构建类型和 flavor 来获得构建变体调试<Flavor>

java - 为什么Android是:Run Gradle task being executed during Desktop:Run task in IntelliJ 2016. 2?

android - gradle 执行检查时避免 lint

java - 在 DigitalOcean 上将 war 部署到 tomcat 时出错

java - Maven 不在代理后面下载 jar

android - java.util.zip.ZipException Android Studio