【发布时间】:2011-03-25 15:21:04
【问题描述】:
在 Windows 环境中运行 groovyc 时,在我的情况下,由于类路径的长度,我遇到了问题。我想通过创建一个路径 jar 来解决这个问题,然后将该 jar 放在 cp.jar 上。如何使用 gradle 中自动指定的所有类路径条目创建一个路径 jar,然后将该 jar 添加到 cp?
【问题讨论】:
在 Windows 环境中运行 groovyc 时,在我的情况下,由于类路径的长度,我遇到了问题。我想通过创建一个路径 jar 来解决这个问题,然后将该 jar 放在 cp.jar 上。如何使用 gradle 中自动指定的所有类路径条目创建一个路径 jar,然后将该 jar 添加到 cp?
【问题讨论】:
这是一个经过测试的解决方案:
task pathingJar(type: Jar) {
appendix = "pathing"
doFirst {
manifest {
attributes "Class-Path": configurations.compile.files.join(" ")
}
}
}
compileGroovy {
dependsOn(pathingJar)
classpath = files(pathingJar.archivePath)
}
根据您的具体要求,您可能需要稍微调整一下。例如,如果您有使用 Groovy 编写的测试,您还需要一个路径 Jar 用于测试编译类路径。在这种情况下,您需要重复上述配置,如下所示:
task testPathingJar(type: Jar) {
appendix = "testPathing"
doFirst {
manifest {
attributes "Class-Path": configurations.testCompile.files.join(" ")
}
}
}
compileTestGroovy {
dependsOn(testPathingJar)
classpath = files(testPathingJar.archivePath)
}
【讨论】:
我终于得到了“pathing jar”的想法。我认为这是一个永久的解决方法。如果它是 gradle 本身的一部分,这可以被认为是一种解决方案。
最初的路径 jar 代码是由 Peter 提供的,但它不起作用。问题:路径 jar 中引用的类路径元素必须相对于路径 jar 的位置。所以,这似乎对我有用。
task pathingJar(type: Jar , dependsOn: 'cleanPathingJar') {
/**
* If the gradle_user_home env var has been set to
* C:\ on a Win7 machine, we may not have permission to write the jar to
* this directory, so we will write it to the caches subdir instead.
* This assumes a caches subdir containing the jars
* will always exist.
*/
gradleUserHome = new File(gradle.getGradleUserHomeDir(), "caches")
relativeClasspathEntries = configurations.compile.files.collect {
new File(gradleUserHome.getAbsolutePath()).toURI().
relativize(new File(it.getAbsolutePath()).toURI()).getPath()
}
appendix = "pathing"
destinationDir = gradleUserHome
doFirst {
manifest {
attributes "Class-Path": relativeClasspathEntries.join(" ")
}
}
}
compileGroovy {
dependsOn(pathingJar)
classpath = files(pathingJar.archivePath)
}
【讨论】:
这对我有帮助:
"The filename or extension is too long error" using gradle
换句话说:使用 com.github.ManifestClasspath 插件。
其他解决方案对我不起作用,因为实际项目主类在执行时最终没有包含在类路径中。
【讨论】: