21

我正在一个目录 ( javac *.java) 中编译多个文件,但是当我尝试这样做时遇到了问题。

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

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

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

这是文件夹的屏幕截图

4

3 回答 3

27

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

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


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

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

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

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

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

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

-sourcepath src指定目录src是编译器可以找到所有源代码的地方。这些-d build选项告诉编译器将编译文件放在哪里。

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

如果存在*.java不同级别的文件,则需要指定文件列表。为此,可以将此类列表创建为外部文件,并将此文件作为javac.

以下是如何在 Linux/Unix 下完成此操作:

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

上面的命令创建文件 source.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目录现在包含各个包中已编译的类文件。

而且,如果您想运行它,例如,假设它Driver具有 method main,则以下命令将执行该程序。

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

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

于 2013-06-17T05:00:28.103 回答
3

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

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

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

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

请参阅工具文档以获取javac.

于 2013-06-17T07:26:57.087 回答
2

两个选项:

1)使用命令行指定要编译的所有文件

2) 创建一个包含所有文件名的文件(可能是 find 的输出),然后运行 ​​javac @argfile

于 2013-06-17T05:02:01.123 回答