应该把一个jar文件放在lib/ext中而不是在Windows XP上使用CLASSPATH?

问题描述:

我有两个jar文件,A.jar和B.jar。 A包含我的主要功能,它依赖于B.应该把一个jar文件放在lib/ext中而不是在Windows XP上使用CLASSPATH?

定义的类我把A和B在同一个文件夹中,这是在Windows路径,并尝试运行我的主...

java -jar A.jar -dosomething 

这给了我一个java.lang.NoClassDefFound错误的方法B,我调用下面的代码-dosomething。有趣的是,它找到了A.jar并称为主要方法,但它无法找到B.jar,即使它与A.jar位于同一个文件夹中。

因此,我再次阅读了关于CLASSPATH和JAVA_HOME变量的内容,并确保我的JAVA_HOME指向正确的位置。 This document描述了我应该如何将我的扩展jar文件(在我的情况B中)放到/ lib/ext文件夹中,这样我就可以得到相同的java.lang.NoClassDefFound错误。

我正在使用Java jdk1.5.0_10,所以为了很好的衡量,我还将B.jar放置在下面的jre/lib/ext文件夹中。

所以现在我在三个地方,PATH,JAVA_HOME/lib/ext和JAVA_HOME/jre/lib/ext上的本地文件夹,我仍然得到相同的错误。

应该使用lib/ext工作吗?我到底在哪里放置了我的B.jar文件以使其正常工作?

你需要一个清单文件添加到你这样的a.jar文件的文件。

清单文件的内容应该是这样的,在主类指向您的包名和主类的A.

类名

保存在一个文件名为类似清单。 MF

Manifest-Version: 1.0 
Main-Class: com.your.package.name.A 
Class-Path: A.jar B.jar 

,您可以手动更改.jar文件到这个文件添加到您的罐子。然后打开它并修改现有清单文件的内容(如果有的话)或将Manifest.mf文件复制到jar/zip文件并将其更改回.jar文件。

+0

你的jar里面应该有一个Meta-Inf文件夹,Manifest.mf文件应该在jar文件夹中。 – Logan 2012-01-08 00:53:14

JAVA_HOME不是Java使用的环境变量。它被其他工具(如Ant)使用,但不被Java使用。

Java也不使用PATH环境变量。它用于在Windows中查找可执行文件,但Java不会用它来查找罐子。

将两个罐放在同一个目录下不会使它们自动在同一个类路径中。如果A.jar是一个可执行的jar(看起来好像是),并且它依赖于外部B.jar,那么它的清单的Class-Path条目必须引用B.jar。阅读http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

+0

感谢,怎么样运行a.jar文件把它们放在lib/ext中?我不认为jar清单可以是唯一的方法 – Simon 2012-01-07 21:10:45

+0

在这里查看更多关于JAVA_HOME的信息:http://*.com/questions/2025290/what-is-java-home-how-does-jvm-will-find- -javac-path-stored-in-java-home – 2012-01-07 21:12:05

+0

相同的答案,但你写得更快:P – 2012-01-07 21:13:38

您需要有一个Manifest文件才能够从另一个jar中调用类。检查link

我会考虑使用像Ant或Maven这样的构建系统,我个人的偏好是Maven。大多数都有插件来处理复杂的类路径/依赖项问题 - 在Maven中,这是Shade插件。

我会用Maven的例子来做Hello World。大多数现代IDE(IDEA,Eclipse,NetBeans)都可以从pom.xml生成项目。

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

要制作可执行文件,您需要添加一个包含Main-class名称和其他相关类路径的清单文件。

Manifest.txt

Main-class: A 
Class-Path: B.jar 

两个罐子加入这个清单文件到a.jar文件

cmd:/folderLocation>jar cvfm A.jar manifest.txt A.class 

地方一个文件夹中,并使用CMD java -jar A.jar