【问题标题】:Running jar from different directory cannot find required dependency从不同目录运行 jar 找不到所需的依赖项
【发布时间】:2010-12-19 00:55:36
【问题描述】:

我正在尝试运行一个 jar ec/mobat/MOBAT.jar,它依赖于位于 ec/mobat/lib/ 中的一些 jar。如果我这样做,它会起作用:

ec/mobat/$ java -jar MOBAT.jar

但是我希望能够从另一个目录运行 jar

ec/$ java -jar mobat/MOBAT.jar

但我得到一个例外

java.lang.NoClassDefFoundError: ibis/io/Serializable
...

我试图在类路径中传递所需的 jars

ec/$ CLASSPATH=... java -jar mobat/MOBAT.jar
ec/$ java -jar -cp ... mobat/MOBAT.jar

但我得到了完全相同的异常。有什么办法吗?

更新:MANIFEST.INF 包含以下内容:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: Selmar Kagiso Smit
Main-Class: mobat.Launcher
Implementation-Version: 1.3.4

【问题讨论】:

  • 你能发布 MOBAT.jar 的 Manifest 吗?它是否对 lib 文件夹中的 jar 定义了一些依赖项?

标签: java jar classpath dependencies


【解决方案1】:

类路径必须包含您依赖的每个 jar。

java -classpath b.jar;c.jar -jar a.jar //does not work see below

“;”是系统依赖的 windows ":" 对于 unix。

jar开关用于选择执行主类的jar文件(Main-Class:manifest文件中的mobat.Launcher)。命令行:

java -classpath b.jar;c.jar;a.jar mobat.Launcher

会产生相同的结果。

也可以将classpath definitions 添加到清单文件中。您的清单文件可能包含该属性。

Class-Path: lib/b.jar lib/c.jar

然后

java -jar a.jar

会起作用的。

编辑:

我认为-jar 和-cp 可以一起使用。但是java tools documentation 很清楚:

-jar
使用此选项时,JAR 文件是所有用户的来源 类和其他用户类路径 设置被忽略。

只有清单和所有显式(类路径和主类)版本有效。

【讨论】:

  • 我不想运行该类或修改 jar(它是一个库,而不是我的源代码),因此您的第二个和第三个解决方案不起作用(我实际上尝试了第二个,但得到了另一个错误)。正如我在问题中解释的那样,我已经尝试了第一个解决方案:在类路径中传递 jars 但仍然没有用。
  • 您是否使用 jar xft 检查该类是否在任何 jar 中?
  • 我明白了,但我仍然不明白为什么ec/mobat$ java -jar MOBAT.jar 会找到其他罐子。
  • 您的答案转换为:我只能运行位于当前目录中的 JAR!我真的希望不是这样
  • 还有一件事:我试图修改 MANIFEST.MF 但现在我得到了java.io.IOException: line too long
【解决方案2】:

你不能同时使用-cp和-jar

java -cp myjar.jar;lib/*;. mypackage.MyClass

应该在windows和

上工作

java -cp myjar.jar:lib/*:. mypackage.MyClass

应该在 Unix 上工作

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多