我有一个Gradle项目,它做了几个正交的事情:
这个工件与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 { ... }
}
}
Run Code Online (Sandbox Code Playgroud)
我像这样调用Gradle:
./gradlew uploadFoo
Run Code Online (Sandbox Code Playgroud)
AFAICS,foo配置与Java配置无关.所以我希望发布的POM列出没有依赖关系.但是,我观察到列出的所有不相关的依赖项.
Maven插件的Gradle文档提示依赖映射conf2ScopeMappings,但我完全不清楚我应该用它做什么(如果有的话).
我设法用gradle插件maven和maven-publishgradle插件设置类似的配置.
在我的情况下,我使用自定义配置的自定义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'
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
此解决方案的灵感来自以下主题:http:
//gradle.1045684.n5.nabble.com/pom-generation-and-inherited-dependencies-td1436197.html
注意这一行:
addMapping(300, configurations.foo, 'runtime')
Run Code Online (Sandbox Code Playgroud)
您也可以添加其他配置,或使用除"运行时"范围之外的其他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 { ... }
}
}
Run Code Online (Sandbox Code Playgroud)
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.
...
Run Code Online (Sandbox Code Playgroud)
maven-publish备选方案的优点是它适用于本地和远程maven存储库.缺点可能是我们正在使用内部API,这可能在将来发生变化,并且所有依赖项都映射到"运行时"maven范围.此外,如果我们想要使用其他maven范围或应用一些范围映射,MavenPublication片段将更加冗长并且将使用更多内部API.
我正在使用Gradle 1.10