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

时间:2013-12-11 00:57:14

标签: maven gradle

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

  1. 编译并运行一些Java。
  2. 生成并发布工件。
  3. 这个工件与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插件hint at dependency mapping with conf2ScopeMappings的Gradle文档,但我完全不清楚我应该做些什么(如果有的话)。

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

1 个答案:

答案 0 :(得分:5)

我设法使用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任务。我们需要为安装任务设置不同的pom,这可能是可能的,但这是我所不知道的。

替代使用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,这可能会在将来发生变化,并且所有依赖关系都会映射到运行时&#39; maven范围。此外,如果我们想要使用其他maven范围或应用一些范围映射,MavenPublication片段将更加冗长,并且将使用更多内部API。

我正在使用Gradle 1.10