Java 如何将已解析的依赖项复制到新位置,并根据依赖项详细信息动态创建目录

Java 如何将已解析的依赖项复制到新位置,并根据依赖项详细信息动态创建目录,java,gradle,Java,Gradle,我有一个Java应用程序,它要求依赖项存储在特定的位置(也就是说,gradle仅仅解析它们并将它们添加到类路径是不够的)。这是一个不幸的应用程序设计,但我无法改变 我使用Gradle(必需)解决依赖关系,如下所示: configurations { myDeps } dependencies { myDeps group: 'foo.bar', name: 'baz', version: '1.0.0' } 并使用复制任务将它们复制到某个位置: task copyDeps(type:

我有一个Java应用程序,它要求依赖项存储在特定的位置(也就是说,gradle仅仅解析它们并将它们添加到类路径是不够的)。这是一个不幸的应用程序设计,但我无法改变

我使用Gradle(必需)解决依赖关系,如下所示:

configurations {
  myDeps
}

dependencies {
  myDeps group: 'foo.bar', name: 'baz', version: '1.0.0'
}
并使用复制任务将它们复制到某个位置:

task copyDeps(type: Copy) {
  from configurations.myDeps
  into "copyLocation"
}
但是,这会导致所有依赖项都存储在“copyLocation”中,例如:
copyLocation/baz-1.0.0.jar
我实际需要的是将它们存储在如下结构中:
copyLocation/foo/bar/baz/1.0.0/baz-1.0.0.jar

我尝试使用
eachFile
方法动态设置路径,但是传递给闭包的
FileCopyDetails
只包含对文件名的引用(
baz-1.0.0.jar

FileCopyDetails
toString()
包含检索依赖项的显式路径(因此包含我需要的所有信息),但是正则表达式将是脆弱的,因为它可以来自多个源,并且会因用户的机器而异,例如: 它可能是从我本地的Gradle缓存里来的

C:\Users\myUser\.gradle\caches\modules-2\files-2.1\foo.bar\baz\1.0.0\15d703651587fad0bb9d5s8c7b28d8b3b6a91x99\baz-1.0.0.jar
或者我的本地Maven存储库

C:\whatever\path\to\myMavenRepo\foo\bar\baz\1.0.0\baz-1.0.0.jar

谢谢你的帮助

使用以下命令下载jar并在您的位置安装jar-

Plug in repositories : add repositories in your grade build file.
command  : mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

好的,根据我对问题的理解,下面这个gralde任务可以帮助你

task copyDependencies(type: Copy) {
    from("$buildDir/outputs/jar") {
        include "*.jar"
    }
    into file("${rootProject.projectDir}/CustomFolderPath/")
}

build.finalizedBy(copyDependencies)

请让我知道它是否有帮助或需要更多的帮助

如果我理解正确,您希望将声明的依赖项的工件(jar文件)复制到一个镜像Maven布局的文件夹中

一种方法是使用
Configuration.resolvedConfiguration
并在工件上循环。下面是一个示例(使用Groovy DSL):


请注意,我使用了
Sync
任务而不是
Copy
,以确保旧文件在从配置中删除时将从文件夹中删除。

。我正在使用Gradle(根据我的示例)管理这个项目,而不是Maven。请检查并确认。我有数百个依赖项需要解决,我不打算使用维护Maven配置以及我的Gradle项目。无论如何谢谢。你能给我一个你想要的应用程序的粗略设计吗!!!比如下载依赖项并将该
依赖项
复制到
特定文件夹
中,而不是在
中的某个地方else@DupinderSingh-我不太清楚你在说什么,或者多余的感叹号是干什么用的。正如我在问题中所述,我的应用程序要求依赖项(JAR文件)位于特定位置-我无法更改。谢谢@Bjørn Vester-我最终发现了
resolvedConfiguration
,它的子对象最终为我提供了所需的所有信息(组/名称/版本/扩展名)。你的解决方案比我想的要简单一些,所以我想我会在两者之间找到一些东西。我还将使用
Sync
任务,这正是您所说的原因。再次感谢!首先,我不确定
JAR
如何进入
“$buildDir/outputs/JAR”
,需要根据依赖元数据动态设置
CustomFolderPath
。我现在已经接受了这个问题的答案。无论如何,谢谢你。
task copyDependencies(type: Copy) {
    from("$buildDir/outputs/jar") {
        include "*.jar"
    }
    into file("${rootProject.projectDir}/CustomFolderPath/")
}

build.finalizedBy(copyDependencies)
task copyDeps(type: Sync) {
    configurations.myDeps.resolvedConfiguration.resolvedArtifacts.each {
        def id = it.moduleVersion.id
        def groupFolders = id.group.replaceAll(/\./, "/")
        from(it.file) {
            into "$groupFolders/${id.name}/${id.version}/"
        }
        into "$buildDir/copyLocation"
    }
}