【问题标题】:How to compile java package structures using javac如何使用 javac 编译 java 包结构
【发布时间】:2022-01-01 23:23:00
【问题描述】:

我正在尝试编译(从命令行)一个导入我自己的另一个包的 java 包。我正在关注tutorial online,但当我尝试编译最终的 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. 进入子包,用$javac HelloWorld.java编译HelloWorld.java。
  2. 转到 test_directory 并使用 $javac CallPackage.java 编译 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

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

【问题讨论】:

  • 这将对您有所帮助。 thejavageek.com/2013/07/21/…
  • 如果你使用像Eclipse这样的IDE来执行java程序会更好,因为它可以自动创建包。

标签: java command-line compilation package javac


【解决方案1】:

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

尝试的步骤

  1. 不要去分包,而是从顶层编译HelloWorld.java:

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

  2. 同理编译CallPackage.java:

    $javac -cp . CallPackage.java

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

    $java -cp . CallPackage

注意:运行“$java CallPackage”会报错“Error: could not find or load main class CallPackage”

总而言之,在每个步骤中,必须指定类路径。这样运行后它就可以工作了。

【讨论】:

  • 如果你的类完全相互引用,这在 Windows 上不起作用...
【解决方案2】:

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

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


BeerExpert.java:

package com.example.model;
import ...

public class BeerExpert{
    ...
}


BeerSelect.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

希望对您有所帮助。

【讨论】:

  • 谢谢。这绝对是最好的答案!其他答案会导致明显的预期问题,因为我无法在没有其他答案的情况下编译一个!
  • 遇到了类似的问题。 Vĩnh Thụy Trần 的解决方案效果很好:在项目的顶层使用命令提示符,包括所有路径在同一 javac 行上的类,谁能想到它这么简单!
【解决方案3】:

您确定 importpackage/subpackage 在您的类路径中吗?

-cp 路径或-classpath 路径

指定在哪里可以找到用户类文件,以及(可选)注释处理器和源文件。此类路径覆盖 CLASSPATH 环境变量中的用户类路径。如果既未指定 CLASSPATH、-cp 也未指定 -classpath,则用户类路径由当前目录组成。有关详细信息,请参阅设置类路径。

如果没有指定-sourcepath选项,也会在用户类路径中搜索源文件。

如果未指定 -processorpath 选项,还会在类路径中搜索注解处理器。

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

【讨论】:

  • 我猜@Jazzy Josh 你是说当我执行第 2 步时,我需要让我的类路径指向第 1 步中的 .class 文件所在的目录。当我这样做时,我运行这个:$javac -cp importpackage/subpackage/CallPackage.java 但我收到此错误:请删除或确保它出现在类路径的正确子目录中。 HelloWorld h2=new HelloWorld(); ^ 2 个错误
  • 问题确实最终成为类路径。我需要使用“-cp”运行所有 java 和 javac 命令。例如: $javac -cp 。 CallPackage.java 和 $java -cp 。调用包
  • @Jazzy Josh 请看看这个post,我想我用错了-cp,我不知道如何纠正我的错误。
【解决方案4】:

这是一个古老的话题,但谷歌已经把我带到了这个网站。为了完整起见,我想在@Vĩnh Thụy Trần 关于如何在将主类编译到自定义文件夹后运行的答案中添加一点。虽然现在看起来微不足道,但我花了一些时间才把它弄好。

为了运行您的项目,您还需要指定类的路径:

java -classpath <directory> your.package.name.classname

java -cp <directory> your.package.name.classname

再次以 Vĩnh Thụy Trần 为例,命令如下所示:

java -cp classes com.example.web.BeerSelect

我希望它对我花了一些时间弄明白的人有所帮助。

【讨论】:

    【解决方案5】:

    (1)先编译代码

    javac -d importpackage.subpackage.HelloWorld

    (2)然后编译CallPackage.java

    javac CallPackage.java

    【讨论】:

    • 我应该从第一步开始运行 cmd 的哪个目录?当我在 test_directory 和子包目录中尝试这个时,我得到一个错误,说它找不到这个目录。
    • 因为你在子包里面编译了HelloWorld。
    【解决方案6】:

    删除您的包文件夹(在将代码粘贴到其他文件夹之后),然后在 cmd 中找到您当前代码所在的文件夹并尝试 javac -d 。 Helloworld.java(这也将创建 Helloworld 类和子包)并为您的 mainfunction 代码尝试相同,即 Callpackage.java 在编译运行代码后尝试 java Callpackage

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      相关资源
      最近更新 更多