首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle maven-publish:如何将testCompile依赖添加到生成的pom中?

Gradle maven-publish:如何将testCompile依赖添加到生成的pom中?
EN

Stack Overflow用户
提问于 2015-03-02 23:17:24
回答 3查看 1.8K关注 0票数 3

当使用maven-publish发布(孵化,我知道)时,compile依赖项被添加到generate POM (在runtime作用域中),但是testCompile依赖项被忽略。

如何将testCompile依赖项作为test作用域添加到生成的POM中?

EN

回答 3

Stack Overflow用户

发布于 2017-06-17 22:58:19

我花了几个小时来找到一种很好的方法来选择工件或出版物应该使用的构建配置,但没有成功。我的发现是,实现它的唯一方法是修改生成的POM XML,如下所示:

代码语言:javascript
复制
// 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不能按预期工作)。

代码语言:javascript
复制
// 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'
                }
            }
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-03-03 19:38:52

POM仅在发布工件时使用;它与工件一起上载到Maven存储库。

Gradle独立于您的部署插件执行测试,因此它不使用POM文件。

假设您使用的是Java plugin,它会添加test源码集。这又创建了testCompile任务。

现在,Gradle假设您的运行时依赖项将与您的编译时依赖项相同,如果您没有进行其他配置的话。但是,它只考虑main源集。这就是你的POM不包含test依赖的原因。

然后,快乐地生活,知道发布的工件不会包括您的测试代码或它的依赖项。

代码语言:javascript
复制
dependencies {
    testCompile 'org.springframework:spring-test:4.+'
}

如果您有一个例外情况,测试是在不能访问测试源代码的机器上执行的,请更详细地描述您的需求是什么。

票数 1
EN

Stack Overflow用户

发布于 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(...)方法或其别名+在其上添加另一个节点。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28813211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档