java - 网络启动应用程序 : SecurityException: setContextClassLoader

标签 java classloader java-web-start securityexception

我有一个连接到 Web 服务的 Webstart 应用程序。 list 有:

Permissions: all-permissions

jnlp 有:

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

但是,当创建与 Web 服务的连接时,我收到一个 java.lang.SecurityException: setContextClassLoader (下面是完整的堆栈跟踪)。当我直接运行应用程序(没有 webstart)时,它工作正常。我应该检查或更改设置中的任何内容来解决问题吗?

注意:我使用的是 Java 8。应用程序在构建 121 中运行良好,但在构建 123、124 或 125(最新的)中失败。因此,要么我的设置很好,但 b121 和 b123 之间引入了一个错误,要么 b123 中的错误已修复,这暴露了我的设置中的问题。

org.glassfish.hk2.api.MultiException: A MultiException has 2 exceptions.  They are:
1. java.lang.SecurityException: setContextClassLoader
2. java.lang.IllegalStateException: Unable to perform operation: create on org.jvnet.hk2.internal.DynamicConfigurationServiceImpl

    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:362) ~[na:na]
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:454) ~[na:na]
    at org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:119) ~[na:na]
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2296) ~[na:na]
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:590) ~[na:na]
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:577) ~[na:na]
    at org.glassfish.hk2.utilities.ServiceLocatorUtilities.enablePerThreadScope(ServiceLocatorUtilities.java:89) ~[na:na]
    at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:144) ~[na:na]
    at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:137) ~[na:na]
    at org.glassfish.jersey.client.ClientConfig$State.initRuntime(ClientConfig.java:352) ~[na:na]
    at org.glassfish.jersey.client.ClientConfig$State.access$000(ClientConfig.java:85) ~[na:na]
    at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:117) ~[na:na]
    at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:114) ~[na:na]
    at org.glassfish.jersey.internal.util.collection.Values$LazyValue.get(Values.java:311) ~[na:na]
    at org.glassfish.jersey.client.ClientConfig.getRuntime(ClientConfig.java:669) ~[na:na]
    at org.glassfish.jersey.client.ClientRequest.getConfiguration(ClientRequest.java:214) ~[na:na]
    at org.glassfish.jersey.client.JerseyInvocation.validateHttpMethodAndEntity(JerseyInvocation.java:124) ~[na:na]
    at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:97) ~[na:na]
    at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:90) ~[na:na]
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:396) ~[na:na]
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:296) ~[na:na]
    at com.assylias.fund.master.impl.DefaultUserMaster.authenticate(DefaultUserMaster.java:55) ~[na:na]
    at com.assylias.bigblue.gui.javafx.users.Login$AuthenticationTask.call(Login.java:342) ~[na:na]
    at com.assylias.bigblue.gui.javafx.users.Login$AuthenticationTask.call(Login.java:325) ~[na:na]
    at javafx.concurrent.Task$TaskCallable.call(Unknown Source) ~[na:na]
    at java.util.concurrent.FutureTask.run(Unknown Source) ~[na:1.8.0-ea]
    at java.util.concurrent.CompletableFuture$AsyncRun.exec(Unknown Source) ~[na:1.8.0-ea]
    at java.util.concurrent.ForkJoinTask.doExec(Unknown Source) ~[na:1.8.0-ea]
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source) ~[na:1.8.0-ea]
    at java.util.concurrent.ForkJoinPool.scan(Unknown Source) ~[na:1.8.0-ea]
    at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) ~[na:1.8.0-ea]
    at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) ~[na:1.8.0-ea]
Caused by: java.lang.SecurityException: setContextClassLoader
    at java.util.concurrent.ForkJoinWorkerThread$InnocuousForkJoinWorkerThread.setContextClassLoader(Unknown Source) ~[na:1.8.0-ea]
    at org.glassfish.hk2.utilities.reflection.ReflectionHelper$2.run(ReflectionHelper.java:1049) ~[na:na]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0-ea]
    at org.glassfish.hk2.utilities.reflection.ReflectionHelper.setContextClassLoader(ReflectionHelper.java:1045) ~[na:na]
    at org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1101) ~[na:na]
    at org.jvnet.hk2.internal.ClazzCreator.createMe(ClazzCreator.java:261) ~[na:na]
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:336) ~[na:na]

最佳答案

我应该更仔细地阅读堆栈跟踪。该异常是由 java.util.concurrent.ForkJoinWorkerThread$InnocouslyForkJoinWorkerThread.setContextClassLoader 引发的,它是默认的无权限工作线程。已进行以下更改:this post这是diff .

我正在通过以下方式访问网络服务:

CompletableFuture.runAsync(accessWebservice());

它使用默认的 ForkJoinPool 线程池,该线程池本身依赖于新的 InnocouslyForkJoinWorkerThread,如果调用 setContextClassLoader,它将引发异常。

解决方法:

CompletableFuture.runAsync(accessWebservice(), executor); //provide an executor

关于java - 网络启动应用程序 : SecurityException: setContextClassLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440563/

相关文章:

java - 如何在 jnlp 文件中区分 32 位和 64 位 java 版本

java - 如何检测 INDEX.LIST 是否被 Web Start 使用?

javascript - 重定向在 springboot Controller 中不起作用

java - ModuleLayer 和 ClassLoader 有什么关系?

java - 为什么我的代码会产生错误?

java - JNLP 和 FileOutputStream

java - 如何重定向库的 Sys.err?

java - 通过 Elasticsearch Java API 批量更新抛出异常

Java Graphics2D 颜色问题

java - Java EE 规范需要澄清