Hibernate core 3.3.2.GA 與 3.6.0.Final引起的一個血案

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版本,問題消失,而後,爲啥會這樣?留個尾巴,繼續找吧,找到了再來更新。

相關文章
相關標籤/搜索