Gradle Maven插件为自定义配置生成不正确的POM依赖项
我有一个Gradle项目,它做了两件正交的事情:Gradle Maven插件为自定义配置生成不正确的POM依赖项,maven,gradle,Maven,Gradle,我有一个Gradle项目,它做了两件正交的事情: 编译并运行一些Java 生成并发布工件 这个工件与Java无关;它由一个自定义JavaExec任务生成。然而,自动生成的POM(来自Maven插件)似乎包含了错误的依赖项问题:我如何防止这种情况发生? 我的build.gradle看起来像这样: ./gradlew uploadFoo apply插件:“java” 应用插件:“maven” 配置{ foo//我要构建和发布的工件的自定义配置 } //Java配置的依赖关系(与foo无关) 依赖关
./gradlew uploadFoo
apply插件:“java”
应用插件:“maven”
配置{
foo//我要构建和发布的工件的自定义配置
}
//Java配置的依赖关系(与foo无关)
依赖关系{
编译“foo:foo:1.1”
testCompile“bar:bar:2.2”
}
//自定义任务
任务生成器fo(类型:JavaExec){
ext.outputFile=新文件(buildDir,“foo.bar”)
...
}
人工制品{
foo文件:generateFoo.outputFile,buildby:generateFoo
}
上传{
存储库{
mavenDeployer{…}
}
}
我这样调用Gradle:
./gradlew uploadFoo
AFAICS中,foo
配置与Java配置无关。因此,我希望发布的POM不会列出任何依赖项。但是,我观察列出的所有不相关的依赖项
Gradle为Maven插件编写了文档,但我完全不清楚我应该用它做什么(如果有的话)
注意:我使用的是Gradle包装器1.6;我将尝试最新的,看看这是否有区别。。。
我设法用
maven
和maven publish
gradle插件设置了类似的配置
在我的例子中,我使用自定义配置的自定义Jar任务,但它应该可以工作,因为工件{…}
在这两种情况下都使用
使用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'
...
}
}
}
此解决方案的灵感来自以下线索:请注意这一行:
addMapping(300, configurations.foo, 'runtime')
您还可以添加其他配置,或者使用“运行时”范围以外的其他maven范围。300代表优先权,在本例中并不重要 此解决方案的优点是,我们可以很好地控制依赖项及其映射。缺点是这不适用于
安装
任务。我们需要为安装任务设置不同的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任务
将为您提供可能的发布命令:
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
alternative的优点是,它将适用于本地和远程maven存储库。缺点可能是我们使用的内部API将来可能会更改,并且所有依赖项都映射到“runtime”maven范围。此外,如果我们想使用其他一些maven范围或应用一些范围映射,MavenPublication片段将更加详细,并且将使用更多的内部API
我使用的是Gradle 1.10我设法用
maven
和maven publish
Gradle插件设置了类似的配置
在我的例子中,我使用自定义配置的自定义Jar任务,但它应该可以工作,因为工件{…}
在这两种情况下都使用
使用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'
...
}
}
}
此解决方案的灵感来自以下线索:请注意这一行:
addMapping(300, configurations.foo, 'runtime')
您还可以添加其他配置,或者使用“运行时”范围以外的其他maven范围。300代表优先权,在本例中并不重要 此解决方案的优点是,我们可以很好地控制依赖项及其映射。缺点是这不适用于
安装
任务。我们需要为安装任务设置不同的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任务
将为您提供可能的发布命令:
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
alternative的优点是,它将适用于本地和远程maven存储库。缺点可能是我们使用的内部API将来可能会更改,并且所有依赖项都映射到“runtime”maven范围。此外,如果我们想使用其他一些maven范围或应用一些范围映射,MavenPublication片段将更加详细,并且将使用更多的内部API
我使用的是Gradle 1.10问题可能与应用
java
插件有关。可能有一个解决办法,但我不能马上说是什么。新的maven publish
插件提供了更多的控制(但仍在酝酿中)。你可能想先试试。@PeterNiederwieser:谢谢你的提示,我会尝试找出新的插件,让你知道它是否能解决问题。(仅供参考,如果我使用groovy
插件而不是java
插件,上述问题也会发生。)应用groovy
也适用java
。问题可能与应用java
插件有关。可能有一个解决办法,但我不能马上说是什么。新的maven publish
插件提供了更多的控制(但仍在酝酿中)。你可能想先试试。@PeterNiederwieser:谢谢你的提示,我会尝试找出新的插件,让你知道它是否能解决问题。(仅供参考,如果我使用groovy
插件而不是java
插件,上述问题也会发生。)应用groovy
也适用java
。