当使用maven-publish发布(孵化,我知道)时,compile依赖项被添加到generate POM (在runtime作用域中),但是testCompile依赖项被忽略。
如何将testCompile依赖项作为test作用域添加到生成的POM中?
发布于 2017-06-17 22:58:19
我花了几个小时来找到一种很好的方法来选择工件或出版物应该使用的构建配置,但没有成功。我的发现是,实现它的唯一方法是修改生成的POM XML,如下所示:
// build.gradle
publishing {
repositories { /* skipped for brevity */ }
publications {
core(MavenPublication) {
from components.java
artifactId project.name
artifact sourcesJar {
classifier 'sources'
}
}
generators(MavenPublication) {
from components.java
artifactId "${project.name}-generators"
artifacts = [ generatorsJar ]
artifact generatorsSourcesJar {
classifier 'sources'
}
pom.withXml { pomXml -> replaceDependenciesWith('generatorsBase', pomXml) }
}
}
}
void replaceDependenciesWith(String configurationName, XmlProvider pomXml) {
Node configurationDependencies = new Node(null, 'dependencies')
project.configurations.getByName(configurationName).allDependencies.each { dep ->
Node dependency = new Node(null, 'dependency')
dependency.appendNode('groupId', dep.group)
dependency.appendNode('artifactId', dep.name)
dependency.appendNode('version', dep.version)
dependency.appendNode('scope', 'compile')
configurationDependencies.append(dependency)
}
pomXml.asNode().dependencies*.replaceNode(configurationDependencies)
}以上适用于Gradle 3.3
对Groovy的类似XML构建器的语法的评论
我还尝试使用Groovy builder类语法,但不幸的是,传递给replaceNode方法的闭包附加了错误的上下文,因此它不起作用。内联时,它获得与publications {}闭包相同的上下文,而当提取到方法时,version dep.version不能按预期工作)。
// Does not work!
void replaceDependenciesWith(String configurationName, Node pomXmlNode) {
pomXmlNode.dependencies*.replaceNode {
dependencies {
project.configurations.getByName(configurationName).allDependencies.each { dep ->
dependency {
groupId dep.group
artifactId dep.name
version dep.version
scope 'compile'
}
}
}
}
}发布于 2015-03-03 19:38:52
POM仅在发布工件时使用;它与工件一起上载到Maven存储库。
Gradle独立于您的部署插件执行测试,因此它不使用POM文件。
假设您使用的是Java plugin,它会添加test源码集。这又创建了testCompile任务。
现在,Gradle假设您的运行时依赖项将与您的编译时依赖项相同,如果您没有进行其他配置的话。但是,它只考虑main源集。这就是你的POM不包含test依赖的原因。
然后,快乐地生活,知道发布的工件不会包括您的测试代码或它的依赖项。
dependencies {
testCompile 'org.springframework:spring-test:4.+'
}如果您有一个例外情况,测试是在不能访问测试源代码的机器上执行的,请更详细地描述您的需求是什么。
发布于 2019-10-21 18:16:10
当我需要修改POM时,我无法使用groovy语言的任何特性。我不得不像krzychu's answer一样直接依赖于API。
否则,xml闭包不会像我预期的那样应用,构建会失败并出现一些警告,或者闭包没有正确应用,导致无效的pom。
但是最近,在仔细阅读了groovy's closure文档之后,我注意到可以将resolutionStrategy应用于闭包,以帮助运行时找到正确的上下文(隐含的this)。
默认的解决策略是Closure.OWNER_FIRST,这解释了为什么我在一些试验中遇到关于应用于publications的闭包的错误。从他们的文档中,我尝试将策略设置为Closure.DELEGATE_FIRST,事实证明这是预期的。
注意,但是闭包必须应用于Node,因此.children()返回一个列表,.last()返回一个Node,您可以通过.plus(...)方法或其别名+在其上添加另一个节点。
publishing {
publications {
core(MavenPublication) {
pom.withXml {
def dependenciesNode =
asNode().dependencyManagement
.first()
.dependencies
.first()
dependenciesNode.children().last().plus( {
resolveStrategy = Closure.DELEGATE_FIRST
dependency {
'groupId'('org.springframework.boot')
'artifactId'('spring-boot-dependencies')
'version'(rootProject.'spring-boot.version')
'type'('pom')
'scope'('import')
}
})
}
}
}
}找到正确的语法就像大海捞针一样,这里有一些(1),(2),(3)的链接,它们帮我找到了resolutionStrategy。
https://stackoverflow.com/questions/28813211
复制相似问题