JRE没有使用runnable jar的manifest文件指定的类路径

时间:2017-07-27 21:32:20

标签: java manifest

第一篇文章,很抱歉我的格式不佳。我有一个我在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的类路径,我做错了吗?

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

2 个答案:

答案 0 :(得分:1)

你在做什么听起来是对的。

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

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

我试图复制你的问题,但lib/jar_1.jar中的课程已经为我加载了,所以如果META-INF/MANIFEST.MF是正确的,我会详细描述我所做的事情,这样你就可以找到我们的内容做得与众不同。

修改

以下是我使用的步骤:

  1. 创建一个名为" experiment"的新目录。以下步骤都在该目录中完成。

  2. 创建名为" jar_1"," lib"和" exe"

  3. 的新目录
  4. 创建一个名为" ClassInJar1.java"的文件。在目录" jar_1"具有以下内容:

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

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

  7. 创建一个名为" myMain.java"的文件。在目录" exe"具有以下内容:

    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();
        }
    }
    
  8. 运行javac exe/myMain.java

  9. 创建一个名为" manifest"的文件。在"实验"目录包含以下内容:

  10.     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

    3. 输出:

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

答案 1 :(得分:0)

您的chmod +x squash.sh GIT_EDITOR=./squash.sh git rebase --interactive $COMMIT_ID 文件似乎有误。您有manifest => java但是有exe类型?推荐给你的是你应该使用eclipse导出你的jar文件它会自动为你创建所有的东西,你不必手动创建清单文件,这样你就可以犯错。请参阅以下详细信息:

我通过使用eclipse =>创建了一个java项目进行了测试使用eclipse的导出功能导出可运行的JAR =>使用第3个选项(将所需的库复制到子文件夹中......)。导出后,我得到名为Main-Class: exe.myMain的jar和名为myJarName.jar的文件夹。使用myJarName_lib program =>打开jar在7zip =>下打开META-INF =>这是它的结构:

MANIFEST.MF