在Maven-land中,只要我想简单地删除特定POM文件的传递依赖关系,我只需打开一个shell,导航到POM所在的位置,然后运行:
mvn dependency:copy-dependencies
繁荣,Maven在当前目录中创建一个target/
目录,并将所有可传递获取的JAR放置到该位置。
我现在尝试切换到Gradle,但Gradle似乎没有相同的功能。所以我问: Gradle是否与Maven的copy-dependencies
相当?如果是,有人可以提供一个例子吗?如果没有,其他开发人员会发现这对Gradle社区有价值吗?
答案 0 :(得分:21)
gradle中没有copy-dependencies
的等价物,但这是一个完成任务的任务:
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile 'com.google.inject:guice:4.0-beta5'
}
task copyDependencies(type: Copy) {
from configurations.compile
into 'dependencies'
}
是否值得做出贡献?你可以看到它真的很容易,所以我不这么认为。
答案 1 :(得分:8)
在gradle 4.x中不推荐使用compile的依赖配置。您需要将其替换为默认值。因此,上面的代码片段变为:
dependencies {
implementation 'com.google.inject:guice:4.0-beta5'
}
task copyDependencies(type: Copy) {
from configurations.default
into 'dependencies'
}
答案 2 :(得分:3)
这是等效的Kotlin DSL版本(添加了buildDir前缀以使其复制build文件夹中的依赖项):
task("copyDependencies", Copy::class) {
from(configurations.default).into("$buildDir/dependencies")
}
答案 3 :(得分:0)
这是包含依赖项的另一种方法。对于网络存档,这也可能是战争而不是jar。
dependencies {
implementation 'my.group1:my-module1:0.0.1'
implementation 'my.group2:my-module2:0.0.1'
}
jar {
from {
configurations.compileClasspath.filter { it.exists() }.collect { it.isDirectory() ? it : zipTree(it) }
}
}
答案 4 :(得分:0)
在升级到适用于 Gradle 6.1.1 的 Android Gradle 插件 4.0.1 后,此处提供的答案对我不起作用。这是我目前使用的版本:
task copyPluginDependencies {
doLast {
def dependencies = []
buildscript.configurations.classpath.each { dependency ->
dependencies.add(dependency)
}
dependencies.unique().each { dependency ->
println(dependency.absolutePath)
copy {
from dependency.absolutePath
into 'app/dependencies'
eachFile { details ->
String dependencyPath = dependency.absolutePath
Pattern regexPattern = Pattern.compile("(^.*caches)(.*)")
Matcher regexMatcher = regexPattern.matcher(dependencyPath)
if(regexMatcher.find()) {
// results in the dependency path starting from Gradle's caches folder
dependencyPath = regexMatcher.group(2)
}
details.setRelativePath new RelativePath(true, dependencyPath)
}
}
}
}
}
它一点也不优雅,但至少它是有效的。非常欢迎更简单的版本:-)