今天公司要求将tomcat服务器切换到weblogic,折腾了一天,发现了一些必须注意的地方。 1、classes里面文件读取问题: 在tomcat里面,WAR包是被完全解压到webapps下面的,包括WEB-INF/classes下面的所有文件都被解压出来,意即可以通过绝对路径D:/tomcat/webapps/asd/WEB-INF/classes/config.xml来进行访问,但是再weblogic里面就不一样了。 在weblogic里面,如果是WAR包的方式部署,那么服务器同样会将内容解压到一个临时目录(/home/weblogic/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/wcity/v2s20e/war/),但是我们进去后会发现WEB-INF/classes里面空空如也,所以这个时候我们还想通过绝对路径来访问classes下面的文件的话就不可能了。 那么这里面的东西跑哪了呢?weblogic会将这类的东西打包成一个jar包,放在WEB-INF/lib/_wl_cls_gen.jar下面,所以我们要想再访问classes里面的文件,就必须采用读取jar包的方式来完成了。 举个例子,我在classes下面有一个config.xml文件,在tomcat下面,就可以通过绝对路径来访问:
- FileReader fr = new FileReader(Config.class.getResource("/").getPath() + "config.xml");
在weblogic下面就只能这样访问:
- InputStream in = Config.class.getResourceAsStream("/config.xml");
2、struts2多配置文件无法加载问题: 由于有多个struts文件,所以在主配文件里面进行了如下引入 <include file="struts/struts-*.xml" /> 在tomcat里面正常,但是再weblogic里面就会报异常:unable to attain an URLClassLoader,Error loading configuration file struts.xml等,因为weblogic不支持通配符引入文件,所以在这里老老实实的奖引入文件都写入就行了
- <include file="struts/struts-client.xml" />
- <include file="struts/struts-public.xml" />
3、hibernate异常问题ClassNotFoundException: org.hibernate.hql.ast.HqlToken:
weblogic和hibernate的antlr之冲突已经司空见惯了,该类问题网上已有很多解决办法,在此不重复了。 4、slf4j和log4j适配问题: 我的应用中使用了slf4j和log4j,并且也使用了slf4j-log4j12-1.6.1.jar进行适配,在tomcat下正常,在weblogic下面就只能打印log4j的日志,由此看来应该是weblogic的问题,网上查了下,得知由于weblogic是个企业级产品,所以集成了很多的jar包,这些jar包的默认加载顺序是大于应用里面lib中的jar包顺序的,此原因也直接导致了刚才说的hibernate的问题,所以现在需要解决的就是优先加载WEB-INF/lib下面的jar问题了。 在项目的WEB-INF目录下新建weblogic.xml,内容如下: [HTML] 纯文本查看 复制代码
<?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 [url]http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd[/url] [url]http://xmlns.oracle.com/weblogic/weblogic-web-app[/url] [url]http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd[/url]">
<!-- 为了解决slf4j和log4j的兼容问题,不然slf4j打印的日志就不出来了 -->
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>org.slf4j</wls:package-name>
</wls:prefer-application-packages>
</wls:container-descriptor>
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
</wls:weblogic-web-app>
这样即解决了优先加载jar包以及slf4j的问题了。
|