Почему сейчас Clojure терпит неудачу с JNLP?

У меня есть приложение 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, но все равно не повезло. Я что-то где-то упускаю...


person Brian Knoblauch    schedule 25.01.2014    source источник
comment
Теперь я также попытался повысить на нем привилегии (stackoverflow.com/questions/852453/) без последствий.   -  person Brian Knoblauch    schedule 28.01.2014
comment
Я все еще не возражал бы против ответа, но у меня не хватило времени, чтобы попытаться решить эту проблему. Мне пришлось перенести весь мой код Clojure на чистую Java и отказаться от использования Clojure в моем приложении JNLP.   -  person Brian Knoblauch    schedule 29.01.2014


Ответы (1)


Вы должны поместить это в свой .jnlp-файл:

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

Кроме того, в зависимости от ваших настроек безопасности или при использовании Java 8 добавьте

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

к вашему проекту.clj. Clojure требует, чтобы вы предоставили ему разрешение «все разрешения». Я не совсем уверен, что это необходимо для всех приложений Clojure, но мне также нужно было AOT мой проект, чтобы заставить его работать в приложении JNLP. Добавьте это в свой ":profiles :uberjar":

:aot :all :omit-sources true

person Daniel Ziltener    schedule 22.07.2014