jar с библиотеками bouncycastle: NoClassDefFoundError

Я изо всех сил пытаюсь заставить мой файл jar работать из веб-браузера. Когда я запускаю апплет из Eclipse, все в порядке, но из браузера я получаю NoClassDefFoundError:

Exception: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/bouncycastle/openpgp/PGPException
java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/bouncycastle/openpgp/PGPException
at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3116)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1498)
at java.lang.Thread.run(Thread.java:662)

Однако PGPException находится в каталоге org/bouncycastle/openpgp/ архива bcpg-jdk16-146.jar... Мой JAR содержит обе библиотеки из bouncycastle и класс моего апплета. Вот его архитектура:

META-INF
    -MANIFEST.MF
    -CNSAPPLE.SF
    -CNSAPPLE.RSA
lib
    -bcprov-jdk16-146.jar
    -bcpg-jdk16-146.jar
com
    -CNSApplet.class

Файл манифеста определяет путь к классу и основной класс следующим образом:

Путь к классу: lib/bcpg-jdk16-146.jar lib/bcprov-jdk16-146.jar

Основной класс: com.CNSApplet

И html-код, вызывающий апплет:

<applet code="com.CNSApplet.class" width="800" height="300" archive="cnsapplet.jar">

Конечно, файл html находится в том же каталоге, что и файл jar cnsapplet.

Я попытался создать банку с помощью метода солнца. и этот другой.


person renard    schedule 29.11.2011    source источник


Ответы (2)


Загрузчик классов Java по умолчанию не ищет файлы JAR, встроенные в ваш JAR. Это означает, что для включения библиотек в путь к классам вашего JAR вы можете сделать одно из следующих действий:

  1. Распакуйте библиотечные JAR-файлы, а затем упакуйте файлы классов в свой собственный JAR-файл.
  2. Оставьте библиотечные JAR-файлы вне своего JAR-файла, а затем ссылайтесь на них, используя файл манифеста (точно так же, как вы это делали).
person Kraylog    schedule 29.11.2011
comment
Я пробовал оба этих решения, но всегда получаю одно и то же исключение. Я также попытался удалить код, связанный с библиотеками BC и импортом соответственно. Но, видимо, когда браузер извлекает банку, это похоже на предыдущую банку с библиотеками BC! - person renard; 29.11.2011
comment
Звучит как проблема с кешированием - убедитесь, что вы очистили кеш браузера перед тестированием, так как большинство браузеров кэшируют JAR-файлы, чтобы не загружать их снова. - person Kraylog; 29.11.2011
comment
Вероятно, это было проблемой, теперь это работает! Спасибо, буду иметь ввиду в следующий раз - person renard; 29.11.2011

Запись манифеста Class-Path в файле JAR указывает на файловую систему (относительно файла JAR), а не на файлы, встроенные в файл JAR.

Либо распакуйте банки BC и добавьте их содержимое в свой файл JAR, либо предложите банки BC в качестве отдельных загрузок. Вы можете указать более одного файла JAR в атрибуте архива тега апплета, разделив их запятой.

Поскольку файлы BC подписаны и подпись теряется, если вы переупаковываете содержимое в свой собственный файл JAR, лучшим решением, вероятно, будет предлагать их как отдельные файлы и перечислять их в атрибуте архива.

person jarnbjo    schedule 29.11.2011