为什么Clojure现在从JNLP失败了?

时间:2014-01-25 14:57:45

标签: java clojure jnlp clojure-java-interop

我有一个Java应用程序已经使用了一段时间,并使用嵌入式Clojure脚本进行一些计算。它的旧版本仍可以使用当前的JRE运行良好,但是如果我去构建一个新版本(只有代码的更改是在不相关的Java代码中),它就无法正常启动。它也在当地运行完美。只有JNLP受到影响。

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessDeclaredMembers")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.Class.checkMemberAccess(Unknown Source)
    at java.lang.Class.getDeclaredConstructors(Unknown Source)
    at clojure.core$generate_proxy.invoke(core_proxy.clj:137)
    at clojure.core$get_proxy_class.doInvoke(core_proxy.clj:261)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:617)
    at clojure.core$proxy.doInvoke(core_proxy.clj:335)
    at clojure.lang.RestFn.invoke(RestFn.java:1152)
    at clojure.lang.Var.invoke(Var.java:465)
    at clojure.lang.AFn.applyToHelper(AFn.java:248)
    at clojure.lang.Var.applyTo(Var.java:532)
    at clojure.lang.Compiler.macroexpand1(Compiler.java:6468)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6546)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyze(Compiler.java:6322)
    at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
    at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6009)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyze(Compiler.java:6322)
    at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
    at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5139)
    at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3751)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6558)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.access$100(Compiler.java:37)
    at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:529)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyze(Compiler.java:6322)
    at clojure.lang.Compiler.eval(Compiler.java:6623)
    at clojure.lang.Compiler.load(Compiler.java:7064)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__1451.invoke(core.clj:5530)
    at clojure.core$load.doInvoke(core.clj:5529)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$eval1658.invoke(core.clj:6154)
    at clojure.lang.Compiler.eval(Compiler.java:6619)
    at clojure.lang.Compiler.load(Compiler.java:7064)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.lang.RT.doInit(RT.java:447)
    at clojure.lang.RT.<clinit>(RT.java:329)
    at myapp(myapp.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javaws.Launcher.executeApplication(Unknown Source)
    at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
    at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
    at com.sun.javaws.Launcher.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

它失败的原因是:

RT.loadResourceScript("myapp/clojure_scripts.clj"); // Initialize Clojure script processor with our script

我们目前正在为这个应用程序使用自签名证书(我上周一直在与Comodo合作,试图获得一个值得信赖的证书,看看是否有帮助,但我仍然没有收到它和我需要这个应用程序尽快工作)。对我来说奇怪的是,旧版本(也以完全相同的方式自签名)起作用。我只是无法建立一个新版本。我已经回滚了我的配置,所以只有实际的java代码更改应该是不同的,但仍然没有运气。我在某处遗漏了某些东西......

1 个答案:

答案 0 :(得分:1)

你必须把它放到你的.jnlp文件中:

<security> <all-permissions/> </security>

此外,根据您的安全设置或使用Java 8,添加

:manifest {"Permissions" "all-permissions"}

到你的project.clj。 Clojure要求您授予“所有权限”权限。我不完全确定它是否对所有Clojure应用程序都是必要的,但我还需要AOT我的项目才能使它在JNLP应用程序中运行。将其添加到您的“:profiles:uberjar”:

:aot :all :omit-sources true