外部jar包应该放在哪里?

54

我使用Eclipse(3.4)编写的类没有警告或错误。

我的项目使用一个外部jar文件。

如果我从另一个项目(不在Eclipse中)使用这个类时,我需要把这个外部jar文件放在哪里,才能避免出现java.lang.NoClassDefFoundError错误?

我可以将jar文件直接提取到项目文件夹中,但感觉不太对。

编辑:这个问题与在Eclipse中导入jar无关,而是关于在Eclipse之外如何使用它们。

9个回答

62
如果您想将JAR文件包含到Eclipse项目中,通常会在项目文件夹中创建一个“lib”文件夹,并将文件放在其中。然后,您需要告诉Eclipse将其包含在类路径中,以便您的代码可以在Eclipse中编译和运行。

操作步骤如下:
- 进入项目属性
- 在左侧选择“Java Build Path”
- 在窗口的中间部分选择“Libraries”选项卡
- 单击“Add JARs”按钮-这将提供您在Eclipse中的项目列表-展开您的项目并进入lib文件夹-您的jar文件将在那里。
- 选择JAR文件,单击确定,然后再次单击确定以关闭属性窗口。

现在,您的代码将能够编译和运行。

2
代码在Eclipse中可以编译通过。但是在Eclipse之外运行它(例如,另一个GUI调用JAR包内的函数),会出现NoClassDefFoundError错误。 - Burkhard
1
或者,您可以右键单击jar文件,然后单击BuildPath->Add to Build Path。 - Dave Ray
当你在Eclipse之外运行任何东西时,你必须在运行的类路径中提供你的Eclipse项目二进制文件(如果没有构建成jar文件)。 - James Camfield
我完全不知道在哪里添加JAR文件。是在创建的lib文件夹内还是在war/WEB-INF/lib文件夹内? - karlihnos

24

将其放置在您的jre/lib/ext文件夹中。

虽然有关类路径的所有说明都是正确的,但这是一个一致且明智的位置。

您可以通过查看Windows上的JAVA_HOME环境变量来找到您的jre文件夹。


有趣,但我电脑上有三个JRE和三个JDK,我不想再复制所有我需要的库。 - PhiLho
1
你可能有三个(我也是),但你只能同时使用一个,这由你的JAVA_HOME定义。此外,你的第三方工具可能针对不同的JRE版本有不同的版本,因此如果不采取这种方法,你就会遇到重复问题的相反情况。这就是jre/lib/ext的作用。 - Simon
简而言之,足够有帮助。 - asifaftab87
2
您提到的目录(jre/lib/ext)在最近的JDK版本中已经不存在了(从JDK 11开始)。在新的JDK版本中,什么位置是合适的? - theyuv

7

放置位置不是很重要,但您需要配置其他非Eclipse项目将外部JAR文件放在其类路径中 - 或者使用扩展目录机制(如果必须)。 (这更容易,但明确说明可能更好。)


非Eclipse项目并未由我配置或维护。 事实上,我只是编写了几个类中的一个,并且这些类之一使用了来自jar文件中的另一个类。 - Burkhard
那么你完全不能配置其他项目的类路径吗?迟早会让你遇到麻烦。与其绕过这个限制,不如试着去解决它。 - Jon Skeet

6
Simon的答案似乎是最好的,但现在有点过时了。已经搜索过了这个Oracle文档已安装扩展
从Java 6开始,扩展JAR文件可以放置在与任何特定JRE无关的位置,以便所有安装在系统上的JRE都可以共享扩展。
它说对于Windows,您应该将扩展安装在此处%SystemRoot%\Sun\Java\lib\ext。

只是确认这在2020年和Visual Studio Code中运行良好。我将osgi框架jar添加到C:\ Program Files \ Java \ jdk1.8.0_241 \ jre \ lib \ ext,关闭并打开Visual Studio Code,然后能够正确导入库。作为个人注释,我喜欢这种方法,因为它是JDK本身存在的东西。 - Paolo

1

你只需要使用 -classpath 选项引用它,放在一个不包含在 Eclipse 工作区中的文件夹中,即完全不依赖于 Eclipse。

警告:如果你使用 -cp 选项引用外部 jar 包,那么你将无法使用 java -jar 执行其他项目(参见此问题)。


0

我将它放入一个新文件夹中。这个文件夹必须包含在构建路径中。 无论是在Eclipse内部还是外部都可以。Eclipse有一个特定于项目的构建路径,并将其传递给javac。 如果你想在Eclipse之外执行javac,你必须手动传递构建路径。


0

我知道这不完全是你所问的,但你考虑过使用Maven吗?像assembly这样的一些插件在这种情况下可能会有所帮助。


0

在Eclipse中有一个jar,就像James Camfield所写的那样。

然后,在构建(Ant、Maven、手动)用于分发时,请确保将jar文件包含在应用程序jar、war、ear或任何文件中,并且任何启动脚本都使用-classpath命令行选项将其包含在java的类路径中,就像VonC所写的那样。

不要担心将jar放在java扩展文件夹中,这只会让你在将代码发送给第三方使用时忘记它,因为他们在他们的端点上没有设置它。


0

创建一个共享的lib目录,并将这个jar文件和其他可能存在的公共jar文件放在那里。如果您正在使用Maven,则已经以本地repo的形式拥有它。

在Eclipse中,为此目录创建一个classpath变量,然后在项目中使用它来引用您的jar文件。如果您有多个符合这些条件的项目,这将使生活更加轻松。它还可以轻松地更改根目录的位置,如果您从本地驱动器转移到网络驱动器。

在外部应用程序中,您还将从其共享位置在应用程序类路径上包含此jar文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接