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

时间:2012-01-07 21:00:11

标签: java windows-xp classpath

我有两个jar文件,A.jar和B.jar。 A包含我的main函数,它依赖于B中定义的类。

我将A和B放在Windows PATH中的同一个文件夹中,然后尝试在A中运行我的主...

java -jar A.jar -dosomething

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

所以我再次阅读了关于CLASSPATHs和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文件正常工作?

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

您需要像这样在A.jar文件中添加清单文件。

清单文件的内容应如下所示,其中Main-Class指向您的包名称和A中主类的类名。

将其保存在名为Manifest.mf

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我会考虑使用像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

答案 4 :(得分:0)

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

Manifest.txt

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

将此清单文件添加到A.jar

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

将两个jar放在一个文件夹中,然后使用cmd java -jar A.jar

运行A.jar