8

在 Windows 环境中运行 groovyc 时,在我的情况下,由于类路径的长度,我遇到了问题。我想通过创建一个路径 jar 来解决这个问题,然后将该 jar 放在 cp.jar 上。如何创建一个带有在 gradle 中自动指定的所有类路径条目的路径 jar,然后将该 jar 添加到 cp?

4

3 回答 3

12

这是一个经过测试的解决方案:

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)
}    
于 2011-03-25T18:41:03.623 回答
5

我终于得到了“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)
}
于 2012-02-15T02:52:02.387 回答
0

这对我有帮助:

“文件名或扩展名太长错误”使用 gradle

换句话说:使用 com.github.ManifestClasspath 插件。

其他解决方案对我不起作用,因为实际项目主类在执行时最终没有包含在类路径中。

于 2020-10-15T10:49:46.857 回答