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

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

我如何从terminal使用javac编译这整个事情?

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

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

用Bash 4,你可以启用globstar

 shopt -s globstar 

然后呢

 javac **/*.java 

如果你想要做的就是运行你的主类(不需要编译主类不依赖的.java文件),那么你可以执行以下操作:

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

要么

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

javac会自动解决所有的依赖关系,并编译所有的依赖关系。

我会采取乔恩的build议,并使用ant,因为这是一个非常复杂的任务。

但是,如果您决定在terminal中将其全部放在一行中,则可以在Linux上使用find命令。 但我不推荐这么做,因为不能保证Foo.java会在Bar.java之后编译,即使Foo使用Bar 。 一个例子是:

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

如果你所有的类都还没有被编译,如果有一个主要的线束或驱动类(基本上是包含你的main方法的类),编译这个主类应该编译大部分项目,即使它们在不同的文件夹中, Javac将尽其所能解决依赖性问题。

你必须使用类似Ant的东西来做到这一点:

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

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

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

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

  ant compile 

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

以下是我find的方法:

1)在文件中使用相对path(如FilesList.txt)创build文件列表,如下所示(空格分隔或行分隔):

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

2)使用命令:

 javac @FilesList.txt -d classes 

这将编译所有的文件,并把class文件放在classes目录下。

现在简单的方法来创buildFilesList.txt是这样的:转到您的源根目录。

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

但是,这将会填充绝对path。 使用文本编辑器“全部replace”直到源目录的path(包括\最后)用“”(即空string)和保存。

已经存在的答案似乎只关心自己的* .java文件本身,而不是如何轻松地使用可能需要的构build库文件。

recursion获取所有* .java文件以及包含构build所需的* .jar文件的一个很好的单行情况是:

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

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

有一种方法可以在不使用pipe道字符的情况下执行此操作,如果您从另一种编程语言分支进程来执行此操作,

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

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

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

Windows解决scheme:假设所有文件包含在子目录'src'中,并且你想把它们编译成'bin'。

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

如果src在它下面包含一个.java文件,那么这个速度会更快

 javac src\\*.java -d bin