繁体   English   中英

JRE 不使用可运行 jar 的清单文件指定的类路径

[英]JRE not using classpath specified by manifest file of runnable jar

第一次发帖,很抱歉我的格式不好。 我有一个在 eclipse 中开发的 java 程序。 我将程序导出为 jar (myJar.jar),然后将程序依赖的所有外部 jar 放入名为lib的文件夹中,该文件夹与 myJar.jar 位于同一位置。 为了设置我的类路径,我有一个具有以下格式的清单文件:

Main-Class: exe.myMain
Class-Path: lib/jar_1.jar lib/jar_2.jar ... lib/jar_n.jar
Manifest-Version: 1.0

但是,当我尝试使用“java -jar myJar.jar”运行程序时,来自lib中的 jar 的类没有被加载(我收到 ClassNotFoundException)。 我在我的程序中使用了以下代码来打印类路径:

ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url:urls){
    System.out.println(url.getFile());
}

当我运行这段代码时,类路径就是“myJar.jar”。

我有两个问题:

1.) 上面的代码实际上是否在运行时为我提供了 JRE 的类路径,还是只是为我提供了主类的地址?

2.) 鉴于上面的代码确实在运行时给了我 JRE 的类路径,我做错了什么吗?

请随时询问更多信息,我很乐意提供您需要的信息。

你在做什么听起来是正确的。

由于某种原因,清单中的Class-Path条目在检查类路径时没有显示(例如这里这里;这些示例使用属性"java.class.path"但我的测试表明ClassLoader.getURLs()行为相同)。 尽管如此,它仍然应该被搜索类。 我不知道如何从清单中获取包含Class-Path条目的真正类Class-Path

我要检查的第一件事是myJar.jar中的文件META-INF/MANIFEST.MF与您创建的清单相匹配。 您可以通过将myJar.jar重命名为具有.zip文件扩展名来打开它。

我试图复制您的问题,但lib/jar_1.jar中的类已为我加载,因此如果META-INF/MANIFEST.MF是正确的,我将详细描述我所做的事情,以便您可以找到我们所做的不同之处。

编辑:

以下是我使用的步骤:

  1. 创建一个名为“experiment”的新目录。 下面的步骤都是在那个目录下完成的。

  2. 创建名为“jar_1”、“lib”和“exe”的新目录

  3. 在目录“jar_1”中创建一个名为“ClassInJar1.java”的文件,内容如下:

     package jar_1; public class ClassInJar1 { public static void method() { System.out.println("Hello from ClassInJar1"); } }
  4. 运行javac jar_1/ClassInJar1.java

  5. 运行jar cf lib/jar_1.jar jar_1/ClassInJar1.class

  6. 在目录“exe”中创建一个名为“myMain.java”的文件,内容如下:

     package exe; import java.net.*; import jar_1.ClassInJar1; public class myMain { public static void main(String[] args) { ClassLoader cl = ClassLoader.getSystemClassLoader(); URL[] urls = ((URLClassLoader) cl).getURLs(); for (URL url : urls) { System.out.println(url.getFile()); } ClassInJar1.method(); } }
  7. 运行javac exe/myMain.java

  8. 在“experiment”目录下创建一个名为“manifest”的文件,内容如下:

    Main-Class: exe.myMain
    Class-Path: lib/jar_1.jar lib/jar_2.jar
    Manifest-Version: 1.0
  1. 运行jar cfm myJar.jar manifest exe/myMain.class

  2. 运行java -jar myJar.jar

输出:

/.../experiment/myJar.jar
Hello from ClassInJar1

您的manifest文件似乎有误。 您有Main-Class: exe.myMain => java 但有 exe 类型? 建议您使用 eclipse 导出 jar 文件,它会自动为您创建所有内容,您不必手动创建清单文件,以免出错。 详情请看如下:

我已经通过创建一个带有 eclipse => 的 java 项目进行了测试,使用 eclipse 的导出功能导出一个可运行的 JAR => 使用第三个选项(将所需的库复制到子文件夹中......)。 导出后我买了名的jar myJarName.jar与名称的文件夹myJarName_lib 7zip程序打开 jar => META-INF => 打开MANIFEST.MF => 这是它的结构:

Manifest-Version: 1.0
Class-Path: . myJarName_lib/gson-2.8.0.jar myJarName_lib/jsoup-1.8.3.jar myJarName_lib/commons-cli-1.2.jar myJarName_lib/jackson-core-2.8.8.jar
Main-Class: upwork.Main

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM