,,Java中classpath讲解及使用方式

,,Java中classpath讲解及使用方式

本文详细讲解了Java中类路径的解释和用法,并通过示例代码详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

我之前没有对类路径做过深入的研究。之前的项目打包jar包都是基于在线教程。但是因为最近遇到了一些这方面的知识,所以单纯的觉得应该补充一下这些知识。下面这篇文章主要翻译自oralce官网关于设置类路径的说明,设置类路径,有些地方还做了一些补充说明,方便读者理解。

概要

类路径是Java运行时环境搜索类和其他资源文件(如jar\zip和其他资源)的路径。可以通过JDK工具(如javac命令、java命令)后面的-classpath参数来设置类路径(在java环境下的dos窗口中输入sdktool的命令可以查看可以输入的参数选项,如下图所示)

或者通过设置CLASSPATH环境变量。这个-classpath选项是首选项,因为您可以为每个应用程序单独设置它,而不会影响其他应用程序,也不需要其他应用程序修改它的值。

以下是这两种方式的示例:

(1)通过jdk的命令行为每个应用程序设置。

这个设置主要是为每个应用程序设置的,不会影响其他程序的类路径和环境变量的类路径。它只在当前窗口中生效。

c:SDK tool-class path class path 1;类别路径2 …

(2)设置classpath环境变量,这是一个全局设置,对所有应用都有效。

c:set class path=class path 1;类别路径2 …

sdkTool

命令行工具,如java、javac、javadoc或apt。有关列表,请参见JDK工具。

classpath1 ;classpath2

的类路径。罐子,拉链还是。类文件。每个类路径都应该以文件名或目录结尾。根据不同的情况,类路径的格式可以设置如下:

(1)对于。罐子还是。zip文件包含。类文件,类路径以。拉链还是。jar文件。

下面是一个例子。作者将一个项目打包到一个jar包中,并在这个jar包下指定一个类文件来运行。结果如下:

