1

我有一个已经使用了一段时间的 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 代码更改应该有所不同,但仍然没有运气。我在某处遗漏了一些东西......

4

1 回答 1

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

于 2014-07-22T02:48:37.647 回答