类加载机制学习笔记

#### jar,war,ear 区别

S: jar 就是java 类的打包,以及相关资源性的file,一般在web 下不能直接运行的,一般作为第三方包来用,所以经常见在eclipse 的build path 里将打包好的jar 加进去(实际加到 WEB-INF 下的lib 中),给当前项目调用。 但如果jar 里包含了main 方法,用java命令也是可以运行的 。

War 包: 是一个在服务器(serverlet容器)可以运行的 web 模块,需要包括WEB-INF, 而jar 一般只是将一些classes 文件打包以给第三方用,一般不可以直接运行,但如果写了main 函数,就可以直接用java 命令运行。

EAR 包: EAR文件包括整个项目,内含多个 EJB Module(JAR文件)和 Web Module(WAR文件)。一般包含EJB 的都可以打成ear 包 。

http://www.jb51.net/article/35881.htm

以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.class文件,每个文件中的功能与作用,同样可以得到他们希望的结果。除jar以外对于J2EE来说还有war和ear。区别见下表:

  JAR WAR EAR
英文 Java Archive file Web Archive file Enterprise Archive file
包含内容 class、properties文件,是文件封装的最小单元;包含Java类的普通库、资源(resources)、辅助文件(auxiliary files)等 Servlet、JSP页面、JSP标记库、JAR库文件、HTML/XML文档和其他公用资源文件,如图片、音频文件等 除了包含JAR、WAR以外,还包括EJB组件
部署文件 application-client.xml web.xml application.xml
容器 应用服务器(application servers) 小型服务程序容器(servlet containers) EJB容器(EJB containers)
级别

(1)EAR文件的打包

扫描二维码关注公众号,回复: 638425 查看本文章

EAR文件包括整个项目,内含多个 EJB Module(JAR文件)和 Web Module(WAR文件)。

EAR文件的生成可以使用winrar以zip压缩方式或者从命令行以jar命令来生成。

步骤:

1>、先打包成war和jar,并写好application.xml,放到 META-INF 目录下。

2>、运行 jar cf your_application.ear your_war.war your_jar.jar META-INF\application.xml (假设都在当前目录下)。

当然也可以用jar xf your_application.ear来解压。

application.xml是用来描述你的ear中包括的war和jar

weblogic自带的petstore的application.xml例子:

复制代码 代码如下:

<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN' 'http://java.sun.com/j2ee/dtds/application_1_2.dtd'> 
 <application> 
     <display-name>estore</display-name> 
     <description>Application description</description> 
     <module> 
         <ejb>customerEjb.jar</ejb> 
     </module> 
     <module> 
         <ejb>mailerEjb.jar</ejb> 
     </module> 
     <module> 
         <web> 
             <web-uri>petstore.war</web-uri> 
             <context-root>estore</context-root> 
         </web> 
     </module> 
     <module> 
         <ejb>petstoreEjb.jar</ejb> 
     </module> 
     <module> 
         <ejb>signonEjb.jar</ejb> 
     </module> 
     <module> 
         <ejb>personalizationEjb.jar</ejb> 
     </module> 
     <module> 
         <ejb>inventoryEjb.jar</ejb> 
     </module> 
     <module> 
         <ejb>shoppingcartEjb.jar</ejb> 
     </module> 
     <security-role> 
         <description>the gold customer role</description> 
         <role-name>gold_customer</role-name> 
     </security-role> 
     <security-role> 
         <description>the customer role</description> 
         <role-name>customer</role-name> 
     </security-role> 
     <security-role> 
         <role-name>administrator</role-name> 
     </security-role> 
 </application>


(2)WAR的使用

1>、生成war文件使用如下命令:jar  -cvf   web1.war *
2>、查看web1.war中都有哪些文件,可以使用命令:jar  -tf  web1.war
3>、解压web1.war文件,可以使用命令:jar  -xvf  web1.war

另外,也可使用winrar软件选择zip压缩方式,并将压缩文件后缀名改为war即可压缩生成war文件;同样使用winrar软件可以强行打开war 文件,或者强行解压war文件

使用jar命令与winrar软件的区别在于前者在压缩文件的同时会生成 META-INF 文件夹,内包含MANIFEST.MF文件。

(3)何时使用war或者jar文件

