Ошибке типа noclassdeffounderror с апплета с JDBC


Я создал апплет с помощью Eclipse:

package gui;
public class MyApplet extends JApplet {

Этот апплет нуждается в двух внешних jar: proj.кувшин и жар-птицы полны.jar (jdbc)

Поэтому я создал HTML вот так, в той же папке, что и jars:

<APPLET CODE="gui.MyApplet.class" width="650" height="650" ARCHIVE="proj.jar,myApplet.jar,firebirdsql-full.jar">
    <a href="http://java.com/en/download/index.jsp">Java</a>
</APPLET>

Я также попытался изменить порядок jar в атрибуте ARCHIVE.

Однако я продолжаю получать следующую ошибку (в консоли java):

Exception in thread "thread applet-gui.MyApplet.class-2" java.lang.NoClassDefFoundError: Could not initialize class org.firebirdsql.jdbc.FBDriver
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at db.DAO.getDBConnection(DAO.java:45)
    at db.MyDAO.initPreparedStatements(MyDAO.java:37)
    at db.MyDAO.<init>(MyDAO.java:33)
    at db.MyDAO.getInstance(MyDAO.java:27)
    at model.Controller.<init>(Controller.java:27)
    at gui.MyApplet.getJTabbedPane(MyApplet.java:81)
    at gui.MyApplet.getJContentPane(MyApplet.java:69)
    at gui.MyApplet.init(MyApplet.java:52)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Я что-то упустил?

Редактировать:

Как-то, отлаживая это, Я также получил другой stacktrace:

Exception in thread "thread applet-gui.MyApplet.class-1" 
java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at db.DAO.getDBConnection(DAO.java:45)
    at db.MyDAO.initPreparedStatements(MyDAO.java:37)
    at db.MyDAO.<init>(MyDAO.java:33)
    at db.MyDAO.getInstance(MyDAO.java:27)
    at model.Controller.<init>(Controller.java:27)
    at gui.MyApplet.getJTabbedPane(MyApplet.java:81)
    at gui.MyApplet.getJContentPane(MyApplet.java:69)
    at gui.MyApplet.init(MyApplet.java:52)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission FBLog4j read)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
    at java.lang.System.getProperty(Unknown Source)
    at org.firebirdsql.logging.LoggerFactory.getLogger(LoggerFactory.java:36)
    at org.firebirdsql.logging.LoggerFactory.getLogger(LoggerFactory.java:72)
    at org.firebirdsql.jdbc.FBDriver.<clinit>(FBDriver.java:63)
    ... 12 more
2 3

2 ответа:

Теперь, когда мы видим вторую трассировку стека, становится ясно, что происходит: драйвер JDBC пытается использовать Log4J для ведения журнала. Он пытается получить параметры ведения журнала из системного свойства в статическом инициализаторе класса драйвера, и это не удается, потому что неподписанные апплеты не имеют разрешения на чтение системных свойств.

Вы можете подписать свой апплет и предоставить это свойство (java.утиль.PropertyPermission fblog4j читать) к нему, но, честно говоря, это не сулит ничего хорошего; я ожидал бы этого чтобы бросить какое-то другое исключение безопасности, как только вы исправите это. Если этот драйвер не был написан для работы из апплета, то, скорее всего, это будет дурацкая попытка.

Неподписанные апплеты работают в "ограниченной" песочнице, так сказать. Подробнее здесь в документации Oracle: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html

Мое предположение, как и говорит исключение, заключается в том, что FBDriver.java: 63 (inside Firebird) делает то, что JVM не позволяет.

Кстати, немного странно загружать драйвер JDBC в апплет, но я отвлекся..