Weblogic版:10.3.5
JSF版本(接口,impl): Mojarra 2.0.3
我有一个JSF EAR
应用程序,它由WAR
文件和JAR
文件组成。
WAR
文件包含以下两个Maven
依赖项:
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.3</version>
</dependency>
运行时,以下代码段正确会将Mojarra
的当前服务中版本报告为v2.0.3:
public void getMojarraVersion() {
Package p = FacesContext.class.getPackage();
System.out.println("Mojarra version: " + p.getImplementationTitle() + " " + p.getImplementationVersion());
}
然而,weblogic启动日志报告在启动应用程序时使用了容器提供的不同的旧版本:
INFO: Initializing Sun's JavaServer Faces implementation (1.2_03-b04-FCS) for context '/myApp'
尽管有以下weblogic.xml
配置,但WAR
文件的web.xml
文件与WEB-INF
文件一起部署,这会反转类加载器:
<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
</wls:weblogic-web-app>
经过几天的挖掘,我发现服务器类路径中包含以下两个JAR文件:
${WEBLOGIC_HOME}/wlserver_10.3/server/lib/consoleapp/webapp/WEB-INF/lib/jsf-api.jar
${WEBLOGIC_HOME}/wlserver_10.3/server/lib/consoleapp/webapp/WEB-INF/lib/jsf-impl.jar
这些文件由Weblogic
10.3.5。
暂时删除这两个JAR文件并重新启动服务器导致日志开始报告新版本正在使用中:
INFO: Initializing Mojarra 2.0.3 for context '/myApp'
因此,上述证据表明,在加载应用程序时,对于服务器类路径(即${WEBLOGIC_HOME}/wlserver_10.3/server/lib
)提供的任何资源,颠覆类加载器层次结构的Weblogic配置不起作用。
有趣的是,我可以删除weblogic.xml
文件,我发现:
答案 0 :(得分:3)
Sometime <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
can't specify the lib. You need to use: <wls:prefer-application-packages>
and <wls:prefer-application-resources>
. Below is an example (remove wls: for old weblogic version):
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>META-INF/services/javax.xml.bind.JAXBContext</wls:package-name>
<wls:package-name>com.google.common.*</wls:package-name>
<wls:package-name>org.slf4j.*</wls:package-name>
<wls:package-name>org.apache.logging.log4j.*</wls:package-name>
</wls:prefer-application-packages>
<wls:prefer-application-resources>
<wls:resource-name>META-INF/services/javax.xml.bind.JAXBContext</wls:resource-name>
<wls:resource-name>com.google.common.*</wls:resource-name>
<wls:resource-name>org.slf4j.*</wls:resource-name>
<wls:resource-name>org.apache.logging.log4j.*</wls:resource-name>
</wls:prefer-application-resources>
</wls:container-descriptor>
On top of weblogic.xml use this:
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.2/weblogic-web-app.xsd">
答案 1 :(得分:2)
prefer-web-inf-classes设置仅适用于Web应用程序级别 我无法从提供的输出中判断,但看起来你的耳朵的类加载器正在加载其他jar文件。你的战争的类加载器将根据你的设置加载和使用更新的jar,即使root应用程序加载了其他jar。
如果您希望在耳朵级别看到这种情况,可以添加一个类加载器过滤器。 WebLogic 12c允许在战争和耳级:Link
我只读过10.3.5允许过滤器在耳朵级:Link
答案 2 :(得分:-1)
8bitjunkie-嗨。我相信您的第三方jar文件是由您的应用程序或应用程序的第三方库中使用的框架和内置监听器/类添加逻辑包含在您的EAR中的。在您的情况下,框架可能是春天。 如果是这种情况,那么,
您需要在创建EAR之前修改主应用程序的配置,以便删除第三方库的依赖关系。例如:在Ivy.xml中,用于下载此&#39; jsf-impl&#39;的所有依赖项。广口瓶中。
您需要修改主应用程序的代码逻辑,以根据上下文实现servletcontextlistener类或servletcontainerInitializer类,即如果您的类构成您自己的Web应用程序的一部分,则必须使用前者和如果jar打包到WAR,则必须使用letter,而WAR又绑定到EAR并作为EAR应用程序部署在服务器中。希望这有帮助