📅  最后修改于: 2020-02-10 15:31:46             🧑  作者: Mango
在本文中,我们将学习如何使用其他项目的实用程序、类和成员。在继续之前,让我们了解一些关键字。
类路径
类路径是JVM开始执行程序的位置。与经典的动态加载行为类似,Java虚拟机在执行Java程序时会懒惰地查找和加载类(仅在首次使用该类时才加载类的字节码)。类路径告诉Java在文件系统中哪里查找定义这些类的文件。在类路径中可访问和可用的变量和方法称为类路径变量。默认情况下,JVM在执行程序时始终访问类路径类。JVM总是进入类路径的深处以搜索类或资源。
JVM按照以下顺序搜索和加载类:
使用导入关键字
import关键字在Java中用于从当前项目的类路径中导入类。您可以从不同的包但从相同的类路径导入类。要记住,类的包装是从类路径开始的。假设您具有以下目录结构:
a > b > c > d > class A
并且您的类路径从c开始,那么您的类应该在d包中,而不在abcd中。
使用classpath -cp选项
import关键字可以从当前类路径中导入类,不能在类路径之外使用。现在,假设您已经有一个项目,在其中使用了一些实用程序类,这在第二个项目中也需要。然后在这种情况下,import关键字不起作用,因为您的第一个项目在另一个类路径中。在这种情况下,可以在编译和执行程序时使用-cp命令。
让我们继续下面的示例。创建一个目录结构,如下图所示:
在这里,您有2个项目proj1和proj2。proj1包含src和类。在src目录中,我们将保留作为源文件的.java文件,而在classes目录中,将保留作为编译项目后生成的文件的.classes文件。
以下是运行位于不同目录中的Java类文件的步骤:
// Java类A
public class A
{
public void test()
{
System.out.println("Test() method of class A");
}
}
在这里,我们有一个实用程序类A。
cp_tutorial/proj2>cd src
cp_tutorial/proj2/src>Javac -d ../classes -cp
../../proj1/classes MainClass.Java
//Java类,执行程序
public class MainClass{
public static void main(String[] args){
System.out.println("In main class");
A a1 = new A();
a1.test();
}
}
cp_tutorial/proj2>cd src
cp_tutorial/proj2/src>Javac -d ../classes MainClass.Java
MainClass.Java:4: error: cannot find symbol
A a1 = new A();
^
symbol: class A
location: class MainClass
MainClass.Java:4: error: cannot find symbol
A a1 = new A();
^
symbol: class A
location: class MainClass
2 errors
cp_tutorial/proj2>cd src
cp_tutorial/proj2/src>Javac -d ../classes -cp
../../proj1/classes MainClass.Java
cp_tutorial/proj2/src>cd ../classes
cp_tutorial/proj2/classes>Java MainClass
Exception in thread "main" java.lang.NoClassDefFoundError: A
at MainClass.main(MainClass.Java:4)
Caused by: java.lang.ClassNotFoundException: A
at Java.net.URLClassLoader$1.run(Unknown Source)
at Java.net.URLClassLoader$1.run(Unknown Source)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
cp_tutorial/proj2/classes>Java -cp ../../proj1/classes; MainClass
In main class
Test() method of class A
现在,您已经成功运行了程序。别忘了在提供类路径之后加上’;’ 。对于OS / Linux,替换“;” 为’:’。
如何在类路径中运行带有jar的Java类?
您也可以使用jar文件来代替来自不同类路径的类文件。过程将相同,您只需要用jar文件夹替换classes文件夹,并用jar名称替换类名即可。
假设您在lib目录中有jar文件,那么可以使用进行编译
cp_tutorial/proj2/src>Javac -d ../classes -cp ../../proj1/lib MainClass.Java
并执行:
cp_tutorial/proj2/classes>Java -cp ../../proj1/lib; MainClass