- 浏览: 428068 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
AJCF:
System.out.println(System. ...
<转>Java相对路径/绝对路径总结 -
piaobeizu:
[b][/b]
<转>Java相对路径/绝对路径总结 -
laorer:
balan326 写道你好,最近在网上看了你写的数据库连接池, ...
数据库连接池java实现小结 -
balan326:
你好,最近在网上看了你写的数据库连接池,iteye网你的博客, ...
数据库连接池java实现小结 -
kyoisme2000:
区别在哪里也不说,怎么就解决了
spring绑定java.util.Date时的一个问题
管理 Java 类路径 (Windows)在 Windows 上管理类路径的技巧 http://www.ibm.com/developerworks/cn/java/j-classpath-windows/ |
级别: 初级 Elliotte Harold (elharo@metalab.unc.edu), 副教授, Polytechnic 大学 2007 年 1 月 04 日 类路径是 Java™ 平台中最复杂也最令人头痛的部分之一,但熟练掌握类路径对成为一名专业 Java 程序员来说却又十分关键。在本文中,Elliotte Rusty Harold 为您阐述了类路径和源路径的复杂性,并向您展示了如何在 Windows 中熟练掌握它们。如果您使用的是 UNIX 或 Mac OS X,请参阅本文的 姊妹篇。<!----><!----><!----> 类路径可以连接 Java 运行库和文件系统。它定义编译器和解释器应该在何处查找要加载的 .class 文件。它的基本思想是:文件系统的层次结构反映了 Java 包的层次结构,而类路径则定义了文件系统中的哪个目录可以作为 Java 包层次结构的根。 遗憾的是,通常文件系统非常复杂并依赖于平台,而且和 Java 包也不能很好地匹配。尤其是在 Windows 环境中更是如此。Java 是一些 Unix 高手设计的,因而从很多方面来说,这也就意味着它无法很好地与 Windows 约定同步。这样一来,不论是新用户还是资深 Java 程序员都深感类路径的棘手。没错,它的确不是 Java 平台好的一面,它让您到了下班的时候还在忙于调试一个顽固的小问题。 当然采用 Eclipse 这样的优秀 IDE 可以减少管理类路径的一些困难,但只能说是一些,而且前提还必须是一切都正常(但这不大可能,因为总会有一些意外出现)。因此,每个 Java 程序员都必须要全面了解类路径,惟有如此,才有希望调试类路径中所出现的问题。 在本文中,我给出了您所需要了解的有关 Windows 中的 Java 类路径(以及相关源路径)的全部内容。本文的 姊妹篇 则展示了 UNIX 和 Mac OS X 上的类似技术。遵循这里列出的步骤可以防止不必要的类路径故障并能解决出现的大多数问题。 要掌握类路径,首先应从其源代码入手。每个类都属于一个包,而此包必须 遵守标准的命名约定。简单地说,包的名称要由颠倒的两级域名开始,比如
在颠倒的域名之后,需要使用单一单词的子包名。不要使用缩写形式,并要保证拼写正确。如果需要,可以使用拼写检查器。大部分与类路径相关的问题都是由在源代码中使用某个单词而在文件系统中使用的却是与之稍有不同的拼写或缩写而引起的。所以最好的做法就是总是使用拼写正确且没有缩写的名称。 整个包名称应该是小写的,即使该名称是在别处常采取大写形式的一些惯用名称和缩写词。Windows 通常不区分文件名中的大小写,但 Java 和一些 UNIX 文件系统却区分。如果需要在不同的系统间移动文件,大小写问题肯定会带来一些麻烦。 包名称必须要全部由 ASCII 字符组成。一些编译器也接受用 Hebrew、Cyrillic、Greek 或其他脚本编写的包名称,但大多数文件系统并不接受;您稍后就会看到,这样的包名称必须担负充当目录名这样的双重任务。Java 包和类名是 Unicode,但很多文件系统(包括 FAT)却不能识别 Unicode。遗憾的是,FAT 系统非常之多。如果只简单地用不同的默认编码将文件复制到系统将会使编译器和解释器无法找到正确的类。
不要试图在包名称方面节约成本。长远来看,这只会有百害而无一利。如果需要域名就买一个。如果名称太长就买个短些的(我曾经买到了 xom.nu 这样一个域名,因而我的包前缀就只有 6 个字符)。不要将类放到默认包中(默认包是指如果未在类中包含一条包语句时系统默认给出的包)。如果包访问不利于对象间的通信,就需要向类中添加更多的公共方法。需要多次使用的类必须要放到包中。 文件扩展名和路径对于 Java 和 Windows 来说都很重要。所以在开始下面的步骤之前,务必确保能够看到它们。隐藏部分文件名对终端用户来说还可以接受(但我并不完全这么认为),但对于开发人员来说显然不行。要解决这个问题,需要对 Windows Explorer 的一些默认设置做些更改。 首先在 Windows 桌面打开任意一个文件夹。找到 Tools 菜单,选择 Folder Options。在随后打开的对话框中,确认选择了如下三个选项,如图 1 所示:
图 1. Windows Explorer 选项 您可能还想选中 “Show hidden files and folders”,它对您的 Java 作业没有多大影响,但就我个人而言,我很希望能够看到所操作的所有内容。选中这些选项可以显露关于所做事情的更多细节,使您能更轻松地调试所出现的问题。
下一步要做的是组织源文件来匹配包结构。在某处创建一个干净的空白目录。本文中,我将其命名为 project。如果将该目录放到根级别(比如 C:\project)就会更容易一些。也可以将其放到桌面或 Documents and Settings 文件夹。但这会让输入的命令更长也更为复杂,所以只在十分必要的情况下才这么做(如果您运行的是 Windows XP 或更高,而且没有管理员权限,那您没有什么其他的选择。在单用户系统上,最好是要有管理员权限,这会使情况大大简化)。 无论如何,不要将此目录(或任何其他目录)放到 JDK 文件夹(例如 C:\jdk1.6.0 或 C:\Program Files\Java\j2sdk1.5.0_09)。JDK 和 JRE 目录在初始安装之后应该保持不动。 在 project 目录内,另外创建两个目录: bin 和 src(一些人更喜欢将其分别命名为 build 和 source)。 接下来,在 src 目录,建一个与包层次结构相匹配的层次结构。例如,如果给定类名为 图 2. 符合包结构的目录结构 要点:不要在 src 目录中放置除源代码之外的任何内容。通常这里放入的文件都是 .java 文件。在有些情况下,也可放置 .html 文件(用于 JavaDoc)或其他类型的源代码。然而,决不能在此结构内放置 .class 文件或任何其他编译并生成的工件。这样做只会带来麻烦。遗憾的是,如果不够谨慎,javac 编译器就会 “明知故犯”。在下一节,将介绍如何修复这一问题。
编译 Java 代码需要一些技巧,原因是必须要跟踪如下几方面相关但又有所不同的内容:
默认地,javac 编译器将上述目录都认为是当前目录,而这并不是您所希望的。因此,需要在编译时显式地指定这些元素。 指定的第一个要编译的文件是 .java 文件,以从当前目录到该文件的整个路径的形式给出。比如,假设当前所在目录是 图 1 所示的 project 目录。该目录包含 src 目录。此 src 目录包含 com 目录,而 com 目录又包含 example 目录,example 目录下是 Fraction.java 文件。如下命令行对它进行编译:
如果路径不正确,就会给出这样的错误消息:
如果出现这样的错误消息,就需要检查路径的各个部分,确保它们拼写正确。在本例中,错误消息显示 math 的第二和第三个字母颠倒了。 如果没有发现拼写错误,请检查该文件是否处于它应该出现的位置,方法是按如下所示发出一个
出现问题的原因通常是因为路径拼写错误,但也可能是由于当前的目录不对。在本例中,需要检查当前的工作目录是不是 project 目录。检查命令行上 假设没有出现任何语法错误,javac 将编译后的 .class 文件放到与之对应的.java 文件所在的相同目录内。这并不是您所想要的结果。将 .class 和 .java 文件混在一起常常会使清理编译后的文件十分困难,因为很可能会意外删除本应保留的 .java 文件。这常会使清理构建十分困难,而且还会导致版本问题。发布一个二进制时,只对编译后的 .class 文件进行归档也会十分困难。因此,需要告知编译器将编译后的输出放到一个完全不同的目录内。
这时的输出将如图 3 所示。请注意 javac 已经创建了完整的 com\elharo\math 目录层次结构。不需要手动建立。 图 3. 并行源和编译后的层次结构 源路径 就是 Java 在其中寻找源文件的那个目录。具体到本例,就是 src 目录。该目录必须包含源文件的层次结构,这些源文件可以被放到它们自己的目录中。因此它不是 com 目录也不是 src\com\elharo\math 目录。 很多项目都使用不止一个类和包。它们通过导入语句和完整的包限定类名连接起来。例如,假设您在 清单 1. 一个包中的类可以导入另一个包中的类
该类使用的是与 图 4. 几个包的源结构 现在来看一下试着像以前一样编译 MainFrame.java 会出现什么情况。 清单 2. 编译 MainFrame.java
出现清单 2 中的错误的原因是,虽然 javac 知道到何处可以找到 MainFrame.java,但它却并不知道到何处可以找到 Fraction.java(您可能觉得它应该具备足够的智能来识别匹配的层次结构,但事实并非如此)。为了给它提供一些线索,必须指定源路径。用源路径指定编译器应该到哪些目录查找源文件的层次结构。在清单 2 中,源路径是 src。所以我使用了
现在再编译程序,就不会出现错误,并会产生如图 5 所示的输出。请注意 javac 也编译了文件 Fraction.java,Fraction.java 被当前编译的文件引用。 图 5. 多类输出 在源路径中可以有多个目录,使用分号分隔各目录,但通常没有必要这么做。例如,若我想包括本地的 src 目录和用来存放另一个项目的源代码的 C:\Projects\XOM\src 目录,我可以这样进行编译:
该命令并不编译在这两个层次结构中所找到的每个文件。它只编译由单个的 .java 文件直接或间接引用的文件,而此 .java 文件必须被编译。
更常见的情况是,为 .java 文件用一个单一的源目录,为类或放置了预编译的第三方库的 JAR 归档文件用多个目录。而这正是类路径的作用所在。 在大中型项目中,每次都要对每个文件进行重编译会非常耗时。为减少这种编译负担,可以在不同的 bin 目录分别编译和存储相同项目的独立部分。这些目录被添加到类路径。 将类添加到类路径有几种方法可选。但您只能使用
现在假设需要添加两个目录:C:\project1\classes 和 C:\project2\classes,可以将它们用分号分开,如下所示:
当然,您也可以使用自己喜欢的各种相对路径的格式。比如,如果 project1 和 project2 是当前工作目录的同级目录(即它们有相同的父目录),那么我会这样引用它们:
到目前为止,我都一直假设程序完全独立并且没有使用任何单独的编译后的第三方库。如果需要使用第三方库,还必须将它们也添加到类路径。库通常是 JAR 文件的格式,比如 junit.jar 或 icu4j.jar。在本例中,需要向类路径添加的只是 JAR 文件本身,而不是包含 JAR 文件的目录(从实质上讲,JAR 文件可以充当包含编译后的 .class 文件的一种目录)。例如,如下命令会向类路径添加三项内容:目录 C:\classes、当前工作目录中的文件 icu4j.jar 以及 E:\lib 中的文件 junit.jar:
JAR 文件仅用于 .class 文件和类路径,不用于 .java 文件和源路径。
现在您已经成功地编译了程序,可以运行它了。运行与编译相似但更为简单一些。当运行程序时,只需指定两项内容:
无需指定源路径。 通常这里的类路径与编译程序所使用的类路径相同,只是多了一个放置编译后的输出的目录。例如,如果编译命令如下所示:
并且
请务必注意命令行的最后一项是类名。它不是一个文件名,也不是 .java 或 .class。该类必须能够在类路径的某处找到。
我强烈建议您在编译和运行时总是显式地指定类路径。也可以将文件放到其他地方,以便它们可以被添加到类路径中,并被 javac 编译器和 java 解释器找到。这种做法会节省一些键入操作,但当(注意不是如果)您无意间将一个旧版本的类放到类路径中时,这却会耗费大量的调试时间。 在本节,将展示类常常隐匿其中的几个地点,这些类很可能会出乎意料地冒到类路径中并导致问题的出现。在不受您控制的机器上(比如服务器),这更为多见。 编译器总是将当前工作目录 (.) 添加到类路径,而不管您是否曾显式地要求这样做。您很容易忘记在和您所在的目录相同的目录中有和没有的内容。因此,请尽量避免将任何类或层次结构放入 project 或 home 目录。相反地,应该将 .java 文件和 .class 文件分别放入 src 目录和 bin 目录。 过一会,您就会发现向类路径手工添加 bin 目录和 JAR 归档文件太过繁琐。这时您可能会想要使用 请务必抵制这种诱惑。这样做,一旦加载了错误的类或错误版本的类,就会出问题。而且意外加载错误的类所带来的调试时间常常会百倍于省下的那点键入时间。要避免输入并自动处理类路径有更好的方法。 放在 jre\lib\ext 目录中的 JAR 归档文件会被添加到通过虚拟机运行的所有应用程序的类路径。这看起来很方便,实际上它与向 部署一个服务器端的应用程序时,问题就更为严峻。请确保部署到的服务器在其 jre\lib\ext 目录没有任何额外的 JAR。如果您不熟悉错误症状,也不知道该如何查找,那么由类路径中的错误版本的 JAV 归档文件所带来的问题可能会非常难于调试。为了避免这些问题的出现,一些框架甚至编写了自己的类加载器,用来绕过 Java 代码通常的类加载机制。 放在 jre\lib\endorsed 目录中的 JAR 文件也被添加到了通过虚拟机运行的所有应用程序的类路径。不同的是,这里的文件被实际放入了 bootclasspath 而不是通常的类路径,并可以代替 JDK 附带的标准类。这种方式对于在 VM 更新 XML 解析器和修复 bug 尤其有用。 但是,如前所述,这种方法看起来十分方便,但实际上也存在长期的潜在问题,原因也一样。如果需要替换 JDK 类,可以在运行时使用
在想要使用电动射钉枪之前要先熟练使用锤子,与此相似,在试图采用更强大的自动管理工具之前也要先能自如地手动管理这些类。如果您掌握了命令行工具集,就可以使用另外的工具来自动处理源路径和类路径所需的一些繁琐过程。这些工具大部分也需要您像本文所介绍的那样组织文件。 像 Eclipse 和 NetBeansMost 这样的许多开发环境都能协助类路径的自动管理。例如,当更改包的名称时,Eclipse 能相应地移动对应的 .java 文件,如图 6 所示: 图 6. 在 Eclipse 中快速修复类路径 请记住,这些 IDE 位于文件系统的顶部,必须正确设置,尤其是当需要与其他工具和其他 IDE 集成时就更应如此。这些工具最大的贡献是用 GUI 对话框、树视图和选项卡代替了命令行开关参数,但其基本的文件结构还是一样的。 Ant 是自动化构建过程的事实上的标准工具。与将目录放在 jre\lib\ext 或 Maven 在组织和自动化构建过程方面比 Ant 还要更进一步。Maven 提供一个合理的默认设置让您可以通过添加少许几行代码并将源文件放到 Maven 能够找到的位置即可构建简单的项目。您仍然需要调整文件系统和包的层次结构。Maven 在管理第三方库的依赖性方面也有上佳的表现,虽然它不如 Ant 那么易于定制。
不管类路径有多么棘手,您都可以通过一些简单的规则对它加以管制,尤其是要记住如下的一些原则:
最后一点提示:很多耗时的类路径问题的起因大都是目录名拼写错误或从错误目录进行了编译。如果您不能找到问题的所在,可以问问周围的朋友或同事。以我的经验,自己发现自己的错误总是困难的,但这些错误在别人看来却显而易见。所以寻求他人的帮助也是一种切实有效的调试技巧。 类路径确实不是个简单的问题,但总会有相应的应对方法,所以它是完全可管理的。些许的谨慎加上对本文所介绍的命名约定、命令行参数和目录结构的注意,应该能够使您在问题最少的情况下编译和运行程序了。 学习
获得产品和技术 讨论
|
发表评论
-
cmdHere
2011-04-10 17:19 979... -
[转]专家看台:程序员的成长从开窍开始
2008-01-01 21:28 1367http://news.csdn.net/n/20071228 ... -
<转>解决 Eclipse 乱码问题
2007-09-10 18:07 4823解决 E ... -
<转>Spring学习笔记
2007-08-18 18:26 1170Spring学习笔记:第一章 Spring的下载和安装 第二 ... -
<转>Vi编辑器完全使用手册
2007-03-08 12:58 1386从CSDN网上下的,想用vi的初学者可以看看 -
<转> Mysql点滴-DATE_FORMAT
2007-01-29 15:01 33558月25日 Mysql点滴-DATE_FORMAT DATE ... -
用word写论文的几点建议
2007-01-25 18:20 2150用word写论文的几点建议 http://foas.boke ... -
<转> Office技巧集锦
2007-01-25 17:01 3011... -
<转>SourceMonitor: 代码重构的小工具,大用场
2007-01-18 12:24 3729SourceMonitor: 代码重构的小工具,大用场 ... -
<转>计算机方面期刊
2006-12-26 20:04 3010stra ... -
<转>数据库连接池
2006-12-18 11:18 1424功能完善的Java连接池调用实例 http://blo ... -
<转>泊松随机分布_还未检验,需要考虑
2006-12-13 10:19 1764| 打印 | 关闭 社区 > 专题开 ...
相关推荐
预备知识 <br>2.1 Java程序设计基础 <br>2.1.1 Java语言规则 <br>2.1.2 Java变量和函数 <br>2.1.3 子类 <br>2.1.4 this和super <br>2.1.5 类的类型 <br>2.1.6 抽象类 <br>2.1.7 接口 <br>2.1.8 包 <br>2.2 JavaBeans...
IP网络中的名字和地址 29<br>4.1 IP寻址 29<br>4.1.1 二进制和十进制数 30<br>4.1.2 IPv4地址格式 30<br>4.2 子网的出现 34<br>4.2.1 分子网 35<br>4.2.2 可变长子网掩码(VLSM) 37<br>4.3 无类域前路由(CIDR) 38<br>...
IP网络中的名字和地址 29<br>4.1 IP寻址 29<br>4.1.1 二进制和十进制数 30<br>4.1.2 IPv4地址格式 30<br>4.2 子网的出现 34<br>4.2.1 分子网 35<br>4.2.2 可变长子网掩码(VLSM) 37<br>4.3 无类域前路由(CIDR) 38<br>...
版本更新:<br><br>1, 增加标识列支持<br>2, 数据表列表增加排序处理<br>3, 更正导入数据,未过滤自增列问题<br>4, 更正数据库安装无法设置空路径问题。<br>5, 增加精度列,小数位数列显示处理。<br>6,增加刷新功能...
|-- META-INF<br> |--persistence.xml EJB3的持久化配置文件<br><br> |--DBScript <br> |--employee.sql 数据库脚本及测试数据 <br> |--mysql-connector-java-5.1.5-bin.jar MySql的驱动程序包<br> |--mysql-ds....
附录 83<br/>10.1 常见问题 83<br/>10.1.1 TransformerFactoryConfigurationError 83<br/>10.1.2 XML解析错误 83<br/>10.1.3 使用weblogic的类路径问题 83<br/>10.1.4 没有cookies的情况下用DWR 84<br/>10.2 ...
Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip 章节笔记 第1章-课程介绍及项目框架搭建 知识点 使用spring boot 搭建项目基础框架 使用Thymeleaf做页面展示,封装Result统一结果 集成 mybatis + ...
-- <version>3.6.1</version> --> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 将源码打包成JAR包 -...
<br><br>(11) 第11章:运行期类型鉴定<br>若只有指向基础类的一个句柄,Java的运行期类型标鉴定(RTTI)使我们能获知一个对象的准确类型是什么。一般情况下,我们需要有意忽略一个对象的准确类型,让Java的动态绑定...
<br/><br/><br/>版本更新<br/>-----------<br/>v1.2 (PLAN,TBD)<br/> * 转换到JTA<br/> * 给出一个脱离DAO模式的例子<br/> * 给出for hibernate 3的xdoclet例子<br/><br/>v1.1 (2005.5.25)<br/> * 分离db目录下的...
创建一个类并加入spring管理(可以在类上加@Service注解,注意配置扫描包路径) 创建一个方法,并在该方法上增加事件注解即可监听该事件(事件注解用法见下方) 事件注解用法 所有事件注解的参数都是限制该注解是否生效的...
java笔记...........................................................................................1. 程序员职业发展: ...双标记:<hn>...</hn> 、<p>...</p>、 <a>...</a> 、<video>...</video>
Android系统下载管理DownloadManager增强方法,可用于包括获取下载相关信息,如: getStatusById(long) 得到下载状态 getDownloadBytes(long) 得到下载进度信息 getBytesAndStatus(long) 得到下载进度信息和状态 ...
用法如果您的项目是使用Maven管理的,则将上述jar导入到项目类路径中,或者添加以下依赖项。 <dependency> <groupId>com.xiaomi.infra.galaxy</groupId> <artifactId>galaxy-fds-sdk-java</artifactId> <version>3.0...
双标记:<hn>...</hn> 、<p>...</p>、 <a>...</a> 、<video>...</video> 17. 超链接:<a href="">xxx</a> 18. 注释(html:<!--xxxxx-->):ctrl+/,对代码或代码块的解释和说明,计算机遇到注释,...
双标记:<hn>...</hn> 、<p>...</p>、 <a>...</a> 、<video>...</video> 17. 超链接:<a href="">xxx</a> 18. 注释(html:<!--xxxxx-->):ctrl+/,对代码或代码块的解释和说明,计算机遇到注释,...
符号推导 Java中符号计算的库。...如果您希望使用没有依赖项管理工具的库,则必须将sym-derivation的jar打包版本添加到项目的类路径中。 例如,如果您使用的是IntelliJ IDEA,则将文件复制到项目目录,右
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。...