当你的项目在没有完全竣工的时候,不适合使用war文件,因为你的类会由于调试之类的经常改,这样来回删除、创建war文件很不爽,最好是你的项目已经完成了,不改了,那么就打个war包吧,这个时候一个war文件就相当于一个web应用程序;而jar文件就是把类和一些相关的资源封装到一个包中,便于程序中引用。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Java的打包jar、war、ear包的作用、区别、打包方式:

1、 作用与区别

i.  jar:通常是开发时要引用通用(JAVA)类,打成包便于存放管理;

ii. war:是做好一个(web)应用后,通常是网站,打成包部署到容器中;

iii. ear: 企业级应用,实际上EAR包中包含WAR包和几个企业级项目的配置文件而已,一般服务器选择WebSphere等,都会使用EAR包。通常是EJB打成ear包。

2、打包方式

i. 所有的包都是用jar打的,只不过目标文件的扩展名不一样;

ii. 也可以用Ant来安成构建。

3、JET编译成EXE

i.  JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件,性能也要打些折扣。所以,使用制作可执行 JAR 文件包的方法就是最佳选择了,何况它还能保持 Java 的跨平台特性。

注意:

将web项目以war的方式导出后,直接放在tomcat容器的webapps下 ,启动服务,即可运行该项目,该war包会自动解压出一个同名的文件夹。

##############

S: web 容器的类加载容器除了加载 WEB-INF下面的classes 外(比lib优先加载),还会加载 WEB-INF下面的lib 包里的jar, 所以这是为什么如果当你想引用一个模块或者一个package时,可以把他饱含到当前项目来,这样编译后如果source folder 那里设置了,就会编译class到WEB-INF的classes 下面, 比如公共的src, 然后把A场的src的加入来编译(或者B场的src),这样公共的src便可以和A场的src一起工作,同时通过ant builder 把对应场的web jsp 等copy过去就可以了。

另外一种方法是: 可以A场的src export 成jar,然后在eclipse 的 buildpath的libraries 里加入该jar ,其实该jar会被copy到 WEB-INF的lib 中 。

这样jvm启动时,当使用该jar入边的类时,便到lib的jar中读出来。 这个就是整个过程。详细加载过程可以看以下 这篇:

 ## eclipse 中有两个项目 A 和B ,其中B的java build path -->projects 中有A,请问这样做有什么作用?

 这样B就可以引入A中的东西,加入A中有个计算平均值的类,那当你的项目B中的某个类中需要用到求平均值的时候,如果B的java  build path里面引入了A,那么B就可以直接去调用A里面的东西,这就跟你导入某个jar包是同一个概念

##我有一个Web项目A,还有另一个Web项目B,在B项目里引用了A项目,但是在从IE里浏览的时候确找不到A项目里的类;应该怎么设置?

不用打包jar,如果你是在eclipse里面运行的话,只要找到B项目的Project的属性(properties)里面,看看"Java Build path",在右侧选项卡里点"Projects",然后Add,选中打开中的A项目就行了。

http://www.cnblogs.com/xing901022/p/4574961.html

图解Tomcat类加载机制

 

  说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷。

  之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,与我们自己的web项目整合后无法直接断点调试。后来同事指导,说是直接把java类复制到src下就可以了。很纳闷....为什么会优先加载src下的java文件(编译出的class),而不是jar包中的class呢?

  现在了解tomcat的类加载机制,原来一切是这么的简单。

类加载

  在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载。

  比如JVM启动时,会通过不同的类加载器加载不同的类。当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。

  因此使用哪种类加载器在什么位置加载类都是JVM中重要的知识。

