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