仓酷云

标题: JAVA网页编程之玩转Java的CLASSPATH [打印本页]

作者: 兰色精灵    时间: 2015-1-18 11:43
标题: JAVA网页编程之玩转Java的CLASSPATH
由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,择要:
===================================
从外表上看,Java的classpath(类路径)很复杂,但一向以来它都是一个发生成绩和凌乱的本源。本文先容classpath的基础常识、大概发生的成绩,并供应了一个复杂的classpath办理工具。
===================================
注释:
===================================

和Java类路径(classpath)打交道的过程当中,开辟者偶然会碰到贫苦。这是由于,类装载器实践装进的是哪个类偶然其实不不言而喻,当使用程序的classpath包括大批的类和目次时,情形特别严峻。本文将供应一个工具,它可以显现出被装进类文件的相对路径名。


1、Classpath基本


Java假造机(JVM)借助类装载器装进使用程序利用的类,详细装进哪些类依据事先的必要决意。CLASSPATH情况变量告知类装载器到那里往寻觅第三方供应的类和用户界说的类。别的,你也能够利用JVM命令行参数-classpath分离为使用程序指定类路径,在-classpath中指定的类路径掩盖CLASSPATH情况变量中指定的值。


类路径中的内容能够是:文件的目次(包括不在包内里的类),包的根目次(包括已打包的类),包括类的档案文件(好比.zip文件大概.jar文件)。在Unix家属的体系上,类路径的各个项目由冒号分开,在MSWindows体系上,它们由分号分开。


类装载器以托付条理的情势构造,每个类装载器有一个父类装载器。当一个类装载器被请求装载某个类时,它在实验本人寻觅类之前会把哀求先托付给它的父类装载器。体系类装载器,即由安装在体系上的JDK或JRE供应的默许类装载器,经由过程CLASSPATH情况变量大概-classpath这个JVM命令行参数装进第三方供应的类大概用户界说的类。体系类装载器托付扩大类装载器装进利用JavaExtension机制的类。扩大类装载器托付自举类装载器(bootstrapclassloader)装进中心JDK类。


你能够本人开辟特别的类装载器,定制JVM怎样静态地装进类。比方,年夜多半Servlet引擎利用定制的类装载器,静态地装进那些在classpath指定的目次内产生变更的类。


必需出格注重的是(也是使人受惊的是),类装载器装进类的序次就是类在classpath中呈现的序次。类装载器从classpath的第一项入手下手,顺次反省每个设定的目次和紧缩文件,实验找出待装进的类文件。当类装载器第一次找到具有指命名字的类时,它就把该类装进,classpath中一切余下的项目都被疏忽。


看起来很复杂,对吧?

2、大概呈现的成绩


不论他们是不是乐意供认,初学者和富有履历的Java开辟者都一样,他们都已经在某些时分(一般是在那些最糟的情况下)被冗杂、庞大的classpath棍骗。使用程序所依附的第三方类和用户界说类的数目渐渐增加,classpath也渐渐成了一个聚积一切大概的目次和档案文件名的中央。此时,类装载器起首装载的事实是哪个类也就不再不言而喻。假如classpath中包括反复的类出口,这个成绩特别凸起。后面已提到,类装载器老是装载第一个它在classpath中找到的具有符合名字的类,从实践效果看,它“埋没”了其他具有符合名字但在classpath中优先级较低的类。


假如不当心,你很简单失落进这个classpath的圈套。当你停止了一天冗长的事情,最初为了让使用程序利用最好、最新的类,你把一个目次到场到了classpath,但与此同时,你却健忘了:在classpath的另外一个具有更高优先级的目次下,寄存着该类的另外一个版本!


3、一个复杂的classpath工具


优先级成绩是扁平路径声明办法与生俱来固有的成绩,但它不是只要Java的classpath才有的成绩。要办理这个成绩,你只需站到富有传奇色采的软件巨构的肩膀上:Unix操纵体系有一个which命令,在命令参数中指定一个名字,which就会显现出当这个名字作为命令实行时实行文件的路径名。实践上,which命令是剖析PATH变量,然后找出命令第一次呈现的地位。关于Java的类路径办理来讲,这应当也是一个好工具。在它的启示之下,我动手计划了一个Java工具JWhich。这个工具请求指定一个Java类的名字,然后依据classpath的指引,找出类装载器行将装载的类地点地位的相对路径。


上面是一个JWhich的利用实例。它显现出当Java类装载器装载com.clarkware.ejb.ShoppingCartBean类时,该类第一次呈现地位的相对路径名,查找了局显现该类在某个目次下:


>javaJWhichcom.clarkware.ejb.ShoppingCartBean

Classcom.clarkware.ejb.ShoppingCartBeanfoundin
/home/mclark/classes/com/clarkware/ejb/ShoppingCartBean.class