JVM类加载

  JVM类加载采用 父类委托机制,如下图所示:

  JVM中包括集中类加载器:

  1 BootStrapClassLoader 引导类加载器

  2 ExtClassLoader 扩展类加载器

  3 AppClassLoader 应用类加载器

  4 CustomClassLoader 用户自定义类加载器

  他们的区别上面也都有说明。需要注意的是,不同的类加载器加载的类是不同的,因此如果用户加载器1加载的某个类,其他用户并不能够使用。

  当JVM运行过程中,用户需要加载某些类时,会按照下面的步骤(父类委托机制

  1 用户自己的类加载器,把加载请求传给父加载器,父加载器再传给其父加载器,一直到加载器树的顶层。

  2 最顶层的类加载器首先针对其特定的位置加载,如果加载不到就转交给子类。

  3 如果一直到底层的类加载都没有加载到,那么就会抛出异常ClassNotFoundException。

  因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的class,会优先加载CLASSPATH目录中的文件。

Tomcat类加载

  在tomcat中类的加载稍有不同,如下图:

  当tomcat启动时,会创建几种类加载器:

  1 Bootstrap 引导类加载器 

  加载JVM启动所需的类,以及标准扩展类(位于jre/lib/ext下)

  2 System 系统类加载器 

  加载tomcat启动的类,比如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。位于CATALINA_HOME/bin下。

  3 Common 通用类加载器 

  加载tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,比如servlet-api.jar

  4 webapp 应用类加载器

  每个应用在部署后,都会创建一个唯一的类加载器。该类加载器会加载位于 WEB-INF/lib下的jar文件中的classWEB-INF/classes下的class文件

  当应用需要到某个类时,则会按照下面的顺序进行类加载

  1 使用bootstrap引导类加载器加载

  2 使用system系统类加载器加载

  3 使用应用类加载器在WEB-INF/classes中加载

  4 使用应用类加载器在WEB-INF/lib中加载

  5 使用common类加载器在CATALINA_HOME/lib中加载

问题扩展

  通过对上面tomcat类加载机制的理解,就不难明白 为什么java文件放在Eclipse中的src文件夹下会优先jar包中的class?

  这是因为Eclipse中的src文件夹中的文件java以及webContent中的JSP都会在tomcat启动时,被编译成class文件放在 WEB-INF/class 中。

  而Eclipse外部引用的jar包,则相当于放在 WEB-INF/lib 中。

  因此肯定是 java文件或者JSP文件编译出的class优先加载

  通过这样,我们就可以简单的把java文件放置在src文件夹中,通过对该java文件的修改以及调试,便于学习拥有源码java文件、却没有打包成xxx-source的jar包。

  另外呢,开发者也会因为粗心而犯下面的错误。

  在 CATALINA_HOME/lib 以及 WEB-INF/lib 中放置了 不同版本的jar包,此时就会导致某些情况下报加载不到类的错误。

  还有如果多个应用使用同一jar包文件,当放置了多份,就可能导致 多个应用间 出现类加载不到的错误。

http://blog.sina.com.cn/s/blog_75a8cfac01015mtm.html

Eclipse Java Build Path详解

(2012-08-16 22:27:09)
标签:

杂谈

分类: java

<!-- 正文开始 -->

1.设置"source folder"与"output folder".

* source folder:存放.java源文件的根目录;
    * output folder:.class编译输出的根目录;
    * 纯“java project”中,一般把"src"设置为source folder,把bin设置为output folder;
    * 在“web project”中,一般把"src"设置为source folder,把WEB-INF/classes设置为output

folder;(以上为eclipse的默认设置)
    * “java build path”中的“source”页签:这个就是用来设置"source folder"与"output

folder"的,一般就采用以上eclipse的默认设置;

* 右键工程名->"properties"->"java build path"->"source"->"output folder",点“browser”

选定一个文件夹做为根目录,ok!

* 一般新建一个“java project”时,如果点“next”(而不是直接点“finish”),设置一个

“source folder”(如"src"。),那么一般会自动默认的“output folder”是“工程名/bin”,采用

默认的bin做为output folder即可。

*如果在“java build path”的“source”页签中没有把"src"设置为source folder,则"src"文件

夹在.java文件的package中要以包名的方式加入;例如:
"src"未设置为source folder:package src.com.decisiontree;
"src"设置为了source folder:package com.decisiontree;

感觉source folder就是定位.java源文件根目录的意思吧,也就是说它与package的含义是有这么一点区

别的。

* 如果不设置output folder,默认输出路径为:与.java文件同一个文件夹下。

* 可以使用“add folder”选项设置“工程名”下的任意文件夹做为“source folder”;

 * 或者可以使用“Link Source”选项导入任意文件夹做为“source folder”;

2.Projects 是指是否关联到其他项目进行相关搜索。这个类似于path路径的搜索,有个范围的作用。
3.Libraries是用来管理类库的,包括外部类库的添加与删除。
4.Order and Export有两个属性。调用优先级的问题,越在上边调用优先级越高,例如,在同包同类名的情况下,将优先从上到下执行搜索调用;打勾与不打勾的区别在于导出jar包时是否将这个库的内容也打包到jar中,勾为包含,不勾为不含。

猜你喜欢

转载自zhouchenyu.iteye.com/blog/2298660
今日推荐