如何使用 javac 编译 java 包结构

2022-09-02 03:50:36

我正在尝试编译(从命令行)一个java包,该包导入我自己的另一个包。我正在在线学习教程,但是当我尝试编译最终的java文件(CallPackage.java)时,似乎遇到了错误。

以下是文件结构:

+ test_directory (contains CallPackage.java)
   -> importpackage
       -> subpackage (contains HelloWorld.java)

以下是CallPackage.java:

/// CallPackage.java
import importpackage.subpackage.*;
class CallPackage{
  public static void main(String[] args){
  HelloWorld h2=new HelloWorld();
  h2.show();
  }
}

这是HelloWorld.java:

///HelloWorld.java

package importpackage.subpackage;

public class HelloWorld {
  public void show(){
  System.out.println("This is the function of the class HelloWorld!!");
  }
}

尝试的步骤

  1. 转到子包并使用 编译 HelloWorld.java。$javac HelloWorld.java
  2. 转到test_directory并使用 编译 CallPackage.java。$javac CallPackage.java

这给了我一个关于最后一个命令的错误:

CallPackage.java:1: package importpackage.subpackage does not exist
import importpackage.subpackage.*;
^
CallPackage.java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
  ^
CallPackage.java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
                    ^
3 errors

如何编译这两个包?非常感谢您的任何帮助!


答案 1

问题是需要为每个命令(javac和java)设置类路径:

尝试的步骤

  1. 与其去子包,不如从top_level编译HelloWorld.java:

    $javac -cp . importpackage/subpackage/HelloWorld.java

  2. 编译 CallPackage.java以相同的方式:

    $javac -cp . CallPackage.java

  3. 同时使用类路径运行文件:

    $java -cp . CallPackage

注意:运行“$java CallPackage”将给出错误“错误:无法找到或加载主类 CallPackage”

总之,在每个步骤中,必须指定类路径。它在运行它之后工作。


答案 2

对我来说也是同样的情况。我通过同时编译类来接管它。
例如,这是我的项目:

+ beerV1
   -> classes
   -> src
         -> com
              -> example
                   -> model
                        -> BeerExpert.java
                   -> web
                        -> BeerSelect.java


BeerExpert.java:

package com.example.model;
import ...

public class BeerExpert{
    ...
}


啤酒选择.java:

package com.example.web;
import com.example.model.*;
import ...

public class BeerSelect {
      ...
}


如您所见:BeerSelect.java正在尝试在com.example.model包中导入类。
第一次,我编译了BeerExert.java首先通过命令:



然后:


结果是:--> javac -d classes src/com/example/model/BeerExpert.java--> javac -d classes src/com/example/web/BeerSelect.java
-->... error: package com.example.model does not exist

所以,我知道在这种情况下单独编译多个类是行不通的。


在谷歌上遭受痛苦之后,我发现了这个非常简单的方法来解决问题:
只需一次编译所有内容:

--> javac -d classes src/com/example/model/BeerExpert.java src/com/example/web/BeerSelect.java 


最后,这是我得到的:

 + beerV1
           -> classes
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.class
                           -> web
                                -> BeerSelect.class
           -> src
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.java
                           -> web
                                -> BeerSelect.java

希望有所帮助。


推荐