2012-09-25 55 views
2

我创建一个新的jar文件。当我运行罐使用运行jar文件指定支持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文件,像

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

解压jar文件 –

+0

你是说你已经塞满了'UpdateAvailable.jar'里面所有的依赖罐子? – maba

+0

看看[这个](http://stackoverflow.com/questions/12229300/creating-an-independent-jar-file/12230160#12230160) –

回答

0

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

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

这里有几点,而你是用JAR文件和CLASSPATH工作要记住: -

  • 为了使您的JVM找到类,您的类路径应设置为包含该类的目录。在这种情况下,你有JAR。所以,你需要给路径,直到你的罐子文件名
  • 现在,因为你有你的Jar文件在你当前运行的Jar文件中,你不能设置你的类路径直到文件夹内的文件夹,所以基本上你将无法设置内部Jar文件的类路径。
  • 因此,很明显JVM将无法看到内部Jar中的类。
  • 因此,确保所需的JAR文件在外部的所有JAR文件(我的意思是说 - 避免嵌套的JAR文件)..
0

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

配置相当简单易用。如果您正在使用Maven,则可以使用one-jar maven plugin来帮助您配置要包含哪些库。

还有其他类似的包可以用来代替One-Jar,比如JarJarProGuard。请快速查看this SO question