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