2

我创建了一个新的 jar 文件。当我使用

java -jar UpdateAvailable.jar com.dao.mysql.UpdateAvailable

我得到了以下异常。

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONException
Caused by: java.lang.ClassNotFoundException: org.codehaus.jettison.json.JSONException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

但是我复制了UpdateAvailable.jar. 现在我的要求是运行 jar 文件而不指定支持的 jar,比如

java -jar UpdateAvailable.jar com.dao.mysql.UpdateAvailable
4

3 回答 3

0

在使用 JAR 文件和 ClassPath 时,请记住以下几点: -

  • 为了让你的 JVM 找到类,你的类路径应该设置到包含类的目录。在这种情况下,您有 JAR。
  • 因此,您需要提供路径,直到您的 Jar 文件名
  • 现在,由于您在当前运行的 Jar 文件中有您的 Jar 文件,因此您无法将类路径设置到 Jar 中的文件夹,因此基本上您将无法为内部 Jar 文件设置类路径。
  • 因此,显然 JVM 将无法在您的内部 Jar 中看到类。
  • 因此,请确保您所需的 JAR 文件位于所有 JAR 文件之外(我的意思是 - 避免嵌套 JAR 文件)..
于 2012-09-25T12:33:22.687 回答
0

我不确定您是如何打包 jar 文件的,但听起来您需要One-Jar之类的东西来帮助您将文件和所有支持库打包到一个 jar 中。One-Jar 带有它自己的类加载器,允许它加载所有包含在可执行 jar 文件中的 jar。

配置相当简单且易于使用。如果您使用的是 Maven,则可以使用one-jar maven 插件来帮助您配置要包含的库。

您还可以使用其他类似的包来代替 One-Jar,例如JarJarProGuard。还可以快速查看这个 SO question

于 2012-09-25T14:03:01.457 回答
0

在可执行 jar 中无法读取 jar 中的任何支持 jar 文件。因此,将所有支持的 jar 保存在一个文件夹中,并将可执行的 jar 放在同一目录中。并在“MANIFEST.MF”文件中添加“Class-Path”作为“支持的jar文件以空格分隔”。现在运行 jar

java -jar UpdateAvailable.jar com.dao.mysql.UpdateAvailable
于 2012-09-28T05:43:58.267 回答