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

问题

我正在使用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

(在一行)

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


#1 热门回答(179 赞)

我还建议使用某种构建工具(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

-优势在于它是一种快速简便的解决方案。

  • 缺点是每次创建新源或重命名现有的一个文件时都必须重新生成sources.txt文件,这是一个容易忘记(因此容易出错)和令人厌烦的任务。

##使用构建工具

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

###使用Ant

如果你创建一个描述如何构建软件的simplebuild.xml文件:

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>

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

$ ant

-优点是你使用的标准构建工具易于扩展。

  • 缺点是你必须下载,设置和学习其他工具。请注意,大多数IDE(如NetBeans和Eclipse)都为编写构建文件提供了很好的支持,因此在这种情况下你无需下载任何内容。

###使用Maven

Maven设置和使用并不是那么微不足道,但学习它的成本很高。这是一个很棒的教程,以start a project within 5 minutes

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

##使用IDE

现在,这可以提高你的开发效率。有一些开源替代品(如Eclipse和56261613,我更喜欢前者)甚至是商业用途(如IntelliJ),它们非常受欢迎且功能强大。

他们可以在后台管理项目构建,因此你不必处理所有命令行内容。但是,如果你知道whatactually发生在背景中,它总是很方便,所以你可以找到像aClassNotFoundException这样的偶然错误。

##另外一个注意事项

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


#2 热门回答(37 赞)

find . -name "*.java" -print | xargs javac

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


#3 热门回答(25 赞)

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

javac com/**/*.java

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

javac com/*/*/*.java

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