什么是类路径,该如何设置?


324

我只是在读这行:

format()方法要做的第一件事是从名为output.vm的类路径中加载Velocity模板

请解释在这种情况下类路径的含义,以及如何设置类路径。

Answers:


530

使用Java进行编程时,可以通过在源文件的顶部放置以下类似内容,使其他类对正在编写的类可用:

import org.javaguy.coolframework.MyClass;

或者有时您通过说“批量导入”内容:

import org.javaguy.coolframework.*;

因此,稍后在程序中您说:

MyClass mine = new MyClass();

Java虚拟机将知道在哪里可以找到您的已编译类。

让VM浏览计算机上的每个文件夹是不切实际的,因此您必须向VM提供要查看的位置列表。这是通过将文件夹和jar文件放在类路径上来完成的。

在讨论如何设置类路径之前,让我们先讨论.class文件,程序包和.jar文件。

首先,让我们假设MyClass是您在项目中构建的东西,它位于项目中名为的目录中output。.class文件将位于output/org/javaguy/coolframework/MyClass.class(以及该软件包中的所有其他文件)。为了到达该文件,您的路径只需要包含文件夹“输出”,而不是整个包结构,因为您的import语句将所有这些信息提供给VM。

现在,假设您将CoolFramework捆绑到一个.jar文件中,并将该CoolFramework.jar放入您项目中的lib目录中。您现在需要放入lib/CoolFramework.jar类路径中。VM将在jar文件中查找该org/javaguy/coolframework零件,并找到您的类。

因此,类路径包含:

  • JAR文件,以及
  • 程序包层次结构顶部的路径。

您如何设置类路径?

每个人似乎学习的第一种方法是使用环境变量。在UNIX机器上,您可以说以下内容:

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

在Windows计算机上,您必须转到环境设置,然后添加或修改已经存在的值。

第二种方法是-cp在启动Java时使用参数,如下所示:

java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

这种方法的变体是第三种方法,通常使用.sh.bat文件来完成,该文件计算类路径并将其通过-cp参数传递给Java 。

以上所有情况都有一个“陷阱”。在大多数系统(Linux,Mac OS,UNIX等)上,冒号(':')是类路径分隔符。在windowsm中,分隔符是分号(';')

那么最好的方法是什么?

通过环境变量在全局范围内设置内容是不好的,通常是出于与全局变量不好的原因相同的原因。您更改了CLASSPATH环境变量,以便一个程序可以工作,并且最终破坏了另一个程序。

-cp是解决方法。我通常会确保我的CLASSPATH环境变量尽可能在开发时在其中为空字符串,以便避免出现全局类路径问题(尽管全局类路径为空时某些工具并不满意-我知道有两个常见的百万美元许可的J2EE和Java服务器在其命令行工具中存在此类问题)。



在python中,有一个名为Lib的文件夹,您可以在其中存储任何模块,随时通过简单的import语句使用。这与将CLASSPATH环境变量设置为第三方Java软件包的目录是否有所不同?即使它是全局的,也无需更改变量,除了添加更多的软件包。
Josie Thompson

很好的答案,但这里有一些虚拟变量:为什么您不需要为创建的每个新类使用-cp命令?这肯定是由您的系统自动解决的吗?但是如何?有时会遇到在类路径中找不到“某物”的问题-我想是因为我没有将其添加到cp中,但是为什么这样的错误仅在某些时候而不是总是出现?我问这个问题是因为,老实说,我从未在-cp命令中手动添加任何内容,并且不知道该如何处理
此类

2
@Vic类路径需要在目录层次结构上方包含与包名称相对应的目录。因此,如果org.javaguy.coolfw具有相应的目录结构/path/to/org/javaguy/coolfw/,则需要包含类路径/path/to/。如果我org.javaguy.hotfw在同一项目中添加新包,则生成的类(通常)以结尾/path/to/org/javaguy/hotfw/。这需要classpath包含/path/to/,已经完成了。因此,新程序包(及其中包含的类)不需要在类路径中添加新内容。
tjalling

