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


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.