ear包jar war ear的区别之间可以互相访问吗

博客访问: 495217
博文数量: 57
博客积分: 451
博客等级: 下士
技术积分: 1431
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
发布时间: 11:08:53
Ear、Jar、War文件之间有何不同?它们分别使用在哪种环境下?  在文件结构上,三者并没有什么不同,它们都采用zip或jar档案文件压缩格式。但是它们的使用目的有所区别:  Jar文件(扩展名为. Jar)包含Java类的普通库、资源(resources)、辅助文件(auxiliary files)等  War文件(扩展名为.War)包含.........
阅读(1830) | 评论(0) | 转发(1)
发布时间: 20:37:43
使用下面的命令:python -m SimpleHTTPServer执行这一个命令即可实现一个HTTP服务器,会将当前目录设为HTTP服务目录,http://ip:8000访问......
阅读(2924) | 评论(0) | 转发(0)
发布时间: 14:37:03
公司租用的阿里云主机内存为512M,经常出现内存不够的现象。参考网上资料进行了一系列优化:首先查看内存使用情况:#free -m发现在内存竟然还剩下6M可用# ps -ef|grep httpd 查看了httpd的进程个数影响apache性能的几个重要参数(conf/httpd.conf中设置)KeepAlive 是否允许持续连接MaxKeepAliveRequests 允许的持.........
阅读(4030) | 评论(1) | 转发(0)
发布时间: 00:59:17
这几天研究Nginx,今天动手做了一个简单的实验实现功能:当客户端调用静态页面时在机器1执行,调用动态页面的时候都发给机器2来执行两台机器:1.centos 6.3 安装Nginx &192.168.1.154& & & & & & & 2.centos 6.3 安装PHP(fastCGI)192.168.1.104机器1:安装Nginx& &.........
阅读(8129) | 评论(0) | 转发(0)
给主人留下些什么吧!~~
您好,我是CU博客工作人员。您被评选为这周CU博客的博客之星,登上首页需要填写个人信息,请自我描述下您的个人状况!方便大家更好地了解您!谢谢!
请登录后留言。赞助商链接
我想在一个.ear包中放入两个.war,并且通过其中的一个.war可以访问另一个.war中的文件。不知道能不能实现?如下的放置,好像不能够,希望有人可以帮忙解决?谢谢!//application.xml如下:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN' '/dtd/application_1_3.dtd'><application>
<display-name>Basic StatefulSession ejb20</display-name>
<description>Basic StatefulSession ejb20</description><module>
<ejb>cdm.jar</ejb></module><module>
<web><web-uri>common.war</web-uri></web>
<web><web-uri>web.war</web-uri></web></module></application>
赞助商链接
赞助商链接
最佳分辨率
OpenSource
Code & 2002-20Java EE ear包类加载机制解析
一&JavaEE&包的类型
在J2EE中,有ejb-jar包,war包,rar包,car包,ear包,其中经常会用到ejb-jar包,war包,以及ear包,下面分别说明。
1&EJB&Jar&包&(.jar)
Ejb&jar是EJB模块,主要用于实现业逻辑。
&1.2&描述符文件
EJB&JAR包的部署描述符文件是ejb-jar.xml,(在EJB3.0中,也可以采用J2SE5.0引入的annoation注解,只不过ejb-jar.xml文件的内容会覆盖annoation)
EJB&JAR包中通常包括会话bean(包括stateless&session&bean,statefull&session&bean),消息驱动bean(MDB),以及Entity&bean(在EJB3.0中,采用新的JPA规范来进行数据库访问,所以不存在entity&bean,所有的entity&都是pojo)
2&War&包&&&&(.war)
War包主要用于打包web应用程序。
&2.2&描述符文件
&&&War包的描述符文件是web.xml,web.xml里可以配置相应的servlet,filter,listener等组件。
War包里主要包含jsp,servlet,filter,html,图片等资源。
3&Ear&包&&&&(.ear)
EAR包主要用于对JavaEE应用程序进行打包,这样方便交付给客户来使用。
&3.2&描述符文件
application.xml是ear包的描述符文件,application.xml中可以配置一个或者多个web模块,一个或者多个ejb模块,还可以配置资源适配器模块和应用客户端模块。
EAR包中包含ejb&jar,war包,资源适配器模块(.rar)以及应用客户端模块。
二&JavaEE&ear包的类加载机制
1&委托模型
&&&&在说ear包的类加载体系之前,首先我们需要知道java中的类加载器的委托模型,java中的类加载器有一个继承体系,子加载器在加载类的时候首先委托父加载器来加载,以此类推,如果所有的父加载器都不能加载,那么子加载器再加载,此时如果子加载器没有发现类文件,则抛出java.lang.ClassNotFoundException.
但是在JavaEE应用中,java默认的委托模型将会被禁用,此时加载类的时候,首先是子加载器加载类,如果子加载器找不到相应的类文件,那么委托给父加载器来加载。
2&JavaEE类加载机制
&2.1&java类加载器
&&&Java类加载器体系如下图所示:
2.2&JavaEE类加载器
&&JavaEE中的类加载器是在上图的基础上实现的,如下图所示:
从上图中可以看出,application&server类加载器是ejb类加载器的父加载器,ejb包的类加载器是war包的父加载器。
(注:上图只是大体上的类加载器体系,不同的application&server有不同的实现,但是具体的原理是一样的)。
上面是关于类加载器的一些理论知识,下面通过一个具体的实例来验证以上理论。(以下实验均采用jboss&4.2&AS)
1&准备环境
首先在eclipse建立三个工程,如图:
&&其中Demoejb工程包括两个文件,一个接口,一个实现类,Demoweb中包括一个DemoServlet类。其中我们编写一个测试类DemoUtil类。它里面包含一个静态变量,每次调用demo方法,都将count加一。具体的代码如下:
Demoear&application.xml内容:
&?xml version="1.0" encoding="UTF-8"?&&&&&&&&&&application xmlns="http:///xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/application_5.xsd"&&&&&&&&&&&&&&display-name&Demoear&/display-name&&&&&&&&&&&&&&module id="myeclipse.6"&&&&&&&&&&&&&&&&&&web&&&&&&&&&&&&&&&&&&&&&&web-uri&Demoweb.war&/web-uri&&&&&&&&&&&&&&&&&&&&&&context-root&/Demoweb&/context-root&&&&&&&&&&&&&&&&&&/web&&&&&&&&&&&&&&/module&&&&&&&&&&&&&&module id="myeclipse.5"&&&&&&&&&&&&&&&&&&ejb&Demoejb.jar&/ejb&&&&&&&&&&&&&&/module&&&&&&&&&&/application&&&&&
DemoUtil&类:
package com.yuquan.&&&&&&&&&&&& /**&&&& * @author yuquan&&&& * @createTime Apr 11, :45 PM&&&& */&&&& public class DemoUtil {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&private static int&&&&&&&&&&&& &&&&&&&&public static int demo() {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return count++;&&&&&&&&&&&&&&&&}&&&&&&&&&&&& }&&&&
Demoejb&project&
DemoService代码:
package com.yuquan.&&&&&&&&&&&& import javax.ejb.R&&&&&&&&&&&& /**&&&& * @author yuquan&&&& * @createTime Apr 6, :41 PM&&&& */&&&& @Remote&&&& public interface DemoService {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public String execute();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public void print();&&&&&&&&&&&& }&&&&
DemoServiceImpl代码:
package com.yuquan.&&&&&&&&import javax.ejb.R&&&&&&&&import javax.ejb.S&&&&&&&&import org.jboss.annotation.ejb.RemoteB&&&&&&&&import com.yuquan.util.DemoU&&&&&&&&/**&&&& * @author yuquan&&&& * @createTime Apr 6, :24 PM&&&& */&&&& @Stateless&&&& @Remote(DemoService.class)&&&&&&&&@RemoteBinding(jndiBinding="DemoServiceImpl")&&&&&&&&public class DemoServiceImpl implements DemoService {&&&&&&&&&&&& &&&&&&&&/* (non-Javadoc)&&&& &&&&&&&& * @see com.xmu.eartest.DemoService#execute()&&&& &&&&&&&& */&&&& &&&&&&&&@Override&&&& &&&&&&&&public String execute() {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return String.valueOf(DemoUtil.demo());&&&&&&&&&&&& &&&&&&&&}&&&&&&&&&&&& &&&&&&&&@Override&&&& &&&&&&&&public void print() {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ClassLoader loader = DemoUtil.class.getClassLoader();&&&&&&&&&&&&&&&&&&&&&&&&while(loader !=null){&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("Demoservice print :::"+loader);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&loader = loader.getParent();&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&& }&&&&
Demoweb&project
DemoServlet代码:
package com.yuquan.&&&&&&&&import java.io.IOE&&&&&&&&import java.io.PrintW&&&&&&&&import java.util.A&&&&&&&&import java.util.H&&&&&&&&import java.util.L&&&&&&&&import javax.naming.C&&&&&&&&import javax.naming.InitialC&&&&&&&&import javax.naming.NamingE&&&&&&&&import javax.servlet.ServletE&&&&&&&&import javax.servlet.http.HttpS&&&&&&&&import javax.servlet.http.HttpServletR&&&&&&&&import javax.servlet.http.HttpServletR&&&&&&&&import com.yuquan.service.DemoS&&&&&&&&import com.yuquan.service.DemoService2;&&&&&&&&import com.yuquan.util.DemoU&&&&&&&&&&&& /**&&&& * @author yuquan&&&& * @createTime Apr 6, :44 PM&&&& */&&&& public class DemoServlet extends HttpServlet {&&&&&&&&&&&& &&&&&&&&private C&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&@Override&&&& &&&&&&&&public void init() throws ServletException {&&&&&&&&&&&& &&&&&&&&&&&&&&&&super.init();&&&&&&&&&&&&&&&&&&&&&&&&initContext();&&&&&&&&&&&&&&&&}&&&&&&&&&&&& &&&&&&&&@Override&&&& &&&&&&&&protected void doGet(HttpServletRequest req, HttpServletResponse resp)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&throws ServletException, IOException {&&&&&&&&&&&& &&&& &&&&&&&&&&&&&&&&DemoService service = (DemoService) getRemoteServieWithJndiName("DemoServiceImpl");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("service classloader is : "+service.getClass().getClassLoader());&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("DemoService classloader is : "+DemoService.class.getClassLoader());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("After the web being invoked, the static value is : " + DemoUtil.demo());&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("After the ejb being invoked, the static value is : " + service.execute());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.printf("Ejb print %s\n","---------------------");&&&&&&&&&&&&&&&&&&&&&&&&service.print();&&&&&&&&&&&&&&&&&&&&&&&&System.out.printf("web print %s\n","---------------------");&&&&&&&&&&&&&&&&&&&&&&&&this.print();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PrintWriter out = resp.getWriter();&&&&&&&&&&&&&&&&&&&&&&&&out.print("You have done the ear demo,pls see the console,and find the result!&&&&^_^");&&&&&&&&&&&&&&&&}&&&&&&&&&&&& &&&&&&&&private Object getRemoteServieWithJndiName(String name) {&&&&&&&&&&&&&&&&&&&&&&&&Object o = null;&&&&&&&&&&&&&&&&&&&&&&&&try {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&o = cxt.lookup(name);&&&&&&&&&&&&&&&&&&&&&&&&} catch (NamingException e) {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&// TODO Auto-generated catch block&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&&&}&&&&&&&&&&&& &&&&&&&&private void initContext() {&&&&&&&&&&&&&&&&&&&&&&&&Hashtable&String, String& environment = new Hashtable&String, String&();&&&&&&&&&&&& &&&&&&&&&&&&&&&&environment.put(Context.INITIAL_CONTEXT_FACTORY,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"org.jnp.interfaces.NamingContextFactory");&&&&&&&&&&&&&&&&&&&&&&&&environment.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");&&&&&&&&&&&&&&&&&&&&&&&&environment.put(Context.PROVIDER_URL, "localhost:1099");&&&&&&&&&&&& &&&&&&&&&&&&&&&&try {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&cxt = new InitialContext(environment);&&&&&&&&&&&& &&&&&&&&&&&&&&&&} catch (NamingException e) {&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&& &&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&private void print(){&&&&&&&&&&&&&&&&&&&&&&&&ClassLoader loader = DemoUtil.class.getClassLoader();&&&&&&&&&&&&&&&&&&&&&&&&while(loader !=null){&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("DemoServlet print ::: "+loader);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&loader = loader.getParent();&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&
Demoejb.jar:
com/yuquan/service/DemoService.class
com/yuquan/service/DemoServiceImpl.class
com/yuquan/util/DemoUtil.class
Demoweb.war包
WEB-INF/classes/com/yuquan/action/DemoServlet.class
WEB-INF/lib
WEB-INF/web.xml
Demoear&包
此时DemoUtil.class打包到了Demoejb.jar包中,Demoweb.war包中没有DemoUtil类。
17:47:51,187 INFO&&&&[STDOUT] service classloader is : WebappClassLoader&&&&&&&&&&&&delegate: false&&&& &&&&repositories:&&&&&&&&&&&&&&&&/WEB-INF/classes/&&&&&&&&----------& Parent Classloader:&&&&&&&&java.net.FactoryURLClassLoader@d85409&&&& 17:47:51,187 INFO&&&&[STDOUT] DemoService classloader is : org.jboss.mx.loading.UnifiedClassLoader3@19a82ee{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34440Demoear.ear ,addedOrder=48}&&&&&&&&17:47:51,187 INFO&&&&[STDOUT] After the web being invoked, the static value is : 0&&&& 17:47:51,203 INFO&&&&[STDOUT] After the ejb being invoked, the static value is : 1&&&& 17:47:51,203 INFO&&&&[STDOUT] Ejb print&&&&&&&& 17:47:51,203 INFO&&&&[STDOUT] ---------------------&&&&&&&&17:47:51,203 INFO&&&&[STDOUT] Demoservice print :::org.jboss.mx.loading.UnifiedClassLoader3@19a82ee{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34440Demoear.ear ,addedOrder=48}&&&&&&&&17:47:51,203 INFO&&&&[STDOUT] Demoservice print :::org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d&&&& 17:47:51,203 INFO&&&&[STDOUT] Demoservice print :::sun.misc.Launcher$AppClassLoader@18d107f&&&& 17:47:51,203 INFO&&&&[STDOUT] Demoservice print :::sun.misc.Launcher$ExtClassLoader@360be0&&&& 17:47:51,203 INFO&&&&[STDOUT] web print&&&&&&&& 17:47:51,203 INFO&&&&[STDOUT] ---------------------&&&&&&&&17:47:51,203 INFO&&&&[STDOUT] DemoServlet print ::: org.jboss.mx.loading.UnifiedClassLoader3@19a82ee{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34440Demoear.ear ,addedOrder=48}&&&&&&&&17:47:51,203 INFO&&&&[STDOUT] DemoServlet print ::: org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d&&&& 17:47:51,203 INFO&&&&[STDOUT] DemoServlet print ::: sun.misc.Launcher$AppClassLoader@18d107f&&&& 17:47:51,203 INFO&&&&[STDOUT] DemoServlet print :::
从运行的结果可以看出war包以及ejb包中用到得DemoUtil类都是由jboss的org.jboss.mx.loading.UnifiedClassLoader3来加载的。我们看到DemoUtil类的count静态域变为了1,这是因为DemoServlet用到得DemoUtil类,其实是由ejb&包加载器UnifiedClassLoader3加载的,所以ejb,web调用后,count值变为了1.这也就说明了UnifiedClassLoader3类加载器是war包类加载器(org.apache.catalina.loader.WebappClassLoader)的父加载器.
&实验二中,我们将Demoejb.jar放到Demoweb.war包的lib目录下,其它的和实验一一样。
18:00:49,609 INFO&&&&[STDOUT] service classloader is : WebappClassLoader&&&&&&&&&&&&delegate: false&&&& &&&&repositories:&&&&&&&&&&&&&&&&/WEB-INF/classes/&&&&&&&&----------& Parent Classloader:&&&&&&&&java.net.FactoryURLClassLoader@7a8ba4&&&& 18:00:49,609 INFO&&&&[STDOUT] DemoService classloader is : WebappClassLoader&&&&&&&&&&&&delegate: false&&&& &&&&repositories:&&&&&&&&&&&&&&&&/WEB-INF/classes/&&&&&&&&----------& Parent Classloader:&&&&&&&&java.net.FactoryURLClassLoader@7a8ba4&&&& 18:00:49,609 INFO&&&&[STDOUT] After the web being invoked, the static value is : 0&&&& 18:00:49,625 INFO&&&&[STDOUT] After the ejb being invoked, the static value is : 0&&&& 18:00:49,625 INFO&&&&[STDOUT] Ejb print&&&&&&&& 18:00:49,625 INFO&&&&[STDOUT] ---------------------&&&&&&&&18:00:49,625 INFO&&&&[STDOUT] Demoservice print :::org.jboss.mx.loading.UnifiedClassLoader3@1d2052b{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34441Demoear.ear ,addedOrder=49}&&&&&&&&18:00:49,625 INFO&&&&[STDOUT] Demoservice print :::org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d&&&& 18:00:49,625 INFO&&&&[STDOUT] Demoservice print :::sun.misc.Launcher$AppClassLoader@18d107f&&&& 18:00:49,656 INFO&&&&[STDOUT] Demoservice print :::sun.misc.Launcher$ExtClassLoader@360be0&&&& 18:00:49,656 INFO&&&&[STDOUT] web print&&&&&&&& 18:00:49,656 INFO&&&&[STDOUT] ---------------------&&&&&&&&18:00:49,656 INFO&&&&[STDOUT] DemoServlet print ::: WebappClassLoader&&&&&&&&&&&&delegate: false&&&& &&&&repositories:&&&&&&&&&&&&&&&&/WEB-INF/classes/&&&&&&&&----------& Parent Classloader:&&&&&&&&java.net.FactoryURLClassLoader@7a8ba4&&&& 18:00:49,656 INFO&&&&[STDOUT] DemoServlet print ::: java.net.FactoryURLClassLoader@7a8ba4&&&& 18:00:49,656 INFO&&&&[STDOUT] DemoServlet print ::: org.jboss.mx.loading.UnifiedClassLoader3@1d2052b{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34441Demoear.ear ,addedOrder=49}&&&&&&&&18:00:49,656 INFO&&&&[STDOUT] DemoServlet print ::: org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d&&&& 18:00:49,656 INFO&&&&[STDOUT] DemoServlet print ::: sun.misc.Launcher$AppClassLoader@18d107f&&&& 18:00:49,656 INFO&&&&[STDOUT] DemoServlet print :::
从运行的结构可以看出,count的值在ejb,web调用后的值都是0,此时DemoUtil在war包和ejb包中的类加载器是不一样的,这也就说明了在JavaEE应用中,web包的类加载器首先加载,如果没有找到相应的class文件,那么再委托给父加载器(ejb包的类加载器)来加载。并且此时注意到Demoservice也是由web类加载器加载的,这是因为此时Demoejb.jar被放在了Demoweb.war包的lib目录,war包类加载器可以找到此类,所以由war包类加载器来加载此类。但是这个时候要注意ejb包中的DemoService类还是由Ejb包的类加载器来加载的,因为此时web类加载器是子加载器,做为父加载器的ejb类加载器是看不到子加载器加载的类的。
&&&从这个例子,我们得出两个个结论:
&&&1)war包类加载器在加载类的时候,首先在自己对应的路劲中查找类(WEB-INF/class,WEB-INF/lib,以及lib包&jar文件META-INF/MANIFEST.MF&classpath指定的jar),如果找不到才会委托给父加载器(ejb包类加载器)加载,以此类推,如果所有的父加载器都不能加载,那么就抛出java.lang.ClassNotFoundException.
&&&2)父加载器看不到子加载器加载的类,本例中war包中用到的类加载器加载了DemoService,但是ejb包的类加载器也加载了相应的DemoService类。
4&实验三:
实验三中,我们将Demoejb.jar包中的DemoUtil.类删除,将其打包到独立的util.jar包中,然后将util.jar包放到Demoweb.war包的lib目录下面,并且同时也需要把util.jar包放到Demoear.ear包的lib目录下。
18:07:51,343 INFO&&&&[STDOUT] service classloader is : WebappClassLoader&&&&&&&&&&&&delegate: false&&&& &&&&repositories:&&&&&&&&&&&&&&&&/WEB-INF/classes/&&&&&&&&----------& Parent Classloader:&&&&&&&&java.net.FactoryURLClassLoader@14322ba&&&& 18:07:51,343 INFO&&&&[STDOUT] DemoService classloader is : org.jboss.mx.loading.UnifiedClassLoader3@133650d{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34442Demoear.ear ,addedOrder=50}&&&&&&&&18:07:51,343 INFO&&&&[STDOUT] After the web being invoked, the static value is : 0&&&& 18:07:51,343 INFO&&&&[STDOUT] After the ejb being invoked, the static value is : 0&&&& 18:07:51,343 INFO&&&&[STDOUT] Ejb print&&&&&&&& 18:07:51,343 INFO&&&&[STDOUT] ---------------------&&&&&&&&18:07:51,343 INFO&&&&[STDOUT] Demoservice print :::org.jboss.mx.loading.UnifiedClassLoader3@133650d{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34442Demoear.ear ,addedOrder=50}&&&&&&&&18:07:51,343 INFO&&&&[STDOUT] Demoservice print :::org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d&&&& 18:07:51,343 INFO&&&&[STDOUT] Demoservice print :::sun.misc.Launcher$AppClassLoader@18d107f&&&& 18:07:51,343 INFO&&&&[STDOUT] Demoservice print :::sun.misc.Launcher$ExtClassLoader@360be0&&&& 18:07:51,343 INFO&&&&[STDOUT] web print&&&&&&&& 18:07:51,343 INFO&&&&[STDOUT] ---------------------&&&&&&&&18:07:51,343 INFO&&&&[STDOUT] DemoServlet print ::: WebappClassLoader&&&&&&&&&&&&delegate: false&&&& &&&&repositories:&&&&&&&&&&&&&&&&/WEB-INF/classes/&&&&&&&&----------& Parent Classloader:&&&&&&&&java.net.FactoryURLClassLoader@14322ba&&&& 18:07:51,343 INFO&&&&[STDOUT] DemoServlet print ::: java.net.FactoryURLClassLoader@14322ba&&&& 18:07:51,343 INFO&&&&[STDOUT] DemoServlet print ::: org.jboss.mx.loading.UnifiedClassLoader3@133650d{ url=file:/E:/java/file resource/jboss-4.2.1.GA/jboss-4.2.1.GA/server/default/tmp/deploy/tmp34442Demoear.ear ,addedOrder=50}&&&&&&&&18:07:51,343 INFO&&&&[STDOUT] DemoServlet print ::: org.jboss.system.server.NoAnnotationURLClassLoader@1632c2d&&&& 18:07:51,343 INFO&&&&[STDOUT] DemoServlet print ::: sun.misc.Launcher$AppClassLoader@18d107f&&&& 18:07:51,343 INFO&&&&[STDOUT] DemoServlet print :::
从运行结果来看,ejb包中所用的DemoUtil类是有jboss的UnifiedClassLoader3加载的,而DemoServlet中用到得DemoUtil类是由WebAppClassLoader加载的。
注意:如果此时在Demoear.ear的lib包中不放置util.jar包,那么EJB中将无法加载到此类,这也说明了父加载器是看不到子加载器加载的类的。
1&&子加载器可以看到父加载器加载的类,但是父加载器看不到子加载器加载的类,比如实验一中,DemoServlet中用到得DemoService类就是由org.jboss.mx.loading.UnifiedClassLoader加载的。
2&&同级的类加载是不能看到对方加载的类的。假如ear包中包括了很多个war包,这些war包中的类是不能互相引用的。
3&java的默认委托模型在JavaEE&应用的类加载器模型中不再适用。此时首先有war包的类加载加载类,如果war包类加载器不能加载,然后才由ejb包的类加载来加载。
4&jboss4.2&AS中,类加载器的体系如下:
org.apache.catalina.loader.WebappClassLoader
java.net.FactoryURLClassLoader
org.jboss.mx.loading.UnifiedClassLoader3
org.jboss.system.server.NoAnnotationURLClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
以上的classLoader中,下面的类加载器是上面的父加载器.
&& 需要注意一下单例设计模式。如果我们把一个类设计为单例的,要确保web模块和ejb模块中用到得单例类是同一个类加载器加载的,否则的话web模块和ejb模块的实例是不一样的。
& 最后,一般我们在打ear包的时候,会把web模块和ejb模块都用到得类放到ear包的lib目录下,这样确保公用类是同一个类加载器加载。&!--EndFragment--&
<span type="1" blog_id="360739" userid='
分享到朋友圈
喜欢我的文章,请分享到朋友圈

我要回帖

更多关于 jar war ear的区别 的文章

 

随机推荐