运行可执行jar会抛出ClassNotFoundException

时间:2013-11-07 09:18:31

标签: java

我的jar文件中的目录是这样的:

remote.jar

中的

 -com
 -lib
 -META-INF
META-INF下的

是文件MANIFEST.MF

Manifest-Version: 1.0
Class-Path: lib/*
Main-Class: com.xx.xx.Main

并且所有jar都在lib文件夹下。

当我运行java -jar remote.jar时,从命令行给我ClassNotFoundException,未找到的类位于lib文件夹下的其中一个jar中。如果main函数没有引用lib中的任何类,则命令行运行没有问题。

我的问题是为什么它无法在lib下的jar中找到类。

编辑:

文件夹lib

下没有嵌套文件夹

2 个答案:

答案 0 :(得分:2)

问题是清单中的Class-Path属性不像您认为的那样。见http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

  

注意:Class-Path标头指向上的类或JAR文件   本地网络,而不是JAR文件中的JAR文件或可访问的类   通过互联网协议。在JAR中的JAR文件中加载类   将文件放入类路径中,必须编写自定义代码来加载它们   类。例如,如果MyJar.jar包含另一个名为的JAR文件   MyUtils.jar,你不能在MyJar.jar中使用Class-Path头   显示将MyUtils.jar中的类加载到类路径中。

最简单的解决方案是将类路径jar放在jar之外,并创建一个小的批处理文件或shell脚本来构造类路径并调用jar。

答案 1 :(得分:1)

我担心设置您的MANIFEST Class-path不会让您成功加载来自nested个罐子的类(即罐子里的 ,如链接中所述)伊恩的回答)。
如果要打包单个可执行jar,最好的选择是: