【问题标题】:How to pick CXF over Metro on Glassfish如何在 Glassfish 上选择 CXF 而不是 Metro
【发布时间】:2011-01-05 01:32:35
【问题描述】:

在 Glassfish 下运行我的企业应用程序时,我遇到了 the following problem(由其他人报告)。在 Jetty 下它工作正常。

javax/xml/ws/spi/Provider 提到创建 META-INF/services/javax.xml.ws.spi.Provider 资源,但这已随 CXF 提供,并且在 Glassfish 下创建额外的资源文件并不能解决此问题。

有谁知道如何确保 CXF 在 GlassFish 下被拾取?
(我正在使用具有 CXF 依赖项 2.2.5 的 Maven 多模块项目)

谢谢!
蒂姆


编辑#1

暂时跳过这个问题,只使用 Metro,但如果有人有任何指示,我真的很想知道如何使用 CXF。如果没有任何效果,我可能不得不切换 Web 应用程序容器(或查看 Metro满足我的要求)


编辑#2

一些解决方案通过在 sun-web.xml 文件中添加 <class-loader delegate="false"/> 来详细修复战争问题。但是,这不适用于非战争 ee 应用程序。

【问题讨论】:

  • 我发现只有一个 ejb 装在耳朵里才有同样的问题。我打开了一个赏金,因为我真的很想听到一些好的答案,而不必重复这个问题,因此我进行了编辑。
  • +1:这是我目前遇到的 Glassfish 的一个坏特性jsf:Glassfish 内置了 jsf 库,这些库会产生与其中包含 jsf 的代码有关的冲突。真的很烦人,解决方案值得开放的赏金!我也非常想知道解决方案!
  • 另外,this post 告诉我们事情如何只在某些 Glassfish 版本中起作用,而在某些版本中则不然。

标签: glassfish classpath jax-ws cxf java-metro-framework


【解决方案1】:

我想出(但不满意)的解决方案是使用JaxWsProxyFactoryBean。有一个例子[这里]。1

这是你必须做的事情的要点:

public static void main(String args[]) throws Exception {

    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

    // I didn't need these next 2 calls, but I doubt they hurt
    factory.getInInterceptors().add(new LoggingInInterceptor());
    factory.getOutInterceptors().add(new LoggingOutInterceptor());

    factory.setServiceClass(AuthService.class);
    factory.setAddress("http://localhost:7001/authManager/services/cxfAuth");

    // 'AuthService' is whatever your interface type is
    AuthService client = (AuthService) factory.create();

    Employee employee = client.getEmployee("0223938");
    System.out.println("Server said: " + employee.getLastName() + ", " + employee.getFirstName());
    System.exit(0);

}

【讨论】:

  • 您能否复制解决方案的相关部分?外部链接往往会随着时间的推移而中断..
【解决方案2】:

添加一个 sun-web.xml 并将 delegate=false 设置为类加载器:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD 
Application Server 9.0 Servlet 2.5//EN' 
'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd'> 
<sun-web-app> 
    <class-loader delegate="false"/> 
</sun-web-app> 

【讨论】:

  • 将此文件添加到 war web-inf 目录对我有用。谢谢!
【解决方案3】:

Metro(Glassfish 的 JAX-WS 实现)jar 可能包含在 Glassfish 中,您可以将它们从类路径中排除吗?由于您使用的是 maven,因此您应该分析 glassfish 依赖项并为 Metro jar 使用排除项。


您似乎需要在 Metro jar 之前将 CXF jar 放在应用程序类路径中。您可能无法修改系统类加载器/类路径,但您可以更改 Thread.currentThread().getContextClassLoader() 使其首先加载 CXF。 Glassfish 中可能还有一个类路径设置,您可以修改

查看javax.xml.ws.spi.FactoryFinder#find() 的源代码,了解提供程序的实际加载方式

【讨论】:

  • 很可能是这种情况,但我不确定如何解决这个问题。这是我上传到 GlassFish 的已编译 .war,因此 Maven 排除仍然有任何影响编译后? (即:这些排除是否会传递给战争并在服务器上使用?)
  • 所以当您将应用程序部署到 Glassfish 时,而不是在开发期间,它会选择 Metro 提供程序?
  • 我误解了你的情况,对不起。我已经更新了我的帖子
  • 嗯,上面链接的 FactoryFinder 有助于理解问题,但我仍然无法使用任何描述的方法解决我的问题..(.Provider & .properties 文件和系统属性)
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2013-06-17
  • 2019-04-02
  • 2019-09-23
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
相关资源
最近更新 更多