轻松玩转Java配置的Classpath

2016-01-29 12:50 19 1 收藏

轻松玩转Java配置的Classpath,轻松玩转Java配置的Classpath

【 tulaoshi.com - Java 】

  和Java类路径(classpath)打交道的过程中,开发者偶尔会遇到麻烦。这是因为,类装载器实际装入的是哪一个类有时并不显而易见,当应用程序的classpath包含大量的类和目录时,情况尤其严重。本文将提供一个工具,它能够显示出被装入类文件的绝对路径名。

  一、Classpath基础

  Java虚拟机(JVM)借助类装载器装入应用程序使用的类,具体装入哪些类根据当时的需要决定。CLASSPATH环境变量告诉类装载器到哪里去寻找第三方提供的类和用户定义的类。另外,你也可以使用JVM命令行参数-classpath分别为应用程序指定类路径,在-classpath中指定的类路径覆盖CLASSPATH环境变量中指定的值。

  类路径中的内容可以是:文件的目录(包含不在包里面的类),包的根目录(包含已打包的类),包含类的档案文件(比如.zip文件或者.jar文件)。在Unix家族的系统上,类路径的各个项目由冒号分隔,在MS Windows系统上,它们由分号分隔。

  类装载器以委托层次的形式组织,每一个类装载器有一个父类装载器。当一个类装载器被要求装载某个类时,它在尝试自己寻找类之前会把请求先委托给它的父类装载器。系统类装载器,即由安装在系统上的JDK或JRE提供的默认类装载器,通过CLASSPATH环境变量或者-classpath这个JVM命令行参数装入第三方提供的类或者用户定义的类。系统类装载器委托扩展类装载器装入使用Java Extension机制的类。扩展类装载器委托自举类装载器(bootstrap class loader)装入核心JDK类。

  你可以自己开发特殊的类装载器,定制JVM如何动态地装入类。例如,大多数Servlet引擎使用定制的类装载器,动态地装入那些在classpath指定的目录内发生变化的类。

  必须特别注意的是(也是令人吃惊的是),类装载器装入类的次序就是类在classpath中出现的次序。类装载器从classpath的第一项开始,依次检查每一个设定的目录和压缩文件,尝试找出待装入的类文件。当类装载器第一次找到具有指定名字的类时,它就把该类装入,classpath中所有余下的项目都被忽略。

  看起来很简单,对吧?

  二、可能出现的问题

  不管他们是否愿意承认,初学者和富有经验的Java开发者都一样,他们都曾经在某些时候(通常是在那些最糟糕的情形下)被冗长、复杂的classpath欺骗。应用程序所依赖的第三方类和用户定义类的数量逐渐增长,classpath也逐渐成了一个堆积所有可能的目录和档案文件名的地方。此时,类装载器首先装载的究竟是哪一个类也就不再显而易见。如果classpath中包含重复的类入口,这个问题尤其突出。前面已经提到,类装载器总是装载第一个它在classpath中找到的具有合适名字的类,从实际效果看,它“隐藏”了其他具有合适名字但在classpath中优先级较低的类。

  如果不小心,你很容易掉进这个classpath的陷阱。当你结束了一天漫长的工作,最后为了让应用程序使用最好、最新的类,你把一个目录加入到了classpath,但与此同时,你却忘记了:在classpath的另一个具有更高优先级的目录下,存放着该类的另一个版本!

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/java/)

   三、一个简单的classpath工具

  优先级问题是扁平路径声明方法与生俱来固有的问题,但它不是只有Java的classpath才有的问题。要解决这个问题,你只需站到富有传奇色彩的软件巨构的肩膀上:Unix操作系统有一个which命令,在命令参数中指定一个名字,which就会显示出当这个名字作为命令执行时执行文件的路径名。实际上,which命令是分析PATH变量,然后找出命令第一次出现的位置。对于Java的类路径管理来说,这应该也是一个好工具。在它的启发之下,我着手设计了一个Java工具JWhich。这个工具要求指定一个Java类的名字,然后根据classpath的指引,找出类装载器即将装载的类所在位置的绝对路径。

  下面是一个JWhich的使用实例。它显示出当Java类装载器装载com.clarkware.ejb.ShoppingCartBean类时,该类第一次出现位置的绝对路径名,查找结果显示该类在某个目录下:

   java JWhich com.clarkware.ejb.ShoppingCartBean

  Class 'com.clarkware.ejb.ShoppingCartBean' found in
  '/home/mclark/classes/com/clarkware/ejb/ShoppingCartBean.class'

  下面是第二个JWhich的使用实例。它显示出当Java类装载器装载javax.servlet.http.HttpServlet类时,该类第一次出现位置的绝对路径名,查找结果显示该类在某个档案文件中:

   java JWhich javax.servlet.http.HttpServlet

  Class 'javax.servlet.http.HttpServlet' found in
  'file:/home/mclark/lib/servlet.jar!/javax/servlet/http/HttpServlet.class'

  四、JWhich的工作过程

  要精确地测定classpath中哪一个类先被装载,你必须深入到类装载器的思考方法。事实上,具体实现

来源:https://www.tulaoshi.com/n/20160129/1487756.html

延伸阅读
Java的中文问题历史悠久,连绵不绝,至今也没有完全解决,但是上有政策下有对策,我们总是有办法搞定它的。跟Java相关的中文问题主要有两类,一类是编程的问题,涉及到I/O,内码转换等。第二类是Java运行环境的配置,涉及字体,属性配置等。我刚刚用了一天的时间解决这些问题,觉得很有必要给自己写个备忘录之类的。 我看还是从问题入...
确定你的jdk环境变量配置是正确的。 对于Java初学者来说,编译和运行java程序是一件很头疼的东西。 显然,在命令方式下编译和运行java程序用久了,确实是很麻烦, 而我们又不想使用大型的开发工具时,UltraEdit是一个不错的选择, 很多初学者都是用它来编写java源文件的,可以高亮度显示要害字。 1。要害字高亮度显示...
  学习Java已经很长时间了,但是总感觉基础不是很好,有时候遇到一些平时不常见的问题就会无从下手,也从侧面显现了自己的一些问题。所以,打算写Java的随手笔记来巩固基础,加强学习。今天是第一篇,主要是java的安装,配置,也就是常说的Hello world。   一、下载   进入Oracle的官网,下载Java的jdk,   ...
 Java开源实践1--环境配置  wuder Window系统下的deploy所需软件: 以下软件为window下执行 Jdk5.0 下载地址:http://java.sun.com/j2se/1.5.0/download.jsp           jdk-1_5_0_01-windows-i586-p.exe Jboss4.01 ...
本例子为读取配置文件,一般用作读取参数 /*  * Created on 2004-9-21  *  * Java读取配置文件例子 */ package net.jspcn.test; import java.util.*; import java.io.*; /**  * @author whilvydy  * ...

经验教程

280

收藏

23
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部