上面是第二个JWhich的利用实例。它显现出当Java类装载器装载javax.servlet.http.HttpServlet类时,该类第一次呈现地位的相对路径名,查找了局显现该类在某个档案文件中:


>javaJWhichjavax.servlet.http.HttpServlet

Classjavax.servlet.http.HttpServletfoundin
file:/home/mclark/lib/servlet.jar!/javax/servlet/http/HttpServlet.class

4、JWhich的事情历程

要准确地测定classpath中哪个类先被装载,你必需深切到类装载器的思索办法。现实上,详细完成的时分并没有听起来这么庞大――你只需间接扣问类装载器就能够了!


1:publicclassJWhich{
2:
3:/**
4:*依据以后的classpath设置,
5:*显现出包括指定类的类文件地点
6:*地位的相对路径
7:*
8:*@paramclassName<类的名字>
9:*/
10:publicstaticvoidwhich(StringclassName){
11:
12:if(!className.startsWith("/")){
13:className="/"+className;
14:}
15:className=className.replace(.,/);
16:className=className+".class";
17:
18:java.net.URLclassUrl=
19:newJWhich().getClass().getResource(className);
20:
21:if(classUrl!=null){
22:System.out.println("
Class"+className+
23:"foundin
"+classUrl.getFile()+"");
24:}else{
25:System.out.println("
Class"+className+
26:"notfoundin
"+
27:System.getProperty("java.class.path")+"");
28:}
29:}
30:
31:publicstaticvoidmain(Stringargs[]){
32:if(args.length>0){
33:JWhich.which(args[0]);
34:}else{
35:System.err.println("Usage:javaJWhich<classname>");
36:}
37:}
38:}




起首,你必需略微调剂一下类的名字以便类装载器可以承受(12-16行)。在类的名字后面加上一个“/”暗示请求类装载器对classpath中的类名字举行逐字准确婚配,而不是实验隐含地加上挪用类的包名字前缀。把一切“.”转换为“/”的目标是,依照类装载器的请求,把类名字格局化成一个正当的URL资本名。

接上去,程序向类装载器查询资本,这个资本的名字必需和经由得当格局化的类名字婚配(18-19行)。每个Class对象保护着一个对装载它的ClassLoader对象的援用,以是这里是向装载JWhich类的类装载器查询。Class.getResource()办法实践上托付装进该类的类装载器,前往一个用于读取类文件资本的URL;大概,当指定的类名字不克不及在以后的classpath中找到时,Class.getResource()办法前往null。

最初,假如以后的classpath中可以找到指定的类,则程序显现包括该类的类文件地点地位的相对路径名(21-24行)。作为一种调试帮助手腕,假如以后classpath中不克不及找到指定的类,则程序猎取java.class.path体系属性并显现以后的classpath(24-28行)。

很简单设想,在利用Servlet引擎classpath的JavaServlet中,大概在利用EJB服务器classpath的EJB组件中,下面这段复杂的代码是怎样运作。比方,假如JWhich类是由Servlet引擎的定制类装载器装进,那末程序将用Servlet引擎的类装载器往寻觅指定的类。假如Servlet引擎的类装载器不克不及找到类文件,它将托付它的父类装载器。一样平常地,当JWhich被某个类装载器装进时,它可以找出以后类装载器和一切其父类装载器所装进的一切类。

【停止语】假如必要是一切创造之母,那末匡助我们办理Java类路径的工具能够说早退了很长工夫。Java旧事组和邮件列表中充塞着很多有关classpath的成绩,如今JWhich为我们供应了一个复杂却壮大的工具,匡助我们在任何情况中完全玩转Java类路径。

Java的桌面程序开发在java程序员里通常叫swing开发,主要用的swing包里的类开发的,也就是通常说的c/s架构开发
作者: 不帅    时间: 2015-1-19 11:44
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者: 飘灵儿    时间: 2015-1-24 12:25
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 简单生活    时间: 2015-2-2 06:51
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 莫相离    时间: 2015-2-2 22:19
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 再现理想    时间: 2015-2-8 12:59
是一种突破用户端机器环境和CPU
作者: 海妖    时间: 2015-2-8 19:07
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 老尸    时间: 2015-2-23 12:05
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 分手快乐    时间: 2015-3-7 03:05
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: 蒙在股里    时间: 2015-3-10 12:54
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 透明    时间: 2015-3-17 07:11
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者: 仓酷云    时间: 2015-3-22 05:09
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 只想知道    时间: 2015-4-1 22:10
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者: 谁可相欹    时间: 2015-4-10 06:49
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 小魔女    时间: 2015-4-12 23:55
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
作者: 小女巫    时间: 2015-4-16 05:10
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: 乐观    时间: 2015-4-21 21:50
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 爱飞    时间: 2015-4-25 02:09
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 精灵巫婆    时间: 2015-4-26 22:35
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 活着的死人    时间: 2015-4-28 03:50
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2