Java:如何编译整个代码目录结构?

时间:2011-01-21 23:04:33

标签: java compilation javac directory-structure

用例很简单。我得到了使用Eclipse创建的源文件。因此,有一个深层目录结构,任何Java类都可以引用同一个子,兄弟或父文件夹中的另一个Java类。

如何使用javac从终端编译整个内容?

9 个答案:

答案 0 :(得分:50)

你必须知道所有目录,或者能够使用通配符..

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java

答案 1 :(得分:46)

使用Bash 4,您可以启用globstar

shopt -s globstar

然后再做

javac **/*.java

答案 2 :(得分:35)

如果您只想运行主类(不编译主类不依赖的.java文件),那么您可以执行以下操作:

cd <root-package-directory>
javac <complete-path-to-main-class>

javac -cp <root-package-directory> <complete-path-to-main-class>

javac会自动解析所有依赖项并编译所有依赖项。

答案 3 :(得分:12)

我会采用Jon的建议并使用Ant,因为这是一项非常复杂的任务。

但是,如果您决定在终端的一行中获取所有内容,则在Linux上您可以使用find命令。但我根本不建议这样做,因为即使Foo使用Bar,也不能保证在Bar.java之后编译Foo.java。一个例子是:

find . -type f -name "*.java" -exec javac {} \;

如果尚未编译所有类,如果有一个主要的线束或驱动程序类(基本上是包含main方法的类),则单独编译该主类应该编译大部分项目,即使它们位于不同的文件夹,因为Javac将尽最大努力解决依赖问题。

答案 4 :(得分:10)

以下是我找到的方法:

1)在文件中创建具有相对路径的文件列表(比如FilesList.txt),如下所示(空格分隔或行分隔):

foo/AccessTestInterface.java
foo/goo/AccessTestInterfaceImpl.java

2)使用命令:

javac @FilesList.txt -d classes

这将编译所有文件并将类文件放在classes目录中。

现在创建FilesList.txt的简单方法是: 转到源根目录。

dir *.java /s /b > FilesList.txt

但是,这将填充绝对路径。使用文本编辑器“全部替换”到源目录的路径(最后包括\)和“”(即空字符串)和保存。

答案 5 :(得分:9)

你必须使用类似Ant的东西来分层次地执行此操作:

http://ant.apache.org/manual/Tasks/javac.html

您需要使用名为compile的目标创建一个构建脚本,其中包含以下内容:

<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.java"/>
</javac>

然后你就可以通过运行来编译所有文件:

 ant compile

或者,将项目导入Eclipse,它将自动编译该项目的所有源文件。

答案 6 :(得分:8)

现有的答案似乎只涉及自己的* .java文件本身,而不是如何使用构建可能需要的库文件轻松完成。

一个很好的单行情况,递归获取所有* .java文件以及包含构建所需的* .jar文件:

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)

这里bin文件是类文件的目标,lib(可能是当前工作目录)包含库文件,src目录及其下的所有java文件都被编译。

答案 7 :(得分:2)

有一种方法可以在不使用管道字符的情况下执行此操作,如果您要使用其他编程语言执行此过程,这很方便:

find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +

虽然如果你在Bash和/或不介意使用烟斗,那么你可以这样做:

find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR

答案 8 :(得分:2)

Windows解决方案:假设所有文件都包含在子目录“src”中,并且您希望将它们编译为“bin”。

for /r src %i in (*.java) do javac %i -sourcepath src -d bin

如果src在其下方包含一个.java文件,那么这就更快了

javac src\\*.java -d bin