用例很简单。我得到了使用Eclipse创建的源文件。因此,有一个深层目录结构,任何Java类都可以引用同一个子,兄弟或父文件夹中的另一个Java类。
如何使用javac从终端编译整个内容?
答案 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