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

用例很简单。我得到了使用Eclipse创建的源文件。因此,有一个深层目录结构,任何Java类都可以引用同一个子,兄弟或父文件夹中的另一个Java类。 如何使用javac从终端编译整个东西?     
已邀请:
您必须知道所有目录,或者能够使用通配符..
javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java
    

bab

使用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
会自动解析所有依赖项并编译所有依赖项。     
我会采用Jon的建议并使用Ant,因为这是一项相当复杂的任务。 但是,如果您决定在终端的一行中获取所有内容,则可以在Linux上使用find命令。但是我根本不推荐这个,因为不能保证,比如Foo.java将在Bar.java之后编译,即使
Foo
使用
Bar
。一个例子是:
find . -type f -name "*.java" -exec javac {} ;
如果尚未编译所有类,如果有一个主要线束或驱动程序类(基本上是包含main方法的类),则单独编译该主类应该编译大部分项目,即使它们位于不同的文件夹中,因为Javac将尽最大努力解决依赖问题。     
以下是我发现的方法: 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
但是,这将填充绝对的道路。使用文本编辑器“全部替换”到源目录的路径(最后包括)和“”(即空字符串)和保存。     
您必须使用类似Ant的内容来分层次地执行此操作: http://ant.apache.org/manual/Tasks/javac.html 您需要使用名为compile的目标创建一个构建脚本,其中包含以下内容:
<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.java"/>
</javac>
然后你就可以通过运行来编译所有文件了:
 ant compile
或者,将项目导入Eclipse,它将自动编译该项目的所有源文件。     
已经存在的答案似乎只关注自己的* .java文件本身,而不是如何轻松地使用构建可能需要的库文件。 一个很好的单行情况,以递归方式获取所有* .java文件以及包含构建所需的* .jar文件:
javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)
这里bin文件是类文件的目标,lib(可能是当前工作目录)包含库文件,并且编译src目录和下面的所有java文件。     
有一种方法可以在不使用管道字符的情况下执行此操作,如果您使用其他编程语言分支进程来执行此操作,这很方便:
find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +
虽然如果你在Bash和/或不介意使用烟斗,那么你可以这样做:
find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR
    
Windows解决方案:假设所有文件都包含在子目录'src'中,并且您希望将它们编译为'bin'。
for /r src %i in (*.java) do javac %i -sourcepath src -d bin
如果src在其下方包含一个.java文件,则更快
javac src\*.java -d bin
    

要回复问题请先登录注册