首先看看问题描述:
用eclipse写的项目,在eclipse环境下面能够正常运行,但是,当把它打包成jar文件之后,就会有如下的错误:
Loading XML bean definitions from resource loaded from byte array
Hibernate 3.2.4.sp1
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.hibernate.cfg.Configuration.reset(Configuration.java:168)
at org.hibernate.cfg.Configuration.<init>(Configuration.java:187)
at org.hibernate.cfg.Configuration.<init>(Configuration.java:191)
at com.hour41.edu.searcher.db.HibernateSessionFactory.<clinit>(Hibernate
SessionFactory.java:24)
at com.hour41.edu.searcher.writer.IndexWriter.start(IndexWriter.java:49)
at com.hour41.edu.searcher.writer.IndexWriter.main(IndexWriter.java:36)
Caused by: java.lang.NullPointerException
at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java
:144)
at org.hibernate.cfg.Environment.<clinit>(Environment.java:529)
... 6 more
把org.hibernate.util.ConfigHelper.java里面的一段代码修改为:
if ( stream == null ) {
classLoader = Environment.class.getClassLoader();
if(classLoader != null)
stream = classLoader.getResourceAsStream( stripped );
}
然后出现的错误是:
%%%% Error Creating SessionFactory %%%%
org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.
xml
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1494)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1428)
at com.hour41.edu.searcher.db.HibernateSessionFactory.rebuildSessionFact
ory(HibernateSessionFactory.java:59)
at com.hour41.edu.searcher.db.HibernateSessionFactory.getSession(Hiberna
teSessionFactory.java:43)
at com.hour41.edu.searcher.writer.Zones.initial(Zones.java:33)
at com.hour41.edu.searcher.writer.IndexWriter.start(IndexWriter.java:53)
at com.hour41.edu.searcher.writer.IndexWriter.main(IndexWriter.java:36)
Caused by: org.dom4j.DocumentException: null Nested exception: null
at org.dom4j.io.SAXReader.read(SAXReader.java:485)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1484)
... 6 more
修改org.hibernate.util.DTDEntityResolver.java文件里面的一个方法为:
protected InputStream resolveInHibernateNamespace(String path) {
InputStream ret = null;
ClassLoader loader = this.getClass().getClassLoader();
if(loader != null)
ret = loader.getResourceAsStream(path);
if(ret != null)
return ret;
loader = Thread.currentThread().getContextClassLoader();
if(loader != null)
ret = loader.getResourceAsStream(path);
if(ret != null)
return ret;
return ret;
// return this.getClass().getClassLoader().getResourceAsStream( path );
}
到此,问题解决了。
Bug产生的原因:getClassLoader()不见得非null。jdk文档里面说,getClassLoader会返回null,如果class是被bootstrap(引导类)加载的话。刚好,我们在运行jar的时候,使用了-Xbootclasspath选项,这个选项会把它指示的jar文件使用bootstrap类进行加载(hibernate3.jar文件在其中)。
具体来说,sun的jvm里面包含了至少2个ClassLoader,一个是App Class Loader;一个是Ext Class Loader。调用Class.getSystemClassLoader()得到的是第一个App Class Loader,而App Class Loader的父亲是Ext Class Loader。一般的说,调用Thread.currentThread().getContextClassLoader()获得的也是App Class Loader。使用-Xbootclasspath选项加载的jar里面的类是没有class loader的,即通过某个类的getClass().getClassLoader()得到的是null值。同理,java内部带的各种东西(如java.lang.System)也是没有class loader的,因为它们其实也是通过-Xbootclasspath相似的方法加载的。要对这样的的类进行构建的话,可以调用ClassLoader的findLoadedClass()方法(必须新建一个ClassLoader的继承类,才能调用这个方法)。直接通过Ext Class Loader可以载入一般的类,包括了-Xbootclasspath定义的jar里面包含的类。
主要问题其实还是用了 -Xbootclasspath
java 的环境呀~~~无语
附带修改好的JAR包
分享到:
相关推荐
Spring 3.2.4是该框架的一个稳定版本,包含了丰富的功能改进和bug修复。这个"spring3.2.4lib source"压缩包中包含的就是Spring 3.2.4版本的源代码,对于开发者来说,它是理解Spring内部工作原理,进行定制化开发以及...
描述中提到,这些jar包是在整合Struts2.3.15、Hibernate3.6.10和Spring 3.2.4这三个流行开源框架的过程中被确定为必需的。Struts2是一个用于构建Web应用程序的MVC框架,而Spring则是一个全面的企业级应用开发框架,...
hibernate.connection.url=jdbc:mysql://localhost:3306/bug_dt hibernate.connection.username=root hibernate.connection.password=root ``` 注意:这里使用的是MySQL JDBC驱动`com.mysql.jdbc.Driver`,并指定了...
而"spring-framework-3.2.4.RELEASE"很可能是Spring框架的一个具体版本,3.2.4.RELEASE是其版本号,表明这个jar包是Spring 3.2系列的第4次修订版,通常包含修复的bug、增强的功能和安全更新。 在实际开发中,开发者...