weblogic to tomcat

1 getResourceAsStream() path issue

ec.jar was put on /WEB-INF/lib
ec.jar structure:
-com/abc/classA
-conf/config.properties

or
put them on /WEB-INF/classes

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ReadPropFromJar {

	private static String path="/conf/config2.properties";
	private static Properties p=new Properties();
	public ReadPropFromJar(){
		InputStream in=ReadProperties.class.getResourceAsStream(path);
		try{
		p.load(in);
		//p.getProperty(key);
		}catch(IOException ex){
			ex.printStackTrace();
		}
	}
	public static void main(String[] args){
		ReadPropFromJar rp=new ReadPropFromJar();
		System.out.println(rp.getKey("db.user"));
				
	}
	
	public String getKey(String key){
		return p.getProperty(key);
	}
}

如果path"/"开头,表示以classpath为准(classes,lib)
如果path"conf/config.properties",表示这个文件在class对象的相对目录里


2 charset issue:
tomcat default use iso-8859-1 as URIEncoding
url="jdbc:mysql://localhost/app?useUnicode=true&characterEncoding=utf-8"

3 classloader conflict

默认情况,weblogic按委托机制加载类,效果就是越上层的classloader优先级越高,一个class如果在上层classloader能加载到,就不会让下面的classloader加载。

Tomcat默认先从webappclassloader载入class,如果失败则请求父ClassLoader的代理
这样可以让不同的WEB APP之间的类载入互不干扰.


weblogic也有webappClassloader, 但是需要配置才生效
在weblogic.xml中配置<prefer-web-inf-classes>,可以让web application classloader优先在自己war范围内加载类,找不到的类才会请求上层classloader

weblogic还有个Filtering loader比较有意思。Filtering classloader是个特殊的classloader,它并不会加载任何类,而是起到控制类加载优先级的作用。在weblogic-application.xml中配置<prefer-application-packages>,可以限制对于指定的类不再向上层classloader请求,也就是限制在EAR的范围之内加载。

猜你喜欢

转载自jd2bs.iteye.com/blog/1870165