Gradle 相当于 Maven 的“复制依赖项”?

问题描述 投票:0回答:8

在 Maven 领域,任何时候我想简单地获取特定 POM 文件的传递依赖项,我只需打开一个 shell,导航到 POM 所在的位置,然后运行:

mvn dependency:copy-dependencies

并且 boom,Maven 在当前目录中创建一个

target/
目录,并将所有传递获取的 JAR 放置到该位置。

我现在尝试切换到Gradle,但Gradle似乎没有相同的功能。所以我问:Gradle 是否有相当于 Maven 的

copy-dependencies
如果有,有人可以提供一个例子吗?如果不是,其他开发人员会认为这是对 Gradle 社区有价值的贡献吗?

maven gradle dependency-management
8个回答
40
投票

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'
}

19
投票

compile 的依赖配置在 gradle 4.x 中已弃用。您需要将其替换为默认值。所以上面的代码片段变成:

dependencies {
  implementation 'com.google.inject:guice:4.0-beta5'
}
task copyDependencies(type: Copy) {
  from configurations.default
  into 'dependencies'
}

16
投票

这是等效的 Kotlin DSL 版本(添加了 buildDir 前缀以使其复制构建文件夹中的依赖项):

task("copyDependencies", Copy::class) {
    from(configurations.default).into("$buildDir/dependencies")
}

2
投票

使用 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
目录中。 可以轻松修改它以使用不同的类路径(或组合多个类路径)并根据需要包含其他过滤器。


2
投票

任务

copyAllDependencies
gradle-7.0
为我工作。

这是将依赖项复制到

${buildDir}/output/libs
的示例:

将以下内容添加到

build.gradle

task copyAllDependencies(type: Copy) {
    from configurations.compileClasspath
    into "${buildDir}/output/libs"
}
build.dependsOn(copyAllDependencies)

1
投票

升级到与 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)
        }
      }
    }
  }
}

它一点也不优雅,但至少它可以工作。非常欢迎更简单的版本:-)


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) }
    }
}

0
投票

对于那些想要使用 kotlin DSL 来做这件事并且像我一样的 gradle 菜鸟的人来说。这似乎在 gradle 8.10.2 中对我有用

tasks.register<Copy>("saveDependencies") {
    from(configurations.runtimeClasspath)
    into(layout.buildDirectory.dir("lib"))
}
© www.soinside.com 2019 - 2024. All rights reserved.