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

eup*_*a83 78 java compilation directory-structure javac

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

如何使用javac从终端编译整个东西?

Man*_*pta 54

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

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java
Run Code Online (Sandbox Code Playgroud)

  • 或者只使用`javac $(find.-name"*.java")`. (42认同)
  • 如果无法指定中间目录,“**”也能正常工作吗? (3认同)
  • 我想:只需使用名称或通配符在 javac 之后列出所有 .java 文件。 (2认同)

Dan*_*rov 47

使用Bash 4,您可以启用globstar

shopt -s globstar
Run Code Online (Sandbox Code Playgroud)

然后呢

javac **/*.java
Run Code Online (Sandbox Code Playgroud)

  • 或者使用zsh和oh-my-zsh :) (3认同)

Bha*_*tri 38

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

cd <root-package-directory>
javac <complete-path-to-main-class>
Run Code Online (Sandbox Code Playgroud)

要么

javac -cp <root-package-directory> <complete-path-to-main-class>
Run Code Online (Sandbox Code Playgroud)

javac 将自动解析所有依赖项并编译所有依赖项.

  • 可能是因为它的简单性忽略了这样一个事实,即库或支持代码的许多编译作业都没有主要方法链接到所有必需的依赖项.这是一个很好的答案,但不是我在任何框架/公共代码库中使用的答案. (10认同)
  • 这是迄今为止最简单的解决方案.为什么人们不喜欢它? (4认同)
  • 恕我直言,框架或任何其他公共项目应使用某种构建管理.这种编译只对小型私人项目有意义. (2认同)
  • 谁说有主线?谁说没有四通?您想要在输出中使用的每个类是否都被 main 引用(并且不使用 META-INF/services 或其他服务加载技术)。如果您所做的只是测试 main,则此方法很好,但是它无法解决“编译给定目录中的所有 java 文件”的完整任务。正确的构建系统是 #1,像 `find 之类的 cli 工具。-类型 f -名称“*.java”| xargs javac` 是数字 2,并且仅当有一个包含整个应用程序的主方法入口点时才使用此方法。 (2认同)

Zac*_*h L 12

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

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

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

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


小智 12

以下是我发现的方法:

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

foo/AccessTestInterface.java
foo/goo/AccessTestInterfaceImpl.java
Run Code Online (Sandbox Code Playgroud)

2)使用命令:

javac @FilesList.txt -d classes
Run Code Online (Sandbox Code Playgroud)

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

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

dir *.java /s /b > FilesList.txt
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*Jon 9

您必须使用类似Ant的内容来分层次地执行此操作:

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

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

<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.java"/>
</javac>
Run Code Online (Sandbox Code Playgroud)

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

 ant compile
Run Code Online (Sandbox Code Playgroud)

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


dem*_*lem 9

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

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

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)
Run Code Online (Sandbox Code Playgroud)

这里bin文件是类文件的目标,lib(可能是当前工作目录)包含库文件,并且编译src目录和下面的所有java文件.