java jar / Bootstrap Class Loader / Extension Class Loader / Application Class Loader

-  Java的双亲委派

java的双亲委派机制最早出现在Java 1.2版本。在Java 1.2之前,类加载机制是单一的,即由一个类加载器完成所有的类加载工作。而在Java 1.2及之后的版本,引入了更加灵活和安全的双亲委派机制。

双亲委派机制的引入是为了解决类加载的一些安全和命名空间的问题,确保Java应用程序的稳定性和安全性。

双亲委派机制成为Java类加载的基本原则。

 

Java的双亲委派(Parent Delegation)是一种类加载机制,用于保障Java应用程序的稳定性和安全性。该机制是建立在类加载器的层次结构之上的,其核心思想是由上至下的委托机制。

具体来说,Java的类加载器层次结构如下:

  1. 启动类加载器(Bootstrap Class Loader):

    • 这是Java虚拟机的一部分,负责加载Java核心库,如java.lang包。
  2. 扩展类加载器(Extension Class Loader):

    • 负责加载Java的扩展库,位于java.ext.dirs系统属性所指定的目录。
  3. 应用程序类加载器(Application Class Loader):

    • 也称为系统类加载器,负责加载应用程序类。它是ClassLoader类的子类,通常由Java应用程序的启动类调用。

这里的双亲委派机制的工作方式如下:

  • 当一个类加载器收到加载类的请求时,它首先不会尝试自己加载,而是把请求委托给父类加载器去完成。
  • 如果父类加载器能够完成加载任务,那么加载过程结束。
  • 如果父类加载器无法完成加载任务,子类加载器才会尝试自己加载。

这种机制的好处在于:

  1. 隔离命名空间: 避免了类的重复加载,保证了类的唯一性,避免了类的冲突。
  2. 安全性: 防止恶意类的加载,保护核心API不受恶意类的影响。
  3. 稳定性: 通过父类加载器优先加载,确保使用的是系统提供的稳定版本,防止不稳定版本的类被加载。

这种双亲委派机制是Java中类加载的基本原则,保障了类加载的有序性和安全性。

 

jars collection

http://www.docjar.com/

http://peng4602.iteye.com/blog/243495#comments

 

jar包查询网站 非常好用!

http://zgqhyh.iteye.com/blog/558184
http://jarvana.com/jarvana/   可直接查看源码,下载各个版本的jar包等,强力推荐
http://www.findjar.com/index.x 这个没有上一个好,不过也不错了

 

DOS jdk1.6

当前目录所有文件打包为singleton.jar

D:\workspace\java\src\com\javaeye\lindows\design23>jar cvf singleton.jar .

D:\workspace\java\src\com\javaeye\lindows\design23>jar cvf singleton.jar ./

D:\workspace\java\src\com\javaeye\lindows\design23>jar cvf singleton.jar ./*.*

D:\workspace\java\src\com\javaeye\lindows\design23>jar cvf singleton.jar .\*.*

注:jar cvf singleton.jar .\ 这种方式打包解压数据未丢失但都批量更改为.\*.java的文件和其他

 

当前目录所有文件打包为 x.war
F:\s*****\b2c\b2c_src>jar cvf x.war .

F:\s*****\b2c\b2c_src>jar cvf x.war ./

F:\s*****\b2c\b2c_src>jar cvf x.war ./*.*

 

 

 

 

1.jar文件打包
假设需要打包的文件如下:
classes\com\albertsong\MyApp.class
classes\com\albertsong\Aaaa.class
classes\com\albertsong\util\Bbbb.class
(其中MyApp包含main函数)
建一个mymanifest.mf 文件,内容如下:
Main-Class: com.albertsong.MyApp


建一个myjar.bat文件,内容如下:
set JAVA_HOME=C:\jsdk1.5.0_09
set PATH=%JAVA_HOME%\bin
set CLASSPATH=%JAVA_HOME%\lib\tools.jar;
jar cvfm MyApp.jar mymanifest.mf  -C classes .

这两个文件都放到和classes同一个目录,即目录结构象下面一样
MyApp\classes\com\albertsong\MyApp.class
MyApp\classes\com\albertsong\Aaaa.class
MyApp\classes\com\albertsong\util\Bbbb.class
MyApp\mymanifest.mf
MyApp\myjar.bat
然后点myjar.bat这个文件执行就可以了:)

2.执行jar文件
建一个目录MyApp/release。
将生成的MyApp.jar复制到这个目录。
在这个目录里新建一个批处理文件run.bat,内容如下:
set JAVA_HOME=C:\jsdk1.5.0_09
set PATH=%JAVA_HOME%\bin
set CLASSPATH=%JAVA_HOME%\lib\tools.jar;
javaw -jar MyApp.jar

3.其它
   1)jar cvfm MyApp.jar mymanifest.mf  -C classes .
      这行命令,最后的. 一定不能掉 ,jar命令给出的帮助的例子是
       jar cvfm classes.jar mymanifest -C foo/ .
      但是在windows下应该改成
      jar cvfm classes.jar mymanifest -C foo\ .
      或者
     jar cvfm classes.jar mymanifest -C foo .
   2)如果应用程序比较大,可能会用到其它的库,这时可以在release目录下建一个lib
     然后在run.bat的CLASSPATH中添加用到的库。
   set CLASSPATH=%JAVA_HOME%\lib\tools.jar;lib\ccc.jar;lib\ddd.jar;
    3)如果要指定java程序使用的内存,这样
    javaw -ms100m -mx256m -jar MyApp.jar
    上面指定了使用最小100M最大256M内存。
    4)如果main函数要带参数
    javaw -ms100m -mx256m -jar MyApp.jar  arg1 arg2
    5)如果不能在控制台看到有关信息,可以用java来执行jar包
      java -ms100m -mx256m -jar MyApp.jar  arg1 arg2
     javaw在后台执行。
    6)如果bat文件一闪而过,看不到输出,可以在文件最后一行加上pause,最好的是通过cmd.exe来运行run.bat。

后记:
    老早以前写过一个,后来丢失了,今天因为忘了点号和反斜杠的问题,又浪费不少时间。

posted @ 2008-09-07 21:48  siemens800  阅读(28)  评论(0)    收藏  举报