javac选项recursion地编译给定目录下的所有java文件

我正在使用javac编译器来编译我的项目中的java文件。 这些文件分布在如下几个包中: com.vistas.utilcom.vistas.convertercom.vistas.LineHelpercom.current.mdcontect

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

 javac com/vistas/util/*.java com/vistas/converter/*.java com.vistas.LineHelper/*.java com/current/mdcontect/*.java 

(在一行中)

我怎样才能让编译器recursion地编译父com目录中的所有java文件?

我也build议使用某种构build工具( Ant或Maven ,Ant已经提出并且更容易入手)或处理编译的IDE(Eclipse使用渐进式编译和协调策略,而且甚至不需要小心按任何“编译”button)。

使用Javac

如果你需要为更大的项目尝试一些东西,并且附近没有任何适当的构build工具,你可以使用javac提供的一个小技巧:要编译的类名可以在文件中指定。 您只需将文件的名称通过@前缀传递给javac

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

 # Linux $ find -name "*.java" > sources.txt $ javac @sources.txt :: Windows > dir /s /B *.java > sources.txt > javac @sources.txt 
  • 优点是这是一个快速和简单的解决scheme。
  • 缺点是每次创build新源时都必须重新生成sources.txt文件,或者重命名现有的一个容易遗忘的文件(因此容易出错)和繁琐的任务。

使用构build工具

从长远来看,最好使用一个专为构build软件而devise的工具。

使用Ant

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

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

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

 $ ant 
  • 好处是你正在使用一个易于扩展的标准构build工具。
  • 缺点是你必须下载,设置和学习一个额外的工具。 请注意,大多数IDE(如NetBeans和Eclipse)为编写构build文件提供了很好的支持,因此您无需在此情况下下载任何内容。

使用Maven

Maven并不是微不足道的设置和工作,但学习它付出了很多。 这里有一个很好的教程, 在5分钟内开始一个项目 。

  • 对我来说主要的好处是它也处理依赖关系,所以你不需要下载更多的Jar文件并手工pipe理它们,我发现它更适合于构build,打包和testing大型项目。
  • 缺点是它有一个陡峭的学习曲线,如果Maven的插件喜欢压制错误:-)另一件事是相当多的工具也与Maven仓库(如斯卡拉Sbt , 艾维ant, Graddle for Groovy) 。

使用IDE

现在,什么可以提高你的发展生产力。 有一些开源的select(比如Eclipse和NetBeans ,我更喜欢前者),甚至是商业化的(比如IntelliJ ),这些都是非常stream行和强大的。

他们可以在后台pipe理项目build设,所以你不必处理所有的命令行的东西。 但是,如果您知道背景中实际发生了什么,它总是会派上用场,所以您可以捕捉像ClassNotFoundException之类的偶然错误。

一个额外的笔记

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

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

有点残忍,但像地狱般的工作。 (只适用于小程序,绝对不高效)

如果你的shell支持它,会是这样的工作?

 javac com/**/*.java 

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

 javac com/*/*/*.java 

作品(包含3个组件的所有包装 – 适应或多或less)。

在通常的情况下,你想编译你的整个项目,你可以简单的提供javac和你的主类,让它编译所有需要的依赖关系:

javac -sourcepath . path/to/Main.java

我build议你学习使用ant ,这非常适合这个任务,很容易掌握和logging。

你只需要在build.xml文件中定义一个像这样的目标:

 <target name="compile"> <javac srcdir="your/source/directory" destdir="your/output/directory" classpath="xyz.jar" /> </target> 

我只是使用一个简单的makefile,看起来像这样:

 JAVAC = javac -Xlint:unchecked sources = $(shell find . -type f -name '*.java') classes = $(sources:.java=.class) all : $(classes) clean : rm -f $(classes) %.class : %.java $(JAVAC) $< 

它一次编译一个源代码,只在需要时才重新编译。

javac命令不遵循recursion编译过程,因此在运行命令时要么指定每个目录,要么提供一个文本文件以及要包含的目录:

 javac -classpath "${CLASSPATH}" @java_sources.txt 

我一直在使用这个在Xcode JNI项目recursion构build我的testing类:

 find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR} 

尝试这样做:在Mac和Linux上的javac */*/*/*.java ,但在Windows上的javac *\*\*\*.java