3

我使用 Eclipse 创建了一个小程序:

package gui;
public class MyApplet extends JApplet {

这个小程序需要两个外部 jar:proj.jar 和 firebirdsql-full.jar (jdbc)

因此,我在与罐子相同的文件夹中创建了这样的 HTML:

<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属性中的 jar 顺序。

但是我不断收到以下错误(在 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
4

2 回答 2

4

现在我们看到了第二个堆栈跟踪,很清楚发生了什么:JDBC 驱动程序正在尝试使用 Log4J 进行日志记录。它试图从驱动程序类的静态初始化程序中的系统属性中获取日志记录参数,但它失败了,因为未签名的小程序没有读取系统属性的权限。

您可以签署您的小程序并将该属性(java.util.PropertyPermission FBLog4j 读取)授予它,但老实说,这不是好兆头;我希望它会在您修复此异常后立即引发其他一些安全异常。如果这个驱动程序没有被编写成可以从一个小程序工作,那么这很可能是一个愚蠢的差事。

于 2012-05-20T12:52:51.690 回答
2

可以说,未签名的小程序在“受限”沙箱中运行。更多信息请参见 Oracle 文档:http ://docs.oracle.com/javase/tutorial/deployment/applet/security.html

我的猜测,就像例外所说的那样,是 FBDriver.java:63 (在 Firebird 内部)正在做一些 JVM 不允许的事情。

顺便说一句,在小程序中加载 JDBC 驱动程序有点奇怪,但我离题了..

于 2012-05-20T12:15:32.890 回答