можно ли загружать jars-in-jars в JWS? - PullRequest
0 голосов
/ 20 октября 2010

Я обнаружил МНОГИЕ потоки по упаковке всех зависимостей вместе с проектом в один пакет jar, и кажется, что для этого есть много разных способов (oneJar, FatJar, Ant-build ...)

Так, готовя мой собственный рецепт, я (после некоторых усилий) сумел упаковать проект, над которым я работаю.В этом одном jar-файле содержится код проекта плюс все jar-файлы, от которых зависит проект, которые загружаются с jar-in-jar-loader, который поставляется с eclipse.Результирующий продукт прекрасно работает на ряде различных платформ, когда он запускается через терминал, вызываемый через java -jar myjarfile.

Пиччи, можно сказать, вот в чем проблема;когда я подписываю свой jar и пытаюсь запустить его через javaws (что является конечной целью здесь), я получаю исключение, которое я расшифровал, чтобы означать библиотеки (в случае ниже org.apache.commons.lang.SystemUtils)недоступны .

Так вот мой вопрос;нельзя ли загружать jar-файлы в jars при развертывании приложений для Java Web Start? Если это возможно, что я делаю не так?Если нет, то какая лучшая альтернатива?

Спасибо!


Ниже приведен файл JNLP вместе с stackTrace, который я получаю при запуске javaws myJNLPfile

<?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 ]

1 голос
/ 03 июля 2011

Если вы используете загрузчик 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: .
0 голосов
/ 06 декабря 2016

Проблема, с которой вы сталкиваетесь, заключается в том, что вы передаете org.gvt.RuntimeMain в качестве основного класса для вашего jar-файла в файле JNPL, но это jar-файл с одним jar-файлом.Поскольку это jar на одну банку, вам нужно предоставить класс com.simontuffs.onejar.Boot, а

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

Причина этого в том, что плагин one-jar сгенерирует этот класс, которыйбудет использовать загрузчик классов, который понимает jar внутри jar, а затем вызовет ваш класс org.gvt.RuntimeMain (он выяснит это, посмотрев на манифест One-Jar-Main-Class: header).

0 голосов
/ 20 октября 2010

Похоже, проблема в загрузчике классов.

Возможно, вы захотите использовать собственный загрузчик классов в JWS, как описано здесь:

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

В зависимостина то, что вам нужно сделать, с точки зрения упаковки, есть несколько вариантов.

...