是否有可能在JWS中加载罐装罐?

时间:2010-10-20 15:44:15

标签: java jar java-web-start

我发现很多线程将所有依赖项和项目打包到一个jar包中,似乎有很多不同的方法来实现它(oneJar,FatJar,Ant-build ...)

因此,制作我自己的食谱,我(经过一番努力)设法打包我正在研究的项目。在这个jar文件中,有项目的代码加上项目所依赖的所有jars,它们都带有eclipse附带的jar-in-jar-loader。当结果通过java -jar myjarfile调用的终端运行时,结果在许多不同的平台上都能正常工作。

Peachy,你可能会说,这是问题所在;当我签署我的jar并试图通过javaws运行它(这是这里的最终目标)我得到一个异常,我已解密为库(在org.apache.commons.lang.SystemUtils下面的情况下)无法访问

所以这是我的问题;在为Java Web Start部署应用程序时,是否无法在jar中加载jar?如果可能,我做错了什么?如果没有,最好的选择是什么?

谢谢!


下面是JNLP文件以及运行javaws myJNLPfile时获得的stackTrace

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
codebase="file:///home/ukirik/workspace/myproject/dist"
href="project.jnlp">

<information>
    <!-- Project info -->
</information>
<security>
    <all-permissions />
</security>
<resources os="Mac\ OS\ X">
    <j2se version="1.6+" java-vm-args="-XstartOnFirstThread"/>
</resources>
<resources>
    <jar href="myjar-jws.jar" />
</resources>
<application-desc main-class="org.gvt.RuntimeMain"/>            
</jnlp>

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.javaws.Launcher.executeApplication(Launcher.java:1799)
at com.sun.javaws.Launcher.executeMainClass(Launcher.java:1745)
at com.sun.javaws.Launcher.doLaunchApp(Launcher.java:1507)
at com.sun.javaws.Launcher.run(Launcher.java:129)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/lang/SystemUtils
at org.gvt.RuntimeMain.loadSwtJar(RuntimeMain.java:27)
at org.gvt.RuntimeMain.main(RuntimeMain.java:13)
... 9 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.SystemUtils
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 com.sun.jnlp.JNLPClassLoader.findClass(JNLPClassLoader.java:332)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 11 more

3 个答案:

答案 0 :(得分:1)

如果您正在使用Eclipse jar-in-jar加载器,我认为您可能需要在jnlp文件中

<application-desc main-class="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/>

假设您的清单看起来像这样......

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.1-b02 (Sun Microsystems Inc.)
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Rsrc-Main-Class: yourapp.mainclass
Rsrc-Class-Path: ./ swt.jar velocity-1.7-dep.jar
Class-Path: .

答案 1 :(得分:0)

似乎问题在于类加载器。

您可能希望在JWS中使用自定义类加载器,如下所述:

http://lopica.sourceforge.net/faq.html#customcl

根据您需要做什么,在包装方面,有几种选择。

答案 2 :(得分:0)

你遇到的问题是你在你的JNPL文件中传递了org.gvt.RuntimeMain作为你的jar的主类,但这是一个罐子罐。因为它是一个罐子罐子,你需要提供类com.simontuffs.onejar.Boot,而不是

<application-desc main-class="com.simontuffs.onejar.Boot"/>  

它的原因是,one-jar插件将生成该类,它将使用一个能够理解jar中jar的类加载器,然后调用你的org.gvt.RuntimeMain类(它通过查看来计算它)在清单的One-Jar-Main-Class:标题)。