什么是类路径?我如何设置它?

我刚刚读到这句话:

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

请解释在这种情况下类路径是什么意思,以及我应该如何设置类路径。

312166 次浏览

此上下文中的类路径与一般上下文中的类路径完全相同:VM知道它可以在任何地方找到要加载的类和资源(例如输出)。在你的情况下是这样)。

我理解Velocity希望找到一个名为output的文件。Vm在“无包”的任何位置。这可以是一个JAR,普通文件夹,…应用程序类路径中任何位置的根。

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

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

可以把它看作是Java对PATH环境变量的回答——操作系统在PATH上搜索ex, Java在类路径上搜索类和包。

当用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(与该包中的所有其他文件一起)。为了得到这个文件,你的路径只需要包含文件夹“输出”,而不是整个包的结构,因为你的导入语句提供了所有的信息给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机器上,您必须进入环境设置,并添加或修改已经存在的值。

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

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

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

有一个“gotcha"具备以上所有条件。在大多数系统(Linux、Mac OS、UNIX等)上,冒号(':')是类路径分隔符。在windowsm中,分隔符是分号(';')

那么最好的方法是什么呢?

通过环境变量全局设置是不好的,原因和全局变量是一样的。你改变了CLASSPATH环境变量,所以一个程序可以工作,但你最终破坏了另一个程序。

-cp是正确的方法。我通常确保我的CLASSPATH环境变量在我开发的地方是一个空字符串,只要有可能,这样我就避免了全局类路径问题(尽管全局类路径为空时,一些工具是不高兴的-我知道两个常见的,一百万美元授权的J2EE和Java服务器,它们的命令行工具有这种问题)。

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

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

设置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

类的Static成员可以直接调用,而不需要创建对象实例。 由于主方法是静态的,Java虚拟机可以调用它,而不需要创建包含主方法的类的任何实例,这是程序的起点

对于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. <李> < pre > <代码> echo $类路径中 < /代码> < / >之前

    是超级方便的,它返回的内容应该读起来像一个冒号分隔的所有目录和.jar文件的列表,你想让Java查找它需要的类

  4. Tomcat不使用CLASSPATH。在这里阅读如何做:https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

类路径是Java世界中的基本概念之一,Java程序经常误解或根本不理解它,尤其是初学者。

简单地说,classpath只是一个set of paths, java编译器和JVM必须在其中找到所需的类来编译或执行其他类。

让我们从一个例子开始,假设我们有一个Main.java文件,位于C:\Users\HP\Desktop\org\example下面,

package org.example;


public class Main {
public static void main(String[] args) {
    

System.out.println("Hello world");
            

}
}

现在,假设我们在C:\目录下,我们想编译我们的类,这很简单,只需要运行:

javac .\Users\HP\Desktop\org\example\Main.java
< p >
现在,对于更难的问题,我们在相同的文件夹C:\中,我们想要运行编译后的类

不管你想到的答案是什么,正确的答案是:

java -cp .\Users\HP\Desktop org.example.Main

我将解释为什么,首先,我们想要ro tun的类的名称是org.exmaple.Main,而不是主要,或Main.class用户。\ \惠普桌面\ \ org \ \ Main.class例子 !这就是在包下声明的类的工作方式。

现在,我们向JVM提供了类的名称(在本例中是java命令),但是它(JVM)如何知道在哪里为Main类找到.class文件呢?这就是classpath进入画面的地方。使用-cp标志(-classpath的快捷方式),我们告诉JVM Main.class文件将位于C:\users\hp\Desktop..事实上,不是,我们告诉它just go to the Desktop directory, and, because of the name of the class org.example.Main, the JVM is smart and it will go from Desktop to org directory, and from org to example directory, searching for Main.class file,它会找到它并杀死它,我的意思是,它会运行它:D。

现在让我们假设在Main类中,我们想要使用另一个名为org.apache.commons.lang3.StringUtils的类,后者位于名为commons-lang3-3.10.jar的jar文件中,该文件位于C:\Users\HP\Downloads中。Main.java现在看起来是这样的:

package org.example;


import org.apache.commons.lang3.StringUtils;


public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
System.out.println(StringUtils.equals("java", "java")); //true
}
}
< p >
如果我们总是在C:\中,如何编译Main.java ?答案是:

javac -cp .\Users\HP\Downloads\commons-lang3-3.10.jar .\Users\HP\Desktop\org\example\Main.java
  • .\Users\HP\Desktop\org\example\Main.java是因为我们的.java文件在文件系统中。

  • -cp .\Users\HP\Downloads\commons-lang3-3.10.jar是因为java编译器(在本例中是javac)需要知道类org.apache.commons.lang3.StringUtils的位置,所以我们提供了jar文件的路径,然后编译器将进入jar文件,并尝试在目录org\apache\commons\lang3中找到一个文件StringUtils.class。

< p >
如果我们想运行Main.class文件,我们将执行:

java -cp ".\Users\HP\Desktop\;.\Users\HP\Downloads\commons-lang3-3.10.jar" org.example.Main
  • org.example.Main是类名。

  • ".\Users\HP\Desktop\;.\Users\HP\Downloads\commons-lang3-3.10.jar"是路径(由;在Windows中)到Main和StringUtils类。