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

时间:2014-11-02 09:48:19

标签: maven gradle dependency-management

在Maven-land中,只要我想简单地删除特定POM文件的传递依赖关系,我只需打开一个shell,导航到POM所在的位置,然后运行:

mvn dependency:copy-dependencies

繁荣,Maven在当前目录中创建一个target/目录,并将所有可传递获取的JAR放置到该位置。

我现在尝试切换到Gradle,但Gradle似乎没有相同的功能。所以我问: Gradle是否与Maven的copy-dependencies相当?如果是,有人可以提供一个例子吗?如果没有,其他开发人员会发现这对Gradle社区有价值吗?

5 个答案:

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

它一点也不优雅,但至少它是有效的。非常欢迎更简单的版本:-)