【问题标题】:How can I create a pathing jar in Gradle如何在 Gradle 中创建路径 jar
【发布时间】:2011-03-25 15:21:04
【问题描述】:

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

【问题讨论】:

    标签: groovy gradle


    【解决方案1】:

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

    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)
    }    
    

    【讨论】:

    • 后续问题:这似乎没有按预期工作。创建了路径jar,但是当我在编译时将路径jar添加到类路径时,由于某种原因,编译失败并抱怨缺少路径jar中已经引用的jar...
    • 我认为这不起作用,因为这指定了清单中 jar 的绝对路径。在这种情况下,绝对路径是否有效尚不清楚。
    • 问题不在于绝对路径,而是使用冒号而不是空格作为路径分隔符。我已经更新了代码并对其进行了测试以确保它可以正常工作。
    • 我似乎记得在没有任何运气的情况下使用空格进行测试。我今天再试一次,然后报告。
    • 类路径条目始终是相对的,请参阅 jar 规范:此属性的值指定此应用程序或扩展所需的扩展或库的相对 URL [引用:docs.oracle.com/javase/1.4.2/docs/guide/jar/jar.html]
    【解决方案2】:

    我终于得到了“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)
    }
    

    【讨论】:

    • 但这似乎没有在类路径中包含当前项目的 jar 文件?
    • 这个didn't work in Groovy versions between 3.0.5 in 3.0.8。链接的 Grails 问题还包括使用此方法的完整解决方法。
    • 我是 Gradle 新手,但是当我尝试这个解决方案时,它抱怨没有定义 gradleUserHome 和 relativeClasspathEntries,所以我在每一行中添加了一个 def 声明。
    【解决方案3】:

    这对我有帮助:

    "The filename or extension is too long error" using gradle

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多