1、背景java
Web項目M 引用Sub工程,Sub工程打包成Jar形式被M引用。web
Sub裏有這樣一段獲取服務器時間的代碼;redis
Date date = null;sql
Session session = this.getSessionFactory().openSession();apache
String sql = "select sysdate as mydate from dual";服務器
SQLQuery query = session.createSQLQuery(sql);session
try {app
query.addScalar("mydate",Hibernate.TIMESTAMP);oop
date = (Date) query.uniqueResult();this
System.out.println("XXXX:"+org.hibernate.Hibernate.TIMESTAMP.getClass());
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
date = new Date();
} finally {
session.close();
}
Sub中用的是Hibernate 3.6.0 Final版本,IVY依賴以下
<dependency org="org.hibernate" name="hibernate-core" rev=" 3.6.0 Final" conf="compile->default"/>
只是參與編譯,不會編譯到Sub jar中。
M依賴的是Hibernate 3.3.2.GA版本,
<dependency org="org.hibernate" name="hibernate-core" rev=" 3.3.2.GA" conf="zip->default"/>
二,現象。
那麼,問題來了,目前依賴狀況會致使M 項目起不來,報錯爲:
信息: Illegal access: this web application instance has been stopped already. Could not load org.apache.commons.pool2.impl.DefaultPooledObject. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1750)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1709)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:80)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:836)
at org.apache.commons.pool2.impl.GenericObjectPool.ensureIdle(GenericObjectPool.java:895)
at org.apache.commons.pool2.impl.GenericObjectPool.ensureMinIdle(GenericObjectPool.java:874)
at org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor.run(BaseGenericObjectPool.java:1055)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
若是把M中對Hibernate的依賴也換成 3.6.0.Final則在運行到上邊代碼段時會出現 java.lang.NoSuchFieldError: TIMESTAMP。
3、應對策略
以前有同事提醒我說,Sub中Hibernate Core只參與編譯,因此一直沒往sub中考慮,無奈怎麼試都有問題,最後想到把Sub中HibernateCore換成3.3.2.GA版本,問題消失,而後,爲啥會這樣?留個尾巴,繼續找吧,找到了再來更新。