@Vic有关更具体的示例和说明,请参阅“ 掌握Java CLASSPATH”(根据KNU的出色评论
tjalling

67

将其视为Java对PATH环境变量的答案-操作系统在PATH上搜索EXE,Java在类路径上搜索类和包。


13

classpath是Java虚拟机在Java程序中查找用户定义的类,程序包和资源的路径。

在这种情况下,该format()方法从该路径加载模板文件。


5

在这种情况下,类路径与在一般情况下完全一样:VM知道的任何地方都可以找到要加载的类以及资源(例如您的情况下的output.vm)。

我知道Velocity希望在“无包”中的任何位置找到一个名为output.vm的文件。这可以是JAR,常规文件夹,...应用程序的类路径中任何位置的根。


2

设置CLASSPATH系统变量

要显示当前的CLASSPATH变量,请在Windows和UNIX(Bourne shell)中使用以下命令:在Windows中: C:\> set CLASSPATH 在UNIX中: % echo $CLASSPATH

要删除CLASSPATH变量的当前内容,请使用以下命令:在Windows中: C:\> set CLASSPATH= 在UNIX中: % unset CLASSPATH; export CLASSPATH

要设置CLASSPATH变量,请使用以下命令(例如):在Windows中: C:\> set CLASSPATH=C:\users\george\java\classes 在UNIX中: % CLASSPATH=/home/george/java/classes; export CLASSPATH


1
尽管这些命令对于使用环境变量可能很有用,但这不能回答问题
Hulk

1

类路径是系统的环境变量。此变量的设置用于向Java编译器提供任何程序包层次结构的根。


1

CLASSPATH是Java编译器和运行时查找Java程序中使用的Java包所需的环境变量(即,所有进程可用的操作系统的全局变量)。(为什么不调用PACKAGEPATH?)这类似于另一个环境变量PATH,CMD Shell使用它来查找可执行程序。

可以通过以下方式之一设置CLASSPATH:

CLASSPATH can be set permanently in the environment: In Windows, choose control panel  System  Advanced  Environment Variables  choose "System Variables" (for all the users) or "User Variables" (only the currently login user)  choose "Edit" (if CLASSPATH already exists) or "New"  Enter "CLASSPATH" as the variable name  Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.

To check the current setting of the CLASSPATH, issue the following command:

> SET CLASSPATH

CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:

> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar

Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,

> java classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3

0

可以直接调用类的静态成员,而无需创建对象实例。由于main方法是静态的,因此Java虚拟机可以在不创建包含main方法的类的任何实例的情况下调用它,而main方法是程序的起点。


0

对于linux用户,要总结并补充他人在此处所说的内容,您应该了解以下内容:

  1. $ CLASSPATH是Java用于遍历多个目录以查找脚本所需的所有不同类的方法(除非您另外使用-cp覆盖明确地告诉了它)。使用-cp要求您手动跟踪所有目录,并在每次运行程序时复制粘贴该行(不建议使用IMO)。

  2. 冒号(“:”)分隔不同的目录。只有一个$ CLASSPATH,并且其中包含所有目录。因此,当您运行“ export CLASSPATH = ....”时,要包括当前值“ $ CLASSPATH”以便附加到该值。例如:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar

    在上面的第一行中,您从一个简单的“点”开始CLASSPATH,这是您当前工作目录的路径。这样一来,无论何时运行Java,它都会在当前工作目录(您所在的目录)中查找类。在上面的第二行中,$ CLASSPATH获取您先前输入的值(。),并将路径附加到mysql目录。现在,java将查找驱动程序以及您的类。

  3. echo $CLASSPATH

    非常方便,它返回的内容应该像所有目录和.jar文件的冒号分隔列表一样显示,您希望Java查找所需的类。

  4. Tomcat不使用CLASSPATH。在此处阅读该怎么做:https//tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.