当其他包中有java文件时,如何编译多个java文件
我正在编译目录中的多个文件(javac * .java)但是当我尝试这样做时遇到问题:
我得到编译错误,说javac无法找到对象的符号。
我有多个包,包含运行主程序所需的java文件。 但似乎尝试逐个编译这些将无法正常工作。 它在我的IDE中运行正常,但我有兴趣通过命令提示符了解它是如何完成的。
主程序位于drivers文件夹中。
我已经尝试按依赖顺序编译文件但是没有用。
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
目录-sourcepath 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
有方法main
,则以下命令执行该程序。
java -cp .:build:**/*.class drivers.Driver
请注意,在Unix下使用文件分隔符:
冒号),Windows将其更改为;
(分号)。
我正在编译目录中的多个文件(javac * .java)
错了。 只有当Java类不在包中时,这才能正常工作。 执行此操作的正确方法如下,其中src
是所有包目录所在的目录的名称:
cd src javac package1/package2/*.java javac package3/package4/package5/*.java
无论您的包/目录布局是什么等。 每个javac
命令行都将编译指定目录中的所有文件以及它所依赖的其他包/目录中的所有.java文件,这些文件尚未编译或已过期。
请参阅javac
的工具文档。
两种选择:
1)使用命令行指定要编译的所有文件
2)创建一个包含所有文件名的文件(可能是find的输出),然后运行javac @argfile