您的位置:首页 > 其它

jar包搜寻机制

2016-01-06 10:01 267 查看

一、问题

在类前部,我们都会使用import引入后续需要的类或包。然而对于只使用了jdk或者tomcat中的jar包或者其中类的自定义类,搜寻过程如何呢?那么如果是外部额外的jar包呢,如何搜寻?eclipse中设置到何处可以保证import可以正常引用?而放到容器中,此些而外的jar包该至于何处?

二、外部额外的jar包呢,如何搜寻?

Java程序运行时要导入相应的类,也就是加载 .class 文件的过程。

假设有如下的 import 语句:

该语句表明要导入 p1 包中的 Test 类。

安装JDK时,我们已经设置了环境变量 CLASSPATH 来指明类库的路径,它的值为 .;%JAVA_HOME%\lib,而 JAVA_HOME 又为 D:\Program Files\jdk1.7.0_71,所以 CLASSPATH 等价于 .;D:\Program Files\jdk1.7.0_71\lib。

Java 运行环境将依次到下面的路径寻找并载入字节码文件 Test.class:

.p1\Test.class("."表示当前路径)

如果在第一个路径下找到了所需的类文件,则停止搜索,否则继续搜索后面的路径,如果在所有的路径下都未能找到所需的类文件,则编译或运行出错。

你可以在CLASSPATH变量中增加搜索路径,例如 .;%JAVA_HOME%\lib;C:\javalib,那么你就可以将类文件放在 C:\javalib 目录下,Java运行环境一样会找到。

参考文章:《分析Java 启动器如何查找类》http://www.enet.com.cn/article/2008/0104/A20080104988839.shtml

三、eclipse中设置到何处可以保证import可以正常引用?

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即可。

     如果不设置output folder,默认输出路径为:与.java文件同一个文件夹下。可以使用“add folder”选项设置“工程名”下的任意文件夹做为“source folder”或者可以使用“Link Source”选项导入任意文件夹做为“source folder”;

2、Projects是指是否关联到其他项目进行相关的搜索,这个类似于path路径的搜索,有个反问。

3、Libraries是用来管理类库的,包括外部类库的添加和删除。

4、Order and Export有两个属性,调用优先级的问题,越在上边调用优先级越高。例如,在同包同类名的情况下,将优先从上到下执行搜索调用,打勾与不打勾的区别在于导出jar包时是否将这个库的内容也打包到jar中,勾为包含,不勾为不包含。

四、放到容器中,此些而外的jar包该至于何处?

当我们启动一个tomcat的服务的时候,jar包和claess文件是是以怎么样的顺序被加载进来的?

加载顺序:

1. $java_home/lib 目录下的java核心api

2. $java_home/lib/ext 目录下的java扩展jar包

3. java -classpath/-Djava.class.path所指的目录下的类与jar包

4. $CATALINA_HOME/common目录下按照文件夹的顺序从上往下依次加载

5. $CATALINA_HOME/server目录下按照文件夹的顺序从上往下依次加载

6. $CATALINA_BASE/shared目录下按照文件夹的顺序从上往下依次加载

7. 我们的项目路径/WEB-INF/classes下的class文件

8. 我们的项目路径/WEB-INF/lib下的jar文件

在同一个文件夹下,jar包是按顺序从上到下依次加载

由ClassLoader的双亲委托模式加载机制我们可以知道,假设两个包名和类名完全相同的class文件不再同一个jar包,如果一个class文件已经被加载java虚拟机里了,那么后面的相同的class文件就不会被加载了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: