Java忽略jar文件清单

时间:2015-08-26 12:12:02

标签: java eclipse jar classpath manifest

我搜索了互联网,我搜索了stackoverflow,发现很多帖子都在问这个问题,但是没有一个具体的答案。

简短版本是:我有一个jar文件,它引用了清单中的其他jar文件。然后我使用java -jar test.jar运行jar文件,但它不会将jar依赖项添加到类路径中。

长版:我做了一个小实验,以确认这不是我项目的特别之处。我在eclipse中创建了一个简单的Java项目,只有一个类。这个类所做的就是将类路径写入std-out:

package test;

import java.net.URL;
import java.net.URLClassLoader;

public class Test {
  public static void main(String[] args){
    ClassLoader cl = ClassLoader.getSystemClassLoader();
    URL[] urls = ((URLClassLoader)cl).getURLs();
    for(URL url: urls){
      System.out.println("CP: "+url.getFile());
    }
  }
}

然后我创建了一个“lib”文件夹并在其中放入一个随机的jar文件并将其添加到类路径中。文件夹结构现在如下所示:

Test
|- src/test/Test.java
|- lib/mysql-connector-java-3.1.14-bin.jar

现在,当我从Eclipse运行它时,我得到以下输出:

CP: /home/username/workspace/Test/bin/
CP: /home/username/workspace/Test/lib/mysql-connector-java-3.1.14-bin.jar

好的,现在我使用Eclipse将项目导出到一个可运行的jar。我选择“将所需库复制到生成的jar旁边的子文件夹中”选项。

这会创建以下结构:

/tmp/Test
|- test.jar
|- test_lib/mysql-connector-java-3.1.14-bin.jar

如果我查看Eclipse创建的Test.jar,它看起来像这样:

test.jar
|- test/Test.class
|- META-INF/MANIFEST.MF

MANIFEST.MF的内容是:

Manifest-Version: 1.0
Class-Path: . test_lib/mysql-connector-java-3.1.14-bin.jar
Main-Class: test.Test

是的,在Main-Class属性之后有一个空行(我提到这是因为有些人在网上发帖说原因可能是最后一个缺少的换行符。)

所以,一切看起来都很好。我用 java -jar test.jar 运行它并得到以下输出:

CP: /tmp/Test/test.jar

因此,类路径只包含我想要运行的jar文件。完全忽略MANIFEST中的 Class-Path:属性。 如果我用 java -cp test.jar test.Test

运行它会发生同样的事情

如何正确使用MANIFEST.MF中的Class-Path属性?我无法理解我的生活。特别是因为-cp和-jar不兼容,我不知道如何在使用-jar参数的同时指定类路径。

提前多多感谢。

我可以提前回答一些事情:

  • “最后一行之后是否有换行符?” - 是的
  • “这可能是eclipse对MANIFEST.MF的错误吗?” - 可能是,但是当我用蚂蚁制作罐子时,我遇到了同样的问题。因此,如果eclipse和ant都会使清单变形,我不知道应该如何格式化它。
  • “您尝试过哪些Java版本的平台?” - 我在Windows 10上试过Java8,在Fedora Linux上试过Java6,Java7和Java8。

1 个答案:

答案 0 :(得分:1)

好的,感谢JB Nizet的评论,我发现一切都运转良好。它没有打印出类路径,但我可以从库中访问这些类。所以我的实验设置错了。这对我来说是个坏消息,因为我的其他项目仍然没有用,而且在这里发帖太复杂了。