我有一个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 { ... }
}
}
我像这样调用Gradle:
./gradlew uploadFoo
AFAICS,foo
配置与Java配置无关。所以我期望已发布的POM列出没有依赖项。但是,我观察列出的所有无关的依赖项。
Maven插件hint at dependency mapping with conf2ScopeMappings
的Gradle文档,但我完全不清楚我应该做些什么(如果有的话)。
<小时/> <子> 注意:我使用的是Gradle wrapper 1.6;我会尝试最新的,看看是否有所作为...... 子>
答案 0 :(得分:5)
我设法使用maven
和maven-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