在 Maven 领域,任何时候我想简单地获取特定 POM 文件的传递依赖项,我只需打开一个 shell,导航到 POM 所在的位置,然后运行:
mvn dependency:copy-dependencies
并且 boom,Maven 在当前目录中创建一个
target/
目录,并将所有传递获取的 JAR 放置到该位置。
我现在尝试切换到Gradle,但Gradle似乎没有相同的功能。所以我问:Gradle 是否有相当于 Maven 的
copy-dependencies
? 如果有,有人可以提供一个例子吗?如果不是,其他开发人员会认为这是对 Gradle 社区有价值的贡献吗?
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'
}
值得做贡献吗? AS 你可以看到这真的很容易做到,所以我不这么认为。
编辑
从 gradle 4+ 开始,它将是:
task copyDependencies(type: Copy) {
from configurations.default
into 'dependencies'
}
compile 的依赖配置在 gradle 4.x 中已弃用。您需要将其替换为默认值。所以上面的代码片段变成:
dependencies {
implementation 'com.google.inject:guice:4.0-beta5'
}
task copyDependencies(type: Copy) {
from configurations.default
into 'dependencies'
}
这是等效的 Kotlin DSL 版本(添加了 buildDir 前缀以使其复制构建文件夹中的依赖项):
task("copyDependencies", Copy::class) {
from(configurations.default).into("$buildDir/dependencies")
}
使用 Kotlin DSL 与 gradle 6.8+ 一起使用的版本
task("copyDependencies", Copy::class) {
configurations.compileClasspath.get()
.filter { it.extension == "jar" }
.forEach { from(it.absolutePath).into("$buildDir/dependencies") }
}
运行
./gradlew copyDependencies
会将所有jar从编译类路径复制到./build/dependencies
目录中。
可以轻松修改它以使用不同的类路径(或组合多个类路径)并根据需要包含其他过滤器。
任务
copyAllDependencies
在gradle-7.0
为我工作。
这是将依赖项复制到
${buildDir}/output/libs
的示例:
将以下内容添加到
build.gradle
。
task copyAllDependencies(type: Copy) {
from configurations.compileClasspath
into "${buildDir}/output/libs"
}
build.dependsOn(copyAllDependencies)
升级到与 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)
}
}
}
}
}
它一点也不优雅,但至少它可以工作。非常欢迎更简单的版本:-)
这是包含依赖项的另一种方法。对于网络档案来说,这也可能是战争而不是 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) }
}
}
对于那些想要使用 kotlin DSL 来做这件事并且像我一样的 gradle 菜鸟的人来说。这似乎在 gradle 8.10.2 中对我有用
tasks.register<Copy>("saveDependencies") {
from(configurations.runtimeClasspath)
into(layout.buildDirectory.dir("lib"))
}