M. *_*tin 4 dependency-management gradle dependency-resolution
我正在创建一个 Gradle 任务,我想在其中下载并引用 Maven 存储库中存在的工件的 jar 文件。具体来说,我计划使用该 jar 的位置作为脚本的参数,通过 Gradle exec任务调用外部脚本。使用 exec 任务很简单;我想弄清楚的是如何在文件系统上获取工件的 jar 文件的位置。
作为一个简单而具体的示例,假设我的 Gradle 项目目录中有以下文件:
构建.gradle:
task myScript(type: Exec) {
executable './my_script.sh'
args jarFilePath // How do I get this value?
}
Run Code Online (Sandbox Code Playgroud)
my_script.sh:
#!/usr/bin/env bash
echo "Jar file location: $1"
Run Code Online (Sandbox Code Playgroud)
如何获取工件 jar 的文件路径,并在必要时从远程存储库下载它?例如,如果它不在我的本地工件缓存中,或者它是更新的快照版本,则应该下载它。
让我们假设我们想要的 jar 文件是guava-26.0-jre.jar
. 以下build.gradle
文件将检索工件(如有必要)并提供文件位置作为脚本的参数:
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.StandardCopyOption
repositories {
mavenCentral()
}
configurations {
myArtifact
}
dependencies {
myArtifact group: 'com.google.guava', name: 'guava',
version: '26.0-jre', transitive: false
}
task myScript(type: Exec) {
Path artifactPath =
temporaryDir.toPath().resolve('guava.jar').toAbsolutePath()
doFirst {
Files.copy(configurations.myArtifact.singleFile.toPath(), artifactPath,
StandardCopyOption.REPLACE_EXISTING)
}
executable './my_script.sh'
args artifactPath.toString()
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为“myArtifact”的自定义配置,它对guava-26.0-jre
. 通过将其标记为transitive: false
任何工件的依赖项都不会包含在配置中,如果它们尚不存在于本地工件缓存中,也不会下载它们。
调用configurations.myArtifact.singleFile
返回java.io.File
对工件的 jar 文件的引用。这个getSingleFile()方法还确保集合中只有一个文件,IllegalStateException
如果有零个或多个,则抛出一个。如果将来配置被错误地错误配置为具有多个工件(例如,如果有人从我们的脚本中删除了“传递”选项),这可以防止引用错误的工件。
所述toAbsolutePath()不需要方法确保路径的脚本是绝对的,并因此相对于任何特定的目录有待解决。
请注意,这是复制神器任务的临时目录中doFirst块,而不是直接引用该文件的路径。这是为了在加载脚本时不需要解析工件。否则,即使在执行不相关的任务时(包括诸如clean
和这样的基本任务),也需要解析(并可能下载)tasks
工件,如果无法解析工件,则会导致构建失败。
该StandardCopyOption.REPLACE_EXISTING
选项用于覆盖先前构建中的任何先前 jar 文件。
归档时间: |
|
查看次数: |
2578 次 |
最近记录: |