Java 在Windows XP上,将jar文件放在lib/ext中而不是使用类路径是否可行?

Java 在Windows XP上,将jar文件放在lib/ext中而不是使用类路径是否可行?,java,windows-xp,classpath,Java,Windows Xp,Classpath,我有两个jar文件,A.jar和B.jar。A包含我的主函数,它依赖于B中定义的类 我把A和B放在同一个文件夹中,它在Windows路径中,并尝试在A中运行我的main java -jar A.jar -dosomething 这给了我一个java.lang.NoClassDefFound错误,我在dosomething下面的代码中调用了B方法。有趣的是,它找到了A.jar并调用了main方法,但是它找不到B.jar,即使它与A.jar位于同一个文件夹中 因此,我(再次)阅读了有关类路径和JA

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

我把A和B放在同一个文件夹中,它在Windows路径中,并尝试在A中运行我的main

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

因此,我(再次)阅读了有关类路径和JAVA_HOME变量的内容,并确保我的JAVA_HOME指向正确的位置。描述如何将扩展jar文件(在我的案例B中)放入/lib/ext文件夹,因此我对其进行了修改,但得到了相同的
java.lang.NoClassDefFound
错误

我使用的是JavaJDK1.5.0_10,因此为了更好地衡量,我还将B.jar放在了下面的jre/lib/ext文件夹中

现在我把它放在三个地方,路径上的本地文件夹,JAVA_HOME/lib/ext和JAVA_HOME/jre/lib/ext,我仍然得到相同的错误


应该使用lib/ext吗?我到底要把我的B.jar文件放在哪里才能让它正常工作?

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

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


将两个JAR放在同一目录中不会使它们自动位于同一类路径中。如果A.jar是一个可执行的jar(看起来是),并且它依赖于一个外部的B.jar,那么它的清单的类路径条目必须引用B.jar。Read

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

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


将两个JAR放在同一目录中不会使它们自动位于同一类路径中。如果A.jar是一个可执行的jar(看起来是),并且它依赖于一个外部的B.jar,那么它的清单的类路径条目必须引用B.jar。阅读

您需要有一个清单文件,以便能够从另一个jar调用类。选中此项

您需要有一个清单文件才能从另一个jar调用类。检查这个

< P>我会考虑使用一个构建系统,比如Ant或Maven,我个人的偏好是Maven。大多数插件处理复杂的类路径/依赖性问题——在Maven中,这就是Shade插件

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


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

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


您需要向a.jar文件中添加清单文件,如下所示

清单文件的内容应该如下所示,其中主类指向包名,主类的类名位于

将其保存在一个名为Manifest.mf的文件中

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

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

您需要像这样将清单文件添加到a.jar文件中

清单文件的内容应该如下所示,其中主类指向包名,主类的类名位于

将其保存在一个名为Manifest.mf的文件中

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

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

要生成可执行jar文件,需要添加包含主类名称和其他依赖类路径

Manifest.txt

Main-class: A
Class-Path: B.jar
将此清单文件添加到.jar中

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

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

运行.jar,以生成可执行的jar文件。您需要添加一个清单文件,其中包含主类名和其他依赖类路径

Manifest.txt

Main-class: A
Class-Path: B.jar
将此清单文件添加到.jar中

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

将两个jar放在一个文件夹中,并使用cmd
java-jara.jar运行A.jar

谢谢,把它们放在lib/ext中怎么样?我不认为jar清单是了解JAVA_HOME更多信息的唯一途径:哇,同样的答案,但你写得更快:PI在8分钟前开始写我的,但你更快了:在lib/ext中剪切应用程序jar文件是非常糟糕的做法。JRE可以被除您之外的许多其他应用程序使用,它们不需要在类路径中包含您的类。谢谢,将它们放在lib/ext中如何?我不认为jar清单是了解JAVA_HOME更多信息的唯一途径:哇,同样的答案,但你写得更快:PI在8分钟前开始写我的,但你更快了:在lib/ext中剪切应用程序jar文件是非常糟糕的做法。JRE可以被除您之外的许多其他应用程序使用,它们不需要在其类路径中包含您的类。jar中应该有一个Meta Inf文件夹,Manifest.mf文件应该在jar的那个文件夹中。jar中应该有一个Meta Inf文件夹,Manifest.mf文件应该在jar的那个文件夹中。