NoClassDefFoundError с апплетом jdbc
Я создал апплет с использованием Eclipse:
package gui;
public class MyApplet extends JApplet {
Этому апплету нужны два внешних jar-файла: proj.jar и firebirdsql-full.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>
Я также пытался изменить порядок банок в 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)
Я что-то пропустил?
Редактировать:
Каким-то образом при отладке я также получил другую трассировку стека:
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 ответа
Теперь, когда мы видим вторую трассировку стека, ясно, что происходит: драйвер JDBC пытается использовать Log4J для ведения журнала. Он пытается получить параметры регистрации из системного свойства в статическом инициализаторе класса драйвера, и это терпит неудачу, потому что неподписанные апплеты не имеют разрешения на чтение системных свойств.
Вы можете подписать свой апплет и предоставить ему это свойство (java.util.PropertyPermission FBLog4j read), но, честно говоря, это не сулит ничего хорошего; Я ожидаю, что это вызовет какое-то другое исключение безопасности, как только вы исправите это. Если этот драйвер не был написан для работы из апплета, вероятно, это будет попытка дурака.
Неподписанные апплеты работают, так сказать, в "закрытой" песочнице. Более подробную информацию можно найти в документации Oracle: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html
Мое предположение, очень похожее на исключение, заключается в том, что FBDriver.java:63 (внутри Firebird) делает то, что JVM не допустит.
Кстати, немного странно загружать драйвер JDBC внутри апплета, но я копаю..