Не может ссылаться на класс, упакованный в Jar1, который заархивирован в Jar2 во время работы Jar2 - PullRequest
0 голосов
/ 13 мая 2018

У меня возникает эта странная проблема, когда мой коллега запускает мой Jar в JRE той же версии, что и моя среда разработки (Java1.7 + Eclipse Indiago).

  1. Добавить Jar для построения пути и обратиться к некоторым классам в этом jar;
  2. Скомпилируйте, успешно запустите проект как приложение Java в Eclipse;
  3. Экспортируйте проект как Runnable Jar с опцией - «Упаковать необходимые библиотеки в сгенерированный Jar».
  4. Запустите экспортированный Jar в командной строке 'java -jar xxx.jar' на моем компьютере и получите ожидаемый результат.
  5. Запустите тот же Jar на другом компьютере с тем же JRE, но получите сообщение об ошибке типа ClassNotFound, сообщающее, что класс, указанный из внутреннего Jar, не может быть найден, как показано ниже:
Exception in thread "main" java.lang.NoClassDefFoundError: com/test/commo
n/communication/BaseNotificationEvent
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:56)
Caused by: java.lang.ClassNotFoundException: com.test.common.communicatio
n.BaseNotificationEvent
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 14 more

Решение на данный момент состоит в том, чтобы экспортировать исполняемый jar с опцией «копировать необходимые библиотеки в подпапку рядом с сгенерированным Jar», и это работает как на моем, так и на другом компьютере.

Но я не воспринимаю это как окончательное решение, потому что мне приходится передавать несколько файлов, а не один Jar при выпуске моей программы ... что выглядит не элегантно ^ _ ^

...