Answers:
使用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
零件,并找到您的类。
因此,类路径包含:
您如何设置类路径?
每个人似乎学习的第一种方法是使用环境变量。在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服务器在其命令行工具中存在此类问题)。
org.javaguy.coolfw
具有相应的目录结构/path/to/org/javaguy/coolfw/
,则需要包含类路径/path/to/
。如果我org.javaguy.hotfw
在同一项目中添加新包,则生成的类(通常)以结尾/path/to/org/javaguy/hotfw/
。这需要classpath包含/path/to/
,已经完成了。因此,新程序包(及其中包含的类)不需要在类路径中添加新内容。
设置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
类路径是系统的环境变量。此变量的设置用于向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
可以直接调用类的静态成员,而无需创建对象实例。由于main方法是静态的,因此Java虚拟机可以在不创建包含main方法的类的任何实例的情况下调用它,而main方法是程序的起点。
对于linux用户,要总结并补充他人在此处所说的内容,您应该了解以下内容:
$ CLASSPATH是Java用于遍历多个目录以查找脚本所需的所有不同类的方法(除非您另外使用-cp覆盖明确地告诉了它)。使用-cp要求您手动跟踪所有目录,并在每次运行程序时复制粘贴该行(不建议使用IMO)。
冒号(“:”)分隔不同的目录。只有一个$ CLASSPATH,并且其中包含所有目录。因此,当您运行“ export CLASSPATH = ....”时,要包括当前值“ $ CLASSPATH”以便附加到该值。例如:
export CLASSPATH=.
export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
在上面的第一行中,您从一个简单的“点”开始CLASSPATH,这是您当前工作目录的路径。这样一来,无论何时运行Java,它都会在当前工作目录(您所在的目录)中查找类。在上面的第二行中,$ CLASSPATH获取您先前输入的值(。),并将路径附加到mysql目录。现在,java将查找驱动程序以及您的类。
echo $CLASSPATH
非常方便,它返回的内容应该像所有目录和.jar文件的冒号分隔列表一样显示,您希望Java查找所需的类。
Tomcat不使用CLASSPATH。在此处阅读该怎么做:https: //tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html