下面是项目的目录,项目中引用了其他jar包。我在打包的时候,用maven的汇编插件把它装进了一个胖罐子里(具体打包方法,查看这两篇博文:

[Java]打包Jar包并用脚本执行它

【Maven】Maven系列(II) 3354采用汇编插件封装。

查看下面的classpath值是如何指定的。

(2)对于。类文件在未命名的包中,类路径在包含。类文件。举个例子,如果一个a.class文件在d:path1\path2下,但是这个a.class没有包,那么如果你想让jvm搜索这个class文件,你可以在指定classpath的时候使用d:path1\path2,因为classpath的默认路径是当前路径,所以在使用它的时候,如果dos窗口是在当前路径下打开的,classpath命令默认,那么此时的效果等同于指定当前路径为classpath。以下示例:

test.java

公共类测试{

公共静态void main(String[] args) {

System.out.println('hello world!');

}

}

这个类没有包。

以下是运行结果:

程序运行成功。

(3)对于。命名包中的类文件,类路径终止于包含“根”包(完整包名中的第一个包)的目录。

例子如下:

Equals.java在名为字符串的包下

包字符串;

公共类等于{

公共静态void main(String[] args){

String a=新字符串(' test ');

String b=新字符串(' test ');

system . out . println(a==b);

}

}

对于这种情况,指定类路径的方法如下:

通过以上命令,您可以看到正确的命令行格式如下:

Java-类路径包_根路径包_名.类名

多个路径条目用分号分隔。使用set命令,可以忽略等号(=)周围的空格。

默认情况下,Classpath是当前目录。设置CLASSPATH变量或使用-classpath命令行选项将覆盖此默认值,因此,如果要在搜索路径中包含当前目录,必须包含"."在新的设置中(路径的描述请参考作者的另一篇博文)。

既不是目录也不是归档文件的类路径(。拉链还是。jar文件)和*将被忽略。

描述

类告诉JDK工具和应用程序在哪里可以找到第三方和用户定义的类——也就是说,不属于Java扩展或Java平台的类。类路径需要找到javac编译器编译的任意一个类3354,其缺省值是当前目录,以便于找到这些类。

JDK、JVM和其他JDK工具搜索Java平台(引导)类、任何扩展类和类路径,以便找到类。(有关搜索策略的更多信息,请参见如何查找类。)大多数应用类库都想利用扩展机制。您只需要设置类路径。当您要加载的类满足以下条件时:( a)它不在当前目录或其任何子目录中,( b)它不在扩展机制指定的位置中。

如果从JDK的旧版本升级,启动设置可能包含类路径不再需要的设置。您应该删除任何非特定于应用程序的设置,例如classes.zip一些使用Java虚拟机的第三方应用程序可能会修改您的类路径环境变量,以包含它们所使用的库。该设置可以保持不变。

当您调用JVM或其他JDK工具或使用环境变量时,您可以使用JDK工具的'-classpath选项来更改类路径。使用此选项优于设置环境变量,因为您可以为每个应用程序单独设置它们,而不会影响其他应用程序,也不需要其他应用程序修改它们的值。

类可以存储在目录(文件夹)或档案中(这里的档案是那些jar包和zip包)。Java平台类存储在rt.jar中。关于归档的更多细节和关于类路径如何工作的信息,请参见本文末尾的类路径和包名。

重要提示:一些旧版本的JDK软件在默认的类路径中包含一个/classes条目。该目录适用于JDK软件,不应用于应用程序类。应用程序类应该放在JDK层次结构之外。这样,安装新的JDK不会强制您重新安装应用程序类。为了与旧版本兼容,使用/classes目录作为类库的应用程序将在当前版本中运行,但不能保证它将在未来版本中运行。

使用JDK工具的-classpath选项

JDK工具java、jdb、javac和javah有一个-classpath选项,用于替换classpath环境变量指定的路径。这是更改类路径设置的推荐选项,因为每个应用程序都可以拥有所需的类路径,而不会干扰任何其他应用程序。

运行时工具java也有一个-cp选项。该选项是-classpath的缩写。

对于非常特殊的情况,java和javac都有选项,允许您更改用于查找自己的类库的路径。然而,绝大多数用户永远不需要使用这些选项。

使用CLASSPATH环境变量

一般来说,您应该使用-classpath命令行选项,如前一节所述。本节介绍如何设置CLASSPATH环境变量,或者清除以前安装中遗留的设置。

设置CLASSPATH

CLASSPATH环境变量中修饰的Group命令。格式是:

设置CLASSPATH=path1路径2…

路径应以指定驱动器的盘符开头,例如C:\\。这样,如果您碰巧切换到另一个驱动器,您仍然可以找到该类文件。(如果设置的路径是D:\,那么jvm将在驱动器D而不是驱动器C下查找这个类)

清除CLASSPATH

如果您的CLASSPATH环境变量设置为不正确的值,或者您的启动文件或脚本设置为不正确的路径,您可以使用CLASSPATH通过以下命令取消设置:

c:设置类路径=

该命令仅取消当前命令提示符窗口中的类路径。您还应该删除或修改启动设置,以确保CLASSPATH在将来的会话中具有正确的设置。

更改启动设置

如果CLASSPATH变量是在系统启动时设置的,那么要查找的位置取决于您的操作系统:

对于Windows 95和98,请检查autoexec.bat的set命令

对于其他系统(Windows NT、Windows 2000等),可以使用控制面板中的系统实用程序来设置CLASSPATH环境变量。

了解类路径通配符

类条目可以包含基本名称通配符*,这被视为等同于指定列表。罐子还是。扩展目录中所有文件的jar。例如,类路径条目foo/*引用foo目录中的所有JAR文件。由*组成的简单类路径指的是当前目录中所有jar文件的列表。

通配符* classpath不适用于类文件(这意味着通配符*适用于jar而不是类)。要匹配单个目录中的类和JAR文件foo,请使用foo;Foo/*或foo/*;foo .前者的顺序决定了首先加载foo文件目录中的类和资源,最后加载jar,后者反之亦然。

子目录不是递归搜索。比如foo/*只寻找JAR文件foo,不包括foo/bar、foo/baz等子目录。

扩展类路径中枚举目录中jar文件的顺序没有规定(扩展类路径中枚举一个目录中JAR文件的顺序没有规定),但是这句话我不懂。知道的读者可以留言回复。谢谢大家!),并且可能因平台而异,即使在同一台机器上也是如此。构建一个好的应用程序不应该依赖于任何特定的顺序。如果需要特定的顺序,可以在类路径中显式枚举JAR文件。

通配符扩展的过程是在调用程序的main方法之前的类加载过程中。每个包含通配符的输入类路径都将被枚举为该目录中的所有JAR文件路径。例如,如果目录foo包含a.jar、b.jar和c.jar,那么类路径foo/*扩展为foo/a . jar;foo/b . jar;Foo/c.jar,这个字符串将是系统属性的值java.class.path。

CLASSPATH环境变量与-classpath(或-cp)的命令行选项没有什么不同。换句话说,通配符同样适用于所有情况。但是classpath的通配符不符合Class-Path jar-manifest头文件中的要求(这句话也不是很好理解,希望读者给点意见!)。

了解类路径和包名称

Java类被组织成包,这些包映射到文件系统中的目录。但是,与文件系统不同的是,无论何时指定包名,都可以指定整个包名,而不是包名的一部分。例如,包名java.awtButton总是被指定为java.awt。

例如,假设您希望Java运行时找到Cool.class,它位于utility.myapp包下。如果这个目录的路径是C:\java\MyClasses \ Utility \ MyApp,那么set classpath应该包含C:\ Java \ my classes。

要运行该应用程序,可以使用以下JVM命令:

C:Java-class path C:\ Java \ my classes utility . myapp . cool

当应用程序运行时,JVM使用这个类路径设置来查找utility.myapp包中定义的任何其他类(包括Cool类)。

请注意,命令中指定了整个包的名称。如果类路径设置为C:\java\MyClasses\utility和命令java myapp。酷是拿来用的,不可能成功。JVM找不到这个类。

(您可能想知道是什么定义了类的包名。答案是包名是类的一部分,除了重新编译类,不能修改)。

注意:包指定机制的一个有趣的结果是,同一个包中的文件实际上可能存在于不同的目录中。每个类的包名是相同的,但是每个文件的路径可以从类路径中的不同目录开始。

文件夹和归档文件

当一个类存储在一个目录(文件夹)中时,比如C:\ Java \ my classes \ Utility \ MyApp,那么classpath条目指向包含包名的第一个元素的目录。即包之上的目录(在本例中,classpath是C:\java\MyClasses,因为包名是utility.myapp)

但是当类存储在归档文件(.拉链还是。jar文件),类路径条目是。拉链还是。jar文件并包含。拉链还是。jar文件。例如,要使用。jar文件中,该命令如下所示:

C:Java-class path C:\ Java \ my classes \ my classes . jar utility . myapp . cool

多重指定

要查找C:\java\MyClasses目录中的类和C:\java\OtherClasses目录中的类,请将类路径设置为:

C:Java-class path C:\ Java \ my classes;C:\ java \其他类…

请注意,这两个路径由分号分隔。

指定顺序

多个类路径的顺序很重要。Java解释器将按照类路径变量中出现的顺序在目录中查找类。在上面的例子中,Java解释器将首先在C:\java\MyClasses目录中查找类。只有当在这个目录中找不到具有正确名称的类时,解释器才会在C:\java\OtherClasses目录中查找。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: