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

时间:2013-06-17 04:41:34

标签: java compilation javac

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

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

我有多个包含运行主程序所需的java文件。但似乎尝试逐个编译这些将无法正常工作。它在我的IDE中运行良好,但我有兴趣通过命令提示符了解它是如何完成的。

主程序位于drivers文件夹中。

我已经尝试按依赖顺序编译文件但是没有用完。this is a screenshot of the folders

3 个答案:

答案 0 :(得分:20)

Javac documentation提供了所有必要的信息。但是,将Ant或Maven用于命令行构建可能很有用。

This页面提供了一个使用第一个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有方法main,则以下命令执行该程序。

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

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

答案 1 :(得分:3)

  

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

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

cd src
javac package1/package2/*.java
javac package3/package4/package5/*.java
无论您的包/目录布局是什么,都可以使用

等。每个javac命令行将编译命名目录中的所有文件和所依赖的其他包/目录中的所有.java文件,这些文件尚未编译或者不在日期。

请参阅javac的工具文档。

答案 2 :(得分:1)

两个选项:

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

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