【发布时间】:2013-11-20 20:41:12
【问题描述】:
我有一个包含多个包的 gradle 项目。构建后,每个包都会在 build/libs 中生成其 jar 文件。外部 jar 依赖项被拉入 ~/.gradle。我现在想从命令行使用适当的类路径在本地运行该服务。为此,我正在编写一个构建类路径的脚本。问题是脚本不理解所有外部依赖项,因此无法构造类路径。有没有办法让 gradle 帮助解决这个问题?理想情况下,我想在构建结束时将所有依赖项转储到一个文件夹中。
【问题讨论】:
我有一个包含多个包的 gradle 项目。构建后,每个包都会在 build/libs 中生成其 jar 文件。外部 jar 依赖项被拉入 ~/.gradle。我现在想从命令行使用适当的类路径在本地运行该服务。为此,我正在编写一个构建类路径的脚本。问题是脚本不理解所有外部依赖项,因此无法构造类路径。有没有办法让 gradle 帮助解决这个问题?理想情况下,我想在构建结束时将所有依赖项转储到一个文件夹中。
【问题讨论】:
首先,如果可以的话,我建议使用application plugin,因为它已经解决了这个问题。
如果您想自己将类路径转储到文件中,最简单的方法是:
task writeClasspath << {
buildDir.mkdirs()
new File(buildDir, "classpath.txt").text = configurations.runtime.asPath + "\n"
}
如果你想真正将类路径上的所有库复制到一个目录中,你可以这样做:
task copyDependencies(type: Copy) {
from configurations.runtime
into new File(buildDir, "dependencies")
}
【讨论】:
你可以在你的构建脚本中尝试这样的事情:
// add an action to the build task that creates a startup shell script
build << {
File script = file('start.sh')
script.withPrintWriter {
it.println '#!/bin/sh'
it.println "java -cp ${getRuntimeClasspath()} com.example.Main \"\$@\""
}
// make it executable
ant.chmod(file: script.absolutePath, perm: 'u+x')
}
String getRuntimeClasspath() {
sourceSets.main.runtimeClasspath.collect { it.absolutePath }.join(':')
}
【讨论】:
sourceSets.main.runtimeClasspath 基本上是一个FileCollection,其中包含引用 1) 构建输出文件夹(build/classes/main、build/references/main 等)和 2) 任何存储库中的外部 jar 依赖项的文件对象在。您可以轻松地遍历此集合并将 jar 复制到 aribtrary 文件夹中。