【问题标题】:How to include jars in different drives in to the manifest file in a jar file如何将不同驱动器中的 jar 包含到 jar 文件中的清单文件中
【发布时间】:2020-10-15 19:23:13
【问题描述】:

我正在开发一个遗留应用程序,它通过使用包 org.apache.tools.ant.taskdefs 使用 ant 任务使用 Javadoc 生成。在那里我需要传递 maven 给出的类路径。这个类路径主要在 maven 本地存储库中有 jar 路径。

        Javadoc javadoc = new Javadoc();
        javadoc.setUseExternalFile(true);
        javadoc.setProject(proj);
        javadoc.setClasspath(new Path(proj, classpath));

问题是这个类路径足够长,因此不允许在 Windows 上执行,这会导致以下错误。

enterJavadoc failed: java.io.IOException: Cannot run program "C:\jdk1.8.0_144\bin\javadoc.exe": CreateProcess error=206, The filename or extension is too long code here

对于这个问题,我所做的是创建一个路径 jar,在其清单文件中包含长类路径。所以我将此 jar 文件添加为 Javadoc 任务的类路径。我在 ant 中使用 ManifestClassPath 任务为我的长类路径中的 jar 生成相对路径。

    ManifestClassPath mc = new ManifestClassPath();
    mc.setProject(proj);
    mc.addClassPath(new Path(proj, classPath));
    mc.setJarFile(new File(pathingJar));
    mc.setProperty("classpath");
    mc.setMaxParentLevels(20);
    mc.execute();
    Jar jar = new Jar();
    Manifest manifest = new Manifest();
    Manifest.Attribute attribute = new Manifest.Attribute();
    attribute.setName("Class-Path");
    attribute.setValue(proj.getProperty("classpath"));
    manifest.addConfiguredAttribute(attribute);
    jar.addConfiguredManifest(manifest);
    jar.setDestFile(new File(pathingJar));
    jar.setProject(proj);
    jar.execute();
    javadoc.setClasspath(new Path(proj, pathingJar));

这个解决方案一直有效,直到我在 maven 本地存储库所在的同一驱动器中开发它。但是 Maven 本地存储库位于不同的驱动器中,它失败了,因为它无法为不同的驱动器生成相对路径。然后我尝试使用如下文件协议处理类路径

Class-Path: file:///C:/mvn_repo/...  file:///C:/mvn_repo/... ...

由于 Javadoc 任务失败,此解决方案似乎不起作用。有没有其他方法可以尝试使用路径 jar 来解决这个长类路径问题?

【问题讨论】:

  • 你能把错误日志分享给我们吗?这是包 org.gradle.api.tasks.javadoc.Javadoc 吗?
  • @JRichardsz 请查看我更新的问题。我正在使用 org.apache.tools.ant.taskdefs 包
  • 你不能。 Manifest 中的类路径条目是 relative URL,相对于包含 JAR 文件的位置进行解释。您不能在其中放置任何描述的绝对路径。
  • @MarquisofLorne 除了使用 jar 文件还有其他方法。我无法编辑 CLASSPATH 环境变量或使用通配符,因为类路径包含来自 maven 本地 repo 的 jar,因此我需要使用具有确切版本的 jars
  • 您尝试使用链接吗?在路径 jar 的驱动器上,您可以创建指向 maven 目录的文件夹链接。 mklink /J "mvn_repo_link" "C:\mvn_repo"。然后你可以通过mvn_repo_link目录使用相对路径。

标签: java maven jar classpath manifest


【解决方案1】:

正如@MarquisofLorne 提到的,你不能。

Manifest 中的类路径条目是相对 URL

无论如何,您可以使用带有文件夹链接的解决方法。在 pathing jar 的驱动器上,您可以创建指向 maven 目录的文件夹链接。文件夹链接可以指向另一个驱动器。

mklink /J "mvn_repo_link" "C:\mvn_repo". 

然后你可以通过mvn_repo_link子目录使用相对路径

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多