在 AbstractInstallerScreen 中创建 Jersey 客户端的依赖性问题

Dependency problems creating Jersey client in AbstractInstallerScreen

在我们的 Install4j 项目中,我们想使用 Jersey 调用我们的网络服务器。我们为此任务实现了一个 AbstractInstallAction,它使用

调用服务器
Client client = Client.create(new DefaultClientConfig());

这在 CustomAction 中工作正常;现在我想在 AbstractInstallerScreen 中使用相同的代码;在屏幕中调用同一代码行会导致以下异常(我缩短了日志条目,但我想你会明白这一点):

Oct 06, 2016 10:10:24 AM com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: Missing dependency for constructor public com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers) at parameter index 0
  SEVERE: Missing dependency for constructor public com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$Text(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers) at parameter index 0
  SEVERE: Missing dependency for constructor public com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers) at parameter index 0
  SEVERE: Missing dependency for constructor public com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$App(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers) at parameter index 0
  SEVERE: Missing dependency for constructor public com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers) at parameter index 0
  SEVERE: Missing dependency for constructor public com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers) at parameter index 0
  SEVERE: Missing dependency for constructor public com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$App(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers) at parameter index 0
  SEVERE: Missing dependency for constructor public com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$Text(com.sun.jersey.spi.inject.Injectable,javax.ws.rs.ext.Providers) at parameter index 0
  ...
  SEVERE: Missing dependency for field: com.sun.jersey.spi.MessageBodyWorkers com.sun.jersey.json.impl.provider.entity.JSONWithPaddingProvider.bodyWorker
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
    at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
    at com.sun.jersey.api.client.Client.<init>(Client.java:188)
    at com.sun.jersey.api.client.Client.<init>(Client.java:171)
    at com.sun.jersey.api.client.Client.create(Client.java:683)
   ...

在我的 POM 文件中,我使用以下方式加载球衣依赖项:

<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-multipart</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
</dependency>

所以问题是:我应该如何在安装程序屏幕中进行调用,这样我就不会收到提示缺少依赖项的异常,或者在自定义操作中使用 jersey 有什么区别?

这是由于 JAX-WS 滥用了上下文 class 加载器。

出于这个原因,在脚本和操作中,install4j 临时重置上下文 class 加载程序,但在屏幕和表单组件中,这不会发生。

如果您这样调用代码:

ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
try {
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
    // TODO Add your code that uses JAX-WS
} finally {
    Thread.currentThread().setContextClassLoader(oldContextClassLoader);
}

应该可以。