当其他包中有Java文件时,如何编译多个Java文件?

2022-09-02 01:18:24

我正在编译目录中的多个文件(),但是当我尝试执行此操作时,我遇到了问题。javac *.java

我收到编译错误,说找不到对象的符号。javac

我有多个包,其中包含运行主程序所需的Java文件。但似乎试图逐个编译这些是行不通的。它在我的IDE中运行良好,但我有兴趣学习如何通过命令提示符完成它。

主程序位于驱动程序文件夹中。我尝试过按依赖顺序编译文件,但这并没有成功。

this is a screenshot of the folders


答案 1

Javac 文档提供了所有必要的信息。但是,使用 Ant 或 Maven 进行命令行构建可能很有用。

页提供了一个很好的例子,说明首先使用javac,然后使用Ant来构建一个简单的项目。


这是一个示例项目,以及如何用javac编译它。

该项目的树结构是这样的:

   .
    ├── build
    └── src
        ├── attacks
        ├── drivers
        │   └── Driver.java
        └── exceptions
            └── MyException.java

有两个特殊的目录 - 用于包含编译的类和包含源文件(可能位于不同的子目录中 - 包)。buildsrc

以下命令编译整个项目,并将结果放入目录中。build

javac -sourcepath src -d build src/**/*.java

将目录指定为编译器可以找到所有源的位置。这些选项告诉编译器放置已编译文件的位置。-sourcepath srcsrc-d build

Option 告诉编译器实际编译哪些文件。在这种特定情况下,它告诉javac向下查看两个级别,并在该级别选择所有*.java。src/**/*.java

如果存在不同级别的文件,则需要指定文件列表。为此,可以将此类列表创建为外部文件,并将此文件作为 输入选项传递。*.javajavac

以下是在Linux / Unix下如何做到这一点:

find -name "*.java" > source.txt

上述命令创建文件源.txt其中包含找到的 *.java 文件的完整路径。对于此示例,它包含:

./src/drivers/Driver.java
./src/exceptions/MyException.java

为了编译将源文件列表刷新到 的项目,可以使用以下命令:source.txt

javac -d build @source.txt

请注意,在末尾指定,告诉编译器在何处查找源文件列表。另请注意,该选项可以省略。@source.txt-sourcepath

以下是运行上述命令后目录结构如何更改。

.
├── build
│   ├── drivers
│   │   └── Driver.class
│   └── exceptions
│       └── MyException.class
└── src
    ├── attacks
    ├── drivers
    │   └── Driver.java
    └── exceptions
        └── MyException.java

可以看出,该目录现在包含各个包中已编译的类文件。build

而且,如果要运行它,例如,假设具有 方法 ,以下命令将执行该程序。Drivermain

java -cp .:build:**/*.class drivers.Driver

请注意,文件分隔符(冒号)在Unix下使用,对于Windows,请将其更改为(分号)。:;


答案 2

我正在编译一个目录中的多个文件(javac *.java)

已经错了。只有当 Java 类不在包中时,这才能正常工作。执行此操作的正确方法如下,其中是所有软件包目录都植根的目录的名称:src

cd src
javac package1/package2/*.java
javac package3/package4/package5/*.java

等,无论您的软件包/目录布局是什么。每个命令行将编译命名目录中的所有文件以及它所依赖的其他包/目录中的所有.java文件,这些文件尚未编译或已过期。javac

请参阅 的工具文档。javac


推荐