一个简单的classpath工具

转载 2004年09月29日 19:36:00
        优先级问题是扁平路径声明方法与生俱来固有的问题,但它不是只有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中哪一个类先被装载,你必须深入到类装载器的思考方法。事实上,具体实现的时候并没有听起来这么复杂——你只需直接询问类装载器就可以了!

1: public class JWhich {
2:
3: /**
4: * 根据当前的classpath设置,
5: * 显示出包含指定类的类文件所在
6: * 位置的绝对路径
7: *
8: * @param className <类的名字>
9: */
10: public static void which(String className) {
11:
12: if (!className.startsWith("/")) {
13: className = "/" + className;
14: }
15: className = className.replace('.', '/');
16: className = className + ".class";
17:
18: java.net.URL classUrl =
19: new JWhich().getClass().getResource(className);
20:
21: if (classUrl != null) {
22: System.out.println("/nClass '" + className +
23: "' found in /n'" + classUrl.getFile() + "'");
24: } else {
25: System.out.println("/nClass '" + className +
26: "' not found in /n'" +
27: System.getProperty("java.class.path") + "'");
28: }
29: }
30:
31: public static void main(String args[]) {
32: if (args.length > 0) {
33: JWhich.which(args[0]);
34: } else {
35: System.err.println("Usage: java JWhich ");
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行)。 
                                                                                                                  作者:仙人掌工作室出处: enet

分享一个.NET实现的简单高效WEB压力测试工具

在Linux下对Web进行压力测试的小工具有很多,比较出名的有AB.虽然AB可以运行在windows下,但对于想简单界面操作的朋友有点不太习惯.其实vs.net也提供压力测试功能但显然显得太重了,在测...
  • itsoftchenfei
  • itsoftchenfei
  • 2013年08月24日 16:30
  • 1752

Java项目中的classpath

一、classpath介绍 设置Classpath的目的,在于告诉Java执行环境,在哪些目录下可以找到您所要执行的Java程序所需要的类或者包。 Java执行环境本身就是一个平台,执行于这个平台上的...
  • honghailiang888
  • honghailiang888
  • 2016年07月11日 10:52
  • 2242

玩转Java的CLASSPATH(二)Classpath工具

二、可能出现的问题   不管他们是否愿意承认,初学者和富有经验的Java开发者都一样,他们都曾经在某些时候(通常是在那些最糟糕的情形下)被冗长、复杂的classpath欺骗。应用程序所依赖的第三方类和...
  • wangyongligood
  • wangyongligood
  • 2007年10月21日 21:09
  • 183

笔记:通过Spring工具类获取classpath下的文件资源

通过Spring工具类获取classpath下的文件资源 1、资源文件不在jar中 File cfgFile = ResourceUtils.getFile("classpath:test.txt...
  • liu251
  • liu251
  • 2012年10月11日 13:38
  • 14554

web.xml中的classpath指项目中的哪个路径

以springmvc项目为例,将其打包成springmvc.war文件 发现底下有3个文件,进去WEB-INF 我们通常说的classpath指的是WEB-INF下的classes...
  • hello_noob
  • hello_noob
  • 2018年01月01日 12:44
  • 42

Web工程和引用工程的CLASSPATH下存在同一个配置文件,例如test.properties,部署后会加载哪个?

1、Web工程下有test.properties配置文件,引用工程下没有 部署结果引用的是Web工程下的该配置文件。 2、引用工程下有test.properties配置文件,Web工程下没有 ...
  • u013409622
  • u013409622
  • 2015年04月09日 09:11
  • 531

如何利用启动脚本将目录下的多个jar自动加入到classpath中

http://blog.sina.com.cn/s/blog_591a64cd01000ahs.html    自己写的java独立程序,一般都需要提供一个脚本来启动程序,就像我们常用的tomcat、...
  • jiaoly
  • jiaoly
  • 2016年08月05日 16:03
  • 1954

用C语言实现解析简单配置文件的小工具

本文介绍作者写的一个小工具,简单的代码中包含了C语言对字符串的处理技巧,对文本文件的简单解析,二进制文件的数据复制的方法,以及格式化输出文本文件的示例。 工具的输入是如下内容的配置文件: ;资...
  • turingo
  • turingo
  • 2012年12月18日 14:47
  • 3693

PyQt5简单小工具制作步骤:

学了几个月的python了,突然想做点自己的工具,想起自己以前用QT写C++的GUI的时候,记得用pyqt可以写GUI,就学了一周。把基本的东西都看了一遍,感觉和QT差不多!但是pyqt5 的中文资料...
  • yhflyl
  • yhflyl
  • 2017年12月13日 12:56
  • 187

path和classpath环境变量的配置目的及其配置的必要性说明

在第一篇介绍java SE和JDK时我们说到,下载安装JDK完成后在“命令提示符”窗口中输入java指令后回车,如果窗口中有内容显示,证明JDK的初步安装已经完成,要完成最终安装必须还要配置环境变量p...
  • gpf1320253667
  • gpf1320253667
  • 2015年03月15日 08:58
  • 1139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的classpath工具
举报原因:
原因补充:

(最多只允许输入30个字)