gpt4 book ai didi

java - 如何以编程方式在 Gradle 中添加传递依赖项?

转载 作者:行者123 更新时间:2023-12-03 03:16:52 27 4
gpt4 key购买 nike

我对 Gradle 非常(非常)陌生,我正在评估在我当前雇主的 Scala 项目中从 SBT 切换到 Gradle 的潜在好处。因此,我不希望立即将整个构建转换为 Gradle,但似乎应该可以动态地基于 Gradle 构建(atm,主要是编译器标志和具有全局版本的依赖项)。这样我不会不必要地增加同事的认知负担,但同时我不会冒我的构建滞后或与 pom 文件中的“规范”配置冲突的风险。
这是我目前的build.gradle (到目前为止,我才开始处理依赖关系):

def dependencyVersions = [:]
new XmlSlurper().parse('pom.xml').dependencyManagement.dependencies.dependency.each {
dependencyVersions["${it.groupId}:${it.artifactId}"] = it.version.text()
}

allprojects {
group = 'my.org'
version = 'latest-SNAPSHOT'
}

subprojects {
apply plugin: 'java'
apply plugin: 'scala'

repositories {
mavenLocal()
maven {
url = uri('https://repo.maven.apache.org/maven2')
}
}

dependencies {
implementation 'org.scala-lang:scala-library:2.13.3'

// ... Global deps ...

new XmlSlurper().parse("$projectDir/pom.xml").dependencies.dependency.each {
if(it.groupId.text() == 'my.org') {
add('implementation', project(":${it.artifactId}"))
} else {
def version = it.version.text() ? it.version.text() : dependencyVersions["${it.groupId}:${it.artifactId}"]
def dep = "${it.groupId}:${it.artifactId}:${version}"
def scope = it.scope.text() ? it.scope.text() : 'compile'
if(scope == 'compile')
add('implementation', dep)
else if(scope == 'test') {
add('testImplementation', dep)
} else {
throw new Exception("Unrecognized dependency scope: $scope")
}
}
}
}

sourceCompatibility = '1.8'

tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
}
以上几乎可以工作。应该添加直接依赖项,但问题是传递依赖项在编译时不可用。如何配置子项目,以便解析任何传递依赖项并将其添加到子项目中?

最佳答案

如果您打算将一个模块/子项目用作另一个子项目/项目的依赖项或库,那么您应该使用 Java Library plugin而不是 Java plugin
使用 Java 库插件,您将可以访问 api配置。您可以阅读有关 implementation 的更多信息对比 apiAPI and implementation separation文档。
所以你的 Gradle 文件可能是:

dependencies {
implementation 'org.scala-lang:scala-library:2.13.3'

// ... Global deps ...

new XmlSlurper().parse("$projectDir/pom.xml").dependencies.dependency.each {
if(it.groupId.text() == 'my.org') {
add('api', project(":${it.artifactId}"))
} else {
def version = it.version.text() ? it.version.text() : dependencyVersions["${it.groupId}:${it.artifactId}"]
def dep = "${it.groupId}:${it.artifactId}:${version}"
def scope = it.scope.text() ? it.scope.text() : 'compile'
if(scope == 'compile')
add('api', dep)
else if(scope == 'test') {
add('testImplementation', dep)
} else {
throw new Exception("Unrecognized dependency scope: $scope")
}
}
}
}
这里唯一不同的是从 implementation 切换。至 api .

关于java - 如何以编程方式在 Gradle 中添加传递依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63330012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com