2017-05-12 18 views
0

我试图覆盖JAX-WS Web服务的Apache CXF实现。根据JAX-WS = When Apache CXF is installed it "steals" default JDK JAX-WS implementation, how to solve?,我试图创建/覆盖Provider实现。Tomcat的类加载器getResources结果顺序(webapp第一个)

使用该配置,我们在至少两个jar包中包含javax.xml.ws.spi.Provider:/tomcat/lib/cxf-rt-frontend-jaxws-*.jar并在我们自己的jar/Tomcat的/ webapps /目录APPX/WEB-INF/META-INF /服务)。

通过首先加载webapp资源的默认行为,我们期望首先获取我们自己的jar。但事实并非如此。

做了一些调试,似乎Tomcat的类加载器的getResources(“resource-name”)方法正在返回Enumeration,其中第一个元素如果从/ tomcat/lib开启。由于WS Provider正在使用第一个元素,它仍然使用原始的CXF实现。

默认的类加载器是ParallelWebappClassLoader。我们已经切换到WebappClassLoader,但它保持了同样的问题。

然后,我们创建了自己的类加载器扩展WebappClassLoader,只有重写getResources方法(除去/tomcat/lib/cxf-rt-frontend-jaxws-*.jar JAX-WS提供程序实现),这是现在加工。但这只是一个解决方案,使其工作,它确实不应该有必要这样做。

那么,关于ClassLoader.getResources(String name)如何首先返回webapp条目的任何想法?

应该已经是默认值,但searchExternalFirst =“假”没有任何魔法(也有“真”)

回答

0

您是否尝试过设置你的context.xml以下? <Loader delegate="false"/> 描述在tomcat docs