什么是类路径?

时间:2010-03-07 14:04:46

标签: java classpath apache-velocity

我刚读这行:

  

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

在这种情况下,我无法弄清楚classpath的含义。

11 个答案:

答案 0 :(得分:456)

使用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(以及该包中的每个其他文件)。为了获取该文件,您的路径只需要包含文件夹'output',而不是整个包结构,因为您的import语句将所有信息提供给VM。

现在让我们假设您将CoolFramework捆绑到.jar文件中,并将CoolFramework.jar放入项目的lib目录中。您现在需要将lib/CoolFramework.jar放入类路径中。 VM将查看org/javaguy/coolframework部分的jar文件,并找到您的类。

因此,类路径包含:

  • JAR文件和
  • 包层次结构顶部的路径。

如何设置类路径?

每个人似乎都学习的第一种方式是使用环境变量。在unix机器上,您可以这样说:

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

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

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

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

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

那么最好的方法是什么?

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

-cp是要走的路。我通常确保我的CLASSPATH环境变量是一个空字符串,我尽可能地开发它,以便我避免全局类路径问题(当全局类路径为空时,一些工具不高兴 - 我知道两个常见的,千兆美元许可的J2EE和Java服务器在他们的命令行工具中存在这种问题。)

答案 1 :(得分:53)

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

也像泉水般的问题一样。

答案 2 :(得分:10)

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

在此上下文中,format()方法从此路径加载模板文件。

答案 3 :(得分:5)

此上下文中的类路径正是它在一般上下文中的类别:VM知道它可以在任何地方找到要加载的类,以及资源(例如,在您的情况下为output.vm)。

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

答案 4 :(得分: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

答案 5 :(得分:1)

Classpath是系统的环境变量。此变量的设置用于为java编译器提供任何包层次结构的根。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

Environment variable是一个全局系统变量,可由操作系统(OS)下运行的所有进程访问。

Java中的

classpath是Java虚拟机使用的environment variable,用于在.class加载类期间在Java中定位或查找类文件(ClassLoader)。

Java编译器(javac),Java运行时(java)和其他Java工具按以下顺序搜索程序中使用的类:

  1. Java平台(引导程序)类
  2. Java扩展目录
  3. 用户类别搜索路径(简称classpath):按以下顺序确定:

    a。默认为current working directory (.)

    b。 classpath environment variable中的条目将覆盖默认条目。

    c。 -cp(或-classpath)命令行选项中的条目,该选项将覆盖classpath环境变量。

    d。运行时命令行选项-jar,将覆盖以上所有内容。

classpath环境变量可以包括目录(包含许多类文件)和JAR文件(类文件的单文件存档)。如果未设置classpath,则默认为current directory。如果设置了classpath,则必须包含current working directory (.)。否则,将不会搜索当前目录。

您可以通过在运行Java程序时提供选项classpathenvironment variable来覆盖由-cp定义的Java -classpath,这是拥有不同{{ 1}},用于在同一Unix或Windows计算机上运行的不同Java应用程序。

classpath

分隔符是分号java -cp "<path/1><separator><path/2>" <path.to.your.MainClass> -Windows,冒号;-Linux

例如MacOS的命令

:

了解更多herehere

答案 9 :(得分: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

答案 10 :(得分:-2)

类路径和路径是环境变量。通常,您必须将jdk / bin放到路径中,以便您可以在任何地方使用java编译器,classpath是.class文件的路径。 classpath的默认路径为句点(。),表示当前目录。但是当你使用包裹时。你要么指定.class文件的完整路径,要么将.class文件路径放在类路径中,这将节省大量的工作!