javac选项以递归方式编译给定目录下的所有java文件

use*_*934 118 java javac

我正在使用javac编译器来编译项目中的java文件.这些文件分布在几个包像这样:com.vistas.util,com.vistas.converter,com.vistas.LineHelper,com.current.mdcontect.

每个包都有几个java文件.我正在使用这样的javac:

javac com/vistas/util/*.java com/vistas/converter/*.java
      com.vistas.LineHelper/*.java com/current/mdcontect/*.java
Run Code Online (Sandbox Code Playgroud)

(在一行)

而不是提供这么多路径,我怎么能要求编译器递归编译来自父com目录的所有java文件?

rle*_*ndi 206

我还建议使用某种构建工具(AntMaven,已经建议使用Ant并且更容易开始)或者处理编译的IDE(Eclipse使用渐进式编译和协调策略,你甚至不需要小心按任何"编译"按钮).

使用Javac

如果你需要为更大的项目尝试一些东西并且附近没有任何正确的构建工具,你总是可以使用一个小技巧javac:编译的类名可以在文件中指定.您只需将文件名传递到javac@前缀.

如果您可以创建*.java项目中所有文件的列表,那么很容易:

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
Run Code Online (Sandbox Code Playgroud)
  • 优点是这是一种快速简便的解决方案.
  • 缺点sources.txt每次创建新源或重命名现有的一个文件时都必须重新生成文件,这是一个容易忘记(因此容易出错)和繁琐的任务.

使用构建工具

从长远来看,最好使用专为构建软件而设计的工具.

使用Ant

如果您创建一个build.xml描述如何构建软件的简单文件:

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>
Run Code Online (Sandbox Code Playgroud)

您可以通过运行以下命令来编译整个软件:

$ ant
Run Code Online (Sandbox Code Playgroud)
  • 优点是您使用的标准构建工具易于扩展.
  • 缺点是您必须下载,设置和学习其他工具.请注意,大多数IDE(如NetBeans和Eclipse)都为编写构建文件提供了很好的支持,因此在这种情况下您不必下载任何内容.

使用Maven

Maven建立和合作并不是那么微不足道,但学习它会很有成效.这是一个很好的教程,可以在5分钟内启动一个项目.

  • 它的主要优点(对我来说)它也处理依赖关系,因此您不需要再下载任何Jar文件并手动管理它们,我发现它对于构建,打包和测试更大的项目更有用.
  • 缺点是它有一个陡峭的学习曲线,如果Maven插件喜欢抑制错误:-)另一件事是很多工具也可以使用Maven存储库(比如Sbt for Scala,Ivy for Ant,Graddle for Groovy) .

使用IDE

现在,这可以提高您的开发效率.有一些开源替代品(比如EclipseNetBeans,我更喜欢前者)甚至是商业版(如IntelliJ),它们非常流行且功能强大.

他们可以在后台管理项目构建,因此您不必处理所有命令行内容.但是,如果您知道背景中实际发生的事情,那么它总是很方便,所以你可以找到像偶像一样的偶然错误ClassNotFoundException.

另外一个说明

对于较大的项目,始终建议使用IDE 构建工具.前者可以提高您的工作效率,而后者可以在项目中使用不同的IDE(例如,Maven可以使用简单的mvn eclipse:eclipse命令生成Eclipse项目描述符).此外,具有可以使用单行命令进行测试/构建的项目很容易引入新同事和持续集成服务器.小菜一碟 :-)

  • 对于遇到这种情况的mac用户,`find`命令是:`find.-name"*.java"> sources.txt`(注意`.`) (5认同)
  • 使用`javac`时,最好指定一个输出目录.`find -name"*.java"> sources.txt && javac -d bin @ sources.txt`.否则*.class文件将保存到源所在的目录中. (4认同)
  • 如果文件路径有空格,使用“javac @sources.txt”的方法将不起作用 (2认同)

Mat*_*ler 39

find . -name "*.java" -print | xargs javac 
Run Code Online (Sandbox Code Playgroud)

有点野蛮,但工作就像地狱.(仅用于小程序,绝对没有效率)


pht*_*ier 28

如果你的shell支持它,这样的工作会起作用吗?

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

如果你的shell不支持**,那么也许吧

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

工作(对于所有包含3个组件的包 - 适应或多或少).

  • 这有效,实际上更直接地回答了这个问题. (3认同)

fre*_*ker 23

在通常情况下,您希望编译整个项目,您可以简单地为您的主类提供javac,并让它编译所有必需的依赖项:

javac -sourcepath . path/to/Main.java

  • 不幸的是它很懒。如果您不触及“Main.java”(在创建第二个文件后您可能不会这样做),则编译器不会获得其他任何东西。 (2认同)
  • 这里也不太好用。尽管更改了某些依赖项,但仍不会重新编译。@TomHawtin-tackline 我之前在主要部分尝试过触摸,但没有任何结果。也许需要触及所有内容。虽然有点尴尬。 (2认同)

Cur*_*lop 8

javac -cp "jar_path/*" $(find . -name '*.java')

(我不喜欢使用 xargs,因为它可以将它们拆分并多次运行 javac,每个都有一个 java 文件的子集,其中一些可能会导入未在同一 javac 命令行中指定的其他文件)

如果您有 App.java 入口点,那么使用 -sourcepath 的 freaker 方法是最好的。它按照导入依赖项编译它需要的所有其他 java 文件。例如:

javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java

您还可以指定目标类文件目录:-d target/.