对于我们的Kunagi Java Web应用程序,我们有一个签名kunagi.jar文件,其中包含我们的类以及嵌入式Tomcat 6中的类java -jar kunagi.jar。在调用时,它可以完美运行。
kunagi.jar
java -jar kunagi.jar
但是当使用Java WebStart启动它时,嵌入式Tomcat启动时出现异常:
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.org.apache.catalina.deploy) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393) at java.security.AccessController.checkPermission(AccessController.java:553) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkPackageAccess(SecurityManager.java:1529) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:291) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1018) at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2444) at java.lang.Class.getMethod0(Class.java:2687) at java.lang.Class.getMethod(Class.java:1620) at org.apache.catalina.startup.SetPublicIdRule.begin(WebRuleSet.java:639) at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1276) ... 33 more
当然kunagi.jar是签名的,否则它甚至不会启动。它接缝了Java WebStart,从而在全局范围内启用Java安全性,从而以某种方式“嵌入”了Tomcat,并且初始化失败。
这是JNLP文件:
<?xml version="1.0" encoding="UTF-8"?> <jnlp spec="1.0+" codebase="http://kunagi.org/webstart" href="kunagi.jnlp"> <information> <title>Kunagi</title> <vendor>Kunagi Team</vendor> <homepage href="http://kunagi.org"/> <description>SCRUM Tool</description> <description kind="short">SCRUM Tool</description> <offline-allowed/> </information> <security> <all-permissions/> </security> <resources> <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/> <jar href="kunagi.jar" main="true" /> </resources> <application-desc name="Kunagi" main-class="katokorbo.Katokorbo"/> <update check="always"/> </jnlp>
有没有一种方法可以在Java WebStart中禁用对Tomcat的安全检查?或者如何配置嵌入式Tomcat允许访问org.apache.catalina...?
org.apache.catalina...
我已经解决了以下问题:
WebStart启动我的应用程序后,请禁用安全管理器。我main()方法的第一行:
main()
System.setSecurityManager(null);
告诉Tomcat使用默认的类加载器:
context.setLoader(new WebappLoader(getClass().getClassLoader()));
现在,Tomcat在WebStart中运行:-D