- 浏览: 697779 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yzs5273:
没什么用。都试过了
WIN7下CS不能全屏的解决方法 -
di1984HIT:
不错,学习了
读取本地计算机中的安装程序列表 -
ffedu:
[flash=200,200][url][img][list] ...
linux/unix中如何用find命令详解,非常详细的介绍,比man find强100倍(转) -
lintghi:
...
Log4j使用相对路径指定log文件及使用总结 -
nick.s.ni:
唉,Java中引用的包没有介绍啊,如果数据库用UTF-8的格式 ...
Oracle 中Java 对象与PL/SQL类型的映射及使用(转)
Java本身是一种设计的非常简单,非常精巧的语言,所以Java背后的原理也很简单,归结
起来就是两点:
1、JVM的内存管理
理解了这一点,所有和对象相关的问题统统都能解决
2、JVM Class Loader
理解了这一点,所有和Java相关的配置问题,包括各种App Server的配置,应用的发布问
题统统都能解决
App Class Loader
|----- EJB Class Loader
|----- Web App Class Loader
如果在App Class Loader级别配置,是全局可见的。如果打包在EJB里面,那么就不会影响
到Web Application,反之亦然,如果你在WEB-INF下面放置Hibernate,也不会影响到EJB
。放在EJB Class Loader或者放在Web App Class Loader级别主要就是在局部范围内有效
,不影响到其它的应用。
试想,如果在一个Weblogic上面配置多个虚拟域,你使用www.bruce.com域名,开发你的网
站,我使用www.fankai.com开发我的网站,那么当然不希望我们的Hibernate相互干扰,所
以就可以放在 EJB Class Loader级别来配置Hibernate。
进一步阐述一下EJB Class Loader的问题:
先再次强调一下,Hibernate和EJB,和App Server不存在兼容性问题,他们本来就是不相
关的东西,就好像JDBC,相信没有人会认为JDBC和EJB不兼容吧,Hibernate也是一样,它
只和JDBC驱动,和数据库有兼容性问题,而和EJB,和App Server完全是不搭界的两回事。
凡是认为Hibernate和EJB不兼容的人,其实是都是因为对EJB学习的不到家,把责任推到H
ibernate身上了。
我前面的帖子提到过Class Loader的层次,这里不重复了,总之我们先来看看Class Load
er的作用范围:
BootStrap Class Loader:
load JRE\lib\rt.jar, sunrsasign.jar, charsets.jar, jce.jar, jsse.jar, plugin.j
ar
Ext Class Loader:
load JRE\lib\ext目录下的库文件, load JRE\classes目录下的类
App Class Loader:
load CLASSPATH变量指定路径下的类
以上的load路径都是写死在JVM的C++源代码里面的,不能改变,详细请见王森的《Java深
度历险》
在一个特定的App Server上,Class Loader会继续向下继承,继承的层次会根据不同的Ap
p Server有所不同,但是肯定不会变的就是:
EJB Class Loader:
继承自App Class Loader,继承层次根据App Server有所不同,一个EJB Class Loader它
的load Class的范围仅限于JAR或者EAR范围之内。
Web App Class Loader:
继承自App Class Loader,继承层次根据App Server有所不同,一个Web App Class Load
er:它的load Class的范围在 WEB-INF\lib下的库文件和WEB-INF\classes目录下的class文
件。
Web App Class Loader很好理解,大家毕竟用的很多,App Server上的一个Web Applicat
ion会创建一个Web App Class Loader的实例去负责load class,所以如果你想让Hiberna
te只在这个Web Application内生效,把它放到WEB-INF\lib下去就好了。
如果你把Hibernate放到了CLASSPATH变量指定的路径下,而你在WEB-INF\lib也放了一份,
那么Web App Class Loader由于load范围所限,它会首先找到WEB-INF\lib下的那份Hiber
nate,按照它的配置来初始化Hibernate。
如果你把Hibernate放到了CLASSPATH变量指定的路径下,但你在WEB-INF\lib什么都没有放
,那么Web App Class Loader由于load范围所限,它根本什么都找不到,于是它把load H
ibernate的责任交给上一级的Class Loader,这样直到App Class Loader,它找到了Hibe
rnate,按照它的配置来初始化Hibernate。
EJB Class Loader稍微复杂一点,不那么容易理解。App Server会针对每一个EJB包文件创
建一个EJB Class Loader的实例,例如:
HelloRobbin.jar
HelloBruce.jar
当你把这两个jar发布到App Server上以后,会创建两个EJB Class Loader的实例,分别去
load这两个EJB包,比如说:
CLEJB_Robbin是load HelloRobbin.jar的
CLEJB_Bruce是load HelloBruce.jar的
那么CLEJB_Robbin的load范围就仅仅限于HelloRobbin.jar之内,它load不到HelloRobbin
.jar之外的任何文件,当然它也load不到HelloBruce.jar。
说到这里,我相信大家应该已经明白为什么EJB规范不允许EJB有IO操作了吧?因为EJB Cl
ass Loader根本找不到jar包之外的文件!!!
如果现在你想实现HelloRobbin.jar和HelloBruce.jar的互相调用,那么该怎么办?他们使
用了不同的EJB Class Loader,相互之间是找不到对方的。解决办法就是使用EAR。
现在假设HelloRobbin.jar和HelloBruce.jar都使用了Hibernate,看看该怎么打包和发布
:
HelloEJB.ear
|------ HelloRobbin.jar
|------ HelloBruce.jar
|------ Hibernate2.jar
|------ pojo.jar (定义所有的持久对象和hbm文件的jar包)
|------ cglib-asm.jar
|------ commons-beanutils.jar
|------ commons-collections.jar
|------ commons-lang.jar
|------ commons-logging.jar
|------ dom4j.jar
|------ odmg.jar
|------ log4j.jar
|------ jcs.jar
|------ hibernate.properties
|------ log4j.properties
|------ cache.ccf
|------ META-INF\application.xml (J2EE规范的要求,定义EAR包里面包括了哪几个EJB
)
除此之外,按照EJB规范要求,HelloRobbin.jar和HelloBruce.jar还必须指出调用jar包之
外的类库的名称,这需要在jar包的manifest文件中定义:
HelloRobbin.jar
|------ META-INF\MANIFEST.MF
MANIFEST.MF中必须包括如下一行:
Class-Path: log4j.jar hibernate2.jar cglib-asm.jar commons-beanutils.jar commo
ns-collections.jar commons-lang.jar
commons-logging.jar dom4j.jar jcs.jar odmg.jar jcs.jar pojo.jar
这样就OK了,当把HelloEJB.ear发布到App Server上以后,App Server创建一个EJB Clas
s Loader实例load EAR包里面的EJB,再根据EJB的jar包里面的MANIFEST.MF指出的Class-
Path去寻找相应的jar包之外的类库。
所以一个EAR包有点类似一个Web Application,EJB Class Loader的load范围也就是EAR范
围之内,它load不到EAR之外的文件。除非把Hibernate定义到CLASSPATH指定的路径下,在
这种情况下,EJB Class Loader找不到Hibernate,只能交给上一级的Class Loader,最后
由App Class Loader找到Hibernate,进行初始化。
没有写完,继续说...
由于EAR这样load Class规则,假设Robbin和Bruce都在同一个Weblogic上运行自己的网站
,而我们都不希望自己的程序里面的Hibernate配置被对方的搞乱掉,那么我们就可以这样
来做:
Robbin's Website:
Robbin.ear
|-------- robbin.war (把Web Application打包)
|-------- robbin.jar (把开发的EJB打包)
|-------- Hibernate2.jar
..........................
|-------- META-INF\application.xml
Bruce's Website:
Bruce.ear
|-------- bruce.war (把Web Application打包)
|-------- bruce.jar (把开发的EJB打包)
|-------- Hibernate2.jar
..........................
|-------- META-INF\application.xml
这样在同一个App Server上运行,就可以互相不干扰。
发表评论
-
Transfer
2017-06-29 23:03 0Find connections count: ... -
Discover the Mystery of Metaspace
2017-06-23 16:47 0The JDK 8 HotSpot JVM is now u ... -
Command Line JMX Client
2014-12-29 13:12 2595Command Line Parser: GNUComman ... -
Something about JVM class loading and initialization
2014-05-09 10:04 1032Class loading stages: Loadin ... -
When a class is loaded and initialized in JVM - Java
2014-05-08 19:09 988from: http://javarevisited.blo ... -
【深入Java虚拟机】之四:类加载机制
2014-05-08 15:12 899转载请注明出处:http://blog.csdn.net/n ... -
Java Reflection - Dynamic Class Loading and Reloading
2014-05-08 12:04 942From: http://tutorials.jenkov. ... -
Java 类加载与初始化
2014-02-19 19:12 810转载自:http://www.cnblogs.c ... -
javax.management.StandardMBean: When and Why. (Reposted)
2013-12-26 15:34 1084Q: When is a Standard MBean no ... -
JVM调优的"标准参数"的各种陷阱(转)
2013-11-11 19:55 2051From: http://hllvm.group.itey ... -
Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
2013-11-11 11:05 1018(From: http://www.oracle.com/ ... -
An article about TLAB
2013-11-11 10:57 756(From: https://blogs.oracle.co ... -
【JVM】HotSpot JVM内存管理和GC策略总结(转)
2013-11-07 23:39 592JVM的相关知识是学习java高级特性必须要去深入学习的。平 ... -
jstat分析VM内存
2013-11-07 16:41 904Jstat 是JDK自带的一个轻量级小工具。全称“Java ... -
java的GridBagLayout网格包布局管理器使用详解 (转)
2013-11-01 16:44 0网格包布局管理是最复 ... -
java动态跟踪分析工具BTrace实现原理
2013-09-01 12:34 1267转自:http://kenwublog.com ... -
Java synchronize用法(转)
2012-11-05 00:20 1207在多个并发线程之间共用资源,就需要进行同步处理。Java虚拟机 ... -
Interview material collection
2012-07-09 23:05 11901. Why can't static methods be ... -
不要重复 DAO!(转)
2011-12-29 22:17 1242使用 Hibernate 和 Spri ... -
JVM 诊断工具(转)
2011-11-25 12:00 17611.jinfo 描述:输出给定 java 进程所有的配置信 ...
相关推荐
JVM加载class文件的原理机制 JVM加载class文件的原理机制是Java中的核心机制之一,由于Java中的所有类必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的。类装载器所做的工作实质是把类文件从硬盘...
WAS 中类加载器是一个具有父子关系的分层结构,包括 JVM Class loader、WebSphere Extensions Class loader、WebSphere lib/app Class loader、WebSphere "server" Class loader 和 Application Module Class Loader...
类加载器有三种:bootstrap class loader(引导类加载器)、extension class loader(扩展类加载器)和app class loader(应用类加载器),它们按照双亲委派模型进行工作。 2. **验证**:加载后的字节码需要经过...
JVM加载class文件的原理机制 JVM加载class文件的原理机制是Java虚拟机中一个非常重要的组件,负责将class文件加载到内存中,以便Java程序的执行。下面是JVM加载class文件的原理机制的详细介绍: 类加载的原理 在...
JVM体系结构是指虚拟机的内部构造,包括类加载器(Class Loader)、运行时数据区(Runtime Data Areas)、执行引擎(Execution Engine)、本地接口(Native Interface)和垃圾回收器(Garbage Collector)等组成部分...
System.out.println("parent class loader: " + cl.getParent()); cl = cl.getParent(); } ``` 这段代码会打印出当前的类加载器以及它们的父加载器。通常,你会看到AppClassLoader(系统类加载器)、...
JVM 可以分为三个部分:CLASS LOADER、RUN TIME DATA AREA 和 EXECUTION ENGINE。CLASS LOADER 负责加载类文件,并将其转换成 JVM 可以识别的格式。RUN TIME DATA AREA 负责存储类加载后的数据,而 EXECUTION ENGINE...
动态类加载是Java虚拟机(JVM)的一项核心特性,它为Java平台带来了强大的功能:即能够在运行时安装软件组件。这一机制不仅提高了系统的灵活性,还优化了资源管理。本文将深入探讨Java虚拟机中的动态类加载机制,并...
* JVM Class loader:位于整个层次结构的最上层,负责加载 JVM 类,JVM 扩展类,以及定义在 classpath 环境变量上的所有的 Java 类。 * WebSphere Extensions Class loader:WebSphere 扩展类加载器,负责加载 ...
创建自定义类加载器通常需要继承`java.lang.ClassLoader`,重写`findClass()`或`loadClass()`方法,从而控制类的查找和加载过程。这使得开发者能够在运行时根据需要加载特定的类,比如从网络、数据库或其他非传统...
遇到类冲突、类找不到等问题时,可通过设置JVM参数`-verbose:class`来查看类加载的详细信息,或者使用JDK的`jmap -histo`命令分析内存中的类加载情况。 8. **线程安全** 类加载过程中的某些步骤,如加载和初始化...
首先,它具备一种名为“类加载器”(Class Loader)的组件,用于加载和管理程序中的类文件。类加载器不仅能够按需加载类文件,还能够支持热更新等功能。此外,类之间的隔离也使得每个类的运行环境相对独立,提高了...
类加载器(class loader)用来加载Java类到Java虚拟机中。一般来说,Java虚拟机使用Java类的方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载器负责读取...
在Java编程语言中,类加载器(Class-Loader)是一个至关重要的组件,它负责加载类到JVM(Java虚拟机)中。这个“class-loader测试工程”可能是一个专门设计用于研究和理解Java类加载机制的项目。在Java中,类加载...
1. JVM架构组成:JVM主要由类加载器(Class Loader)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine)以及本地接口(Native Interface)等部分组成。了解这些组件各自的作用和工作方式,是理解...
在类加载阶段,Jvm 通过 Class Loader 将 Java 类文件加载到内存中,在类链接阶段,Jvm 将类文件中的符号引用解析为直接引用,在类初始化阶段,Jvm 将类文件中的静态变量初始化,在对象创建阶段,Jvm 将对象创建在堆...
类加载涉及类装载器(Class Loader),它负责将.class文件加载到内存中;字节码执行由解释器和JIT(Just-In-Time)编译器共同完成,提供动态编译和优化;内存管理则主要涉及对象的生命周期和垃圾收集。 2. **类装载...
JVM有多个类加载器,如bootstrap loader、extension loader、application loader等,它们共同构成了类加载的双亲委托模型。理解这个模型有助于解决类冲突和安全问题。 还有,JVM的编译优化(JIT,Just-In-Time编译...