首先看看问题描述:
用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包
分享到:
相关推荐
在给定的“struts2.3.4+spring3.2.4+hibernate3.6.5”压缩包中,这三大框架的特定版本被集成,并且包含了注解支持,这使得配置更加简洁,代码更加可读。 **Struts2** 是一个基于MVC设计模式的Web应用框架,它极大地...
Spring3.2.4 + Quartz2.2.0集成实例 可参考http://blog.csdn.net/liangbinny/article/details/17284691
基于python3.8 + django3.2.4 + mysql8 + redis + uwsgi + nginx 的一个多主题个人博客系统 功能点 用户注册,登录,登出,注销,密码邮箱验证重置 markdown文章渲染,代码高亮,支持后台markdown编写文章等 文章...
springMVC3.2+Hibernate4+freemarker 代码框架采用springMVC3.2.4+hibernate4.2.8+freemarker2.3.16 功能方面只是一个简单的注册登录,前台使用freemarker渲染,使用了freemarker自定义标签。
Spring3.2.4+Quartz2.2.0 实例 <!-- 启动触发器的配置开始 --> class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 启动触发器的配置结束 --> <!-- 调度的配置...
标题 "Apache2.2.14 + MySql5.1.41 + PHP5.3.1 + PhpMyAdmin3.2.4 + ZendOptimizer 3.3.0配置" 描述了一个集成的Web开发环境,这个环境包含了多个关键组件,用于搭建PHP驱动的Web应用程序。以下是对这些组件的详细...
在本场景中,我们讨论的是Hadoop 3.2.4与HBase 2.5.8的版本组合。 **Hadoop 3.2.4** 是Apache Hadoop项目的一个稳定版本,它在Hadoop 3.x系列中提供了许多增强和改进。Hadoop是一个开源框架,主要用于存储和处理大...
在本项目中,我们探索的是一个使用Spring 3.2.4、MyBatis和Maven构建的Web应用程序。这个项目的核心目标是展示如何将这三个关键的技术组件整合在一起,以创建一个高效、可维护的Java Web应用。让我们逐一深入探讨...
标题 "小项目框架改造二:spring3.2.4+struts2.1.8+mybatis3.2.6整合修改" 提供了一个关于整合老旧但仍然广泛使用的Java Web开发框架的场景。这个项目涉及了Spring、Struts2和MyBatis三个核心组件的集成与优化。下面...
本项目基于“spring4.0.2+mybatis3.2.4+sharding-jdbc1.4.2”搭建了一个实现分库分表、主从复制以及事务管理的解决方案。下面将详细讲解这个集成框架中的关键知识点。 首先,Spring 4.0.2 是一个广泛使用的Java应用...
初学者的福音,最近一直在折腾springboot版本的问题,发现在集成三方库时v2和v3版本完全不兼容。平滑升级相当困难,在用springboot3做新项目时也遇到了很多官方文档不详细的原因,所以特整理了一个干净版本的开发...
在本项目中,我们主要探讨的是如何利用Spring 3.2.4与MyBatis 3.1.1这两个框架进行集成开发。Spring作为一个全面的轻量级应用框架,提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,而MyBatis则是一个优秀的...
在HibernateTools 3.2.4版本中,它包含了一系列的特性与插件,以支持更便捷地进行对象关系映射(ORM)管理和数据库交互。 一、Hibernate Tools的主要功能: 1. **逆向工程(Reverse Engineering)**:能够从现有的...
本文将详细讲解如何将Spring 3.2.4、Struts2.1.8和MyBatis3.2.6这三个流行的技术进行整合,形成一个小型项目框架,以提高开发效率和代码的可维护性。 首先,Spring是一个全面的Java企业级应用框架,提供了依赖注入...
这里我们将围绕“hibernate3.2.4 源代码”这一主题,探讨Hibernate的核心概念、设计模式以及关键组件。 1. **核心概念**: - **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它允许开发者用面向对象的方式...
《HibernateTools 3.2.4 Beta1:高效数据库管理和对象关系映射工具》 HibernateTools是Java开发者的重要辅助工具,它为Hibernate框架提供了一系列实用的集成开发环境(IDE)插件和命令行工具,极大地简化了数据操作...
《HibernateTools 3.2.4:提升Hibernate开发效率的利器》 HibernateTools是一个强大的开源工具集,专门针对Java开发者,用于辅助开发基于Hibernate框架的项目。它为开发者提供了多种实用功能,包括数据库反向工程、...
java框架 Spring-3.2.4源码+lib库,直接分享给大家,不用到处找了。