- 浏览: 435803 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 1031... -
[转]专家看台:程序员的成长从开窍开始
2008-01-01 21:28 1404http://news.csdn.net/n/20071228 ... -
<转>解决 Eclipse 乱码问题
2007-09-10 18:07 4881解决 E ... -
<转>Spring学习笔记
2007-08-18 18:26 1213Spring学习笔记:第一章 Spring的下载和安装 第二 ... -
<转>Vi编辑器完全使用手册
2007-03-08 12:58 1439从CSDN网上下的,想用vi的初学者可以看看 -
<转> Mysql点滴-DATE_FORMAT
2007-01-29 15:01 34008月25日 Mysql点滴-DATE_FORMAT DATE ... -
用word写论文的几点建议
2007-01-25 18:20 2193用word写论文的几点建议 http://foas.boke ... -
<转> Office技巧集锦
2007-01-25 17:01 3099... -
<转>SourceMonitor: 代码重构的小工具,大用场
2007-01-18 12:24 3783SourceMonitor: 代码重构的小工具,大用场 ... -
<转>计算机方面期刊
2006-12-26 20:04 3079stra ... -
<转>数据库连接池
2006-12-18 11:18 1481功能完善的Java连接池调用实例 http://blo ... -
<转>泊松随机分布_还未检验,需要考虑
2006-12-13 10:19 1822| 打印 | 关闭 社区 > 专题开 ...
相关推荐
通过以上方法,Java程序员可以方便地在应用中集成对Windows快捷方式的支持,从而提高用户体验,尤其是在需要自定义启动配置或者管理应用程序启动项的场景下。 总的来说,`mslinks`库为Java开发者提供了一个强大的...
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>...
配置中的`<option>`标签用于指定需要保留的类或方法,`<obfuscate>true</obfuscate>`开启混淆,`<injar>`和`<outjar>`分别定义输入和输出的jar文件路径。 3. **执行打包**: 在IDEA中,可以通过点击“Maven”面板...
同样,当Java代码调用Scala代码时,需确保导入正确的Scala类和对象。 测试方面,你可以使用JUnit(Java测试框架)和ScalaTest(Scala测试框架)。Maven会自动识别并运行这些测试。如果两者都需要,确保配置了对应的...
这样就可以把之前用.net 开发的物资管理系统系统管理框架稍作修改后用到 JAVA 下,以后开发系统时,无论是用.net 还是用 java 都可以用同样的框架对用色权限等进行相关控制。 ClassUtil 工具类 我们可以使用一个名...
--> <developers> <developer> <id>dev1</id> <name>Developer One</name> <email>dev1@example.com</email> <roles> <role>Developer</role> </roles> <timezone>-8</timezone> </developer> </developers> <!...
为了在Java项目中使用Aspose,需要将其添加到项目的类路径中。在现代的Java开发环境中,这通常通过Maven或Gradle等构建工具来完成。在提供的`pom文件.txt`中,可以看到如何配置Maven依赖以引入Aspose for Java。...
在使用这个驱动时,需要将其添加到Java项目的类路径(ClassPath)中,以便程序在运行时能够找到并加载对应的驱动类。 **四、在Spring Boot中使用Dm7JdbcDriver17.jar** Spring Boot是一个基于Spring框架的快速开发...
ProjectHelper是Ant内部的一个类,它负责解析和处理`<import>`标签。 解决这个问题的方法有以下几种: 1. **升级Ant版本**:确保你的Ant版本是最新的,或者至少是1.6以上,因为`<import>`标签是在Ant 1.6版本中...
在压缩包子文件`maven_jar`中,可能包含了编译后的Java类文件、资源文件(如配置文件)、依赖库以及`pom.xml`文件。这些文件共同构成了一个完整的Maven项目,用户可以通过解压并执行Maven命令来构建和运行这个项目。...
默认情况下,Maven将编译后的Java类文件放置在`target/classes`目录下。对于Web应用,最终的WAR包会将这些类文件打包到`WEB-INF/classes`目录。然而,如果我们希望在打包过程中直接将类文件放入`WebContent/WEB-INF/...
<groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>...
Maven是一个项目管理工具,它可以帮助开发者管理和构建Java项目,而Tomcat则是一个流行的开源Servlet容器,用于部署和运行Java Web应用程序。这两者结合使用,可以实现高效的开发流程。下面将详细阐述这两个工具及其...
然后,你可以创建一个Java类,如`DocToDocxConverter.java`,该类包含一个或多个方法,用于执行实际的转换操作。这些方法可能会接受文件路径作为参数,读取.doc文件,将其内容转换为.docx格式,最后保存到一个新的...
|-- 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....
7. **使用jar包**:生成的jar包可以被其他Java项目引用,只需将它添加到项目的类路径中。你可以使用`<dependency>`标签(Maven)或`implementation`(Gradle)来引入这个jar。 通过以上步骤,你成功地将protobuf...
这里的`<systemPath>`标签指定了JAR文件的具体路径,这种方式并不推荐,因为它使得构建过程依赖于特定的本地文件系统结构。更推荐的做法是直接通过Maven仓库下载依赖库。 ### 三、编写工具类 接下来,创建一个工具...
3. 编译Java源码:展示如何使用`<javac>`任务编译源代码,并处理类路径和依赖关系。 4. 打包和部署:解释如何使用`<jar>`任务创建JAR或WAR文件,以及如何通过`<copy>`或`<move>`任务将文件复制到指定位置。 5. 运行...
在给定的压缩包中包含的"jar包"很可能就是XStream的库文件,可以将其添加到项目的类路径中。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.thoughtworks.xstream</groupId>...
添加jar文件到项目的类路径中,然后可以使用`JSONArray`类: ```java import org.json.JSONArray; import org.json.JSONObject; List<MyObject> dataList = ...; JSONArray jsonArray = new JSONArray(); for...