我有两个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文件正常工作?
答案 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