• Tags
  •         
  • www.breakyizhan.com
  •    

    在本文中,我们将学习如何使用其他项目的实用程序,类和成员。在继续之前,让我们了解一些关键字。

    类路径

    类路径是jvm开始执行程序的位置。与传统的动态加载行为类似,当执行Java程序时,Java虚拟机查找并加载类(只有在首次使用类时才加载类的字节码)。classpath告诉Java在文件系统中查找定义这些类的文件的位置。在classpath中可访问和可用的变量和方法称为类路径变量。默认情况下,JVM在执行程序时总是访问类路径类。JVM总是进入类路径的深处以搜索类或资源。

    JVM按以下顺序搜索并加载类:

    1. 引导类: Java平台的基础类(包括Java类库的公共类,以及为使该库正常工作所必需的私有类)。
    2. 扩展类:位于JRE或JDK的扩展目录中的包,jre / lib / ext /用户定义的包和库

    使用导入关键字

    在Java中使用import关键字从当前项目的类路径中导入类。您可以从不同的包中导入类,但可以从相同的类路径导入。应该记住,一个类的包装从classpath开始。假设你有如下的目录结构:

    a> b> c> d> class A
    

    并且你的类路径从c开始,那么你的类应该在包d中而不是在abc中。

    使用classpath -cp选项

    import关键字可以从当前classpath中导入类,在classpath之外导入不能使用。现在假设你已经有了一个你已经使用了一些实用程序类的项目,这也是你在第二个项目中需要的。那么在这种情况下,导入关键字不起作用,因为您的第一个项目位于另一个类路径中。在这种情况下,您可以在编译和执行程序时使用-cp命令。

    我们继续下面的例子。创建一个目录结构,如下图所示。

    如何运行在不同目录下的java类文件?

    这里有两个项目proj1和proj2。proj1包含src和类。在src目录中,我们将保留作为源文件的.java文件,并在类目录中保存.classes文件,这些文件是编译项目后生成的文件。
    以下是运行不同目录下的java类文件的步骤:

    • 第1步(创建实用程序类):在包含以下代码的src目录中创建A.java。
      //java utility class
      public class A
      {
          public void test()
          {
              System.out.println("Test() method of class A");
          }
      }
      

      在这里,我们有一个实用程序类是A.

    • 步骤2(编译实用程序类):在proj1位置打开终端并执行以下命令。
      cp_tutorial / proj1> cd src
      cp_tutorial / proj1 / src> javac -d ../classes A.java
      

      -d选项:它用于将输出存储到不同的目录。如果我们不使用这个选项,那么类文件将在src目录中创建。但是,分开保存源文件和类文件是一种很好的做法。在-d选项之后,我们提供应该存储类文件的目录的位置。
      如果有任何编译时错误,请在继续之前解决它。

    • 步骤3(检查A.java是否成功编译):检查proj1的classes目录中是否创建类文件。如果你的程序编译成功,肯定会是。
    • 第4步(编写主类并编译它):移至你的proj2目录。这里也有2个目录出于同样的原因。在具有以下内容的src目录中创建MainClass.java并尝试编译它。
      //java class to execute program
      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

      正如你所看到的那样,没有找到符号A的编译时错误。如果我们想要使用proj1的类A,那么我们必须使用-cp选项来包含proj1的资源,如下一步所示。

    • 第5步(使用-cp选项编译):
      cp_tutorial / proj2> cd src
      cp_tutorial / proj2 / src> javac -d ../classes -cp 
      ../../proj1/classes MainClass.java
      

      现在,您的代码将被成功编译,MainClass.class将在classes目录中创建。-cp代表classpath,它包含了使用当前类路径给出的路径,并且一旦包含它,jvm就识别符号A,它是一个类并成功地编译文件。

    • 第6步(执行程序):尝试删除程序。执行以下命令来运行你的程序。
      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

      糟糕,我们得到了一个错误,类A没有找到。这是因为你只在编译时告诉JVM A的路径。在运行MainClass时,他不知道其他项目中有A类。

    • 第7步(使用-cp选项执行):我们必须再次提供类A的路径。
      cp_tutorial/proj2/classes>java -cp ../../proj1/classes; MainClass
      In main class
      Test() method of class A

      现在,你已经成功运行你的程序。

    如何在类路径中使用jar运行java类?

    您也可以使用jar文件而不是来自不同类路径的类文件。这个过程将是相同的,你只需要用jar名称替换class文件夹和jar文件夹以及类名。
    假设你在lib目录下有jar文件,那么编译你就可以使用

    cp_tutorial / proj2 / src> javac -d ../classes -cp ../../proj1/lib MainClass.java
    

    并执行

    cp_tutorial / proj2 / classes> java -cp ../../proj1/lib; MainClass

     
    转载请保留页面地址:https://www.breakyizhan.com/java/3730.html