javac选项recursion地编译给定目录下的所有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
(在一行中)
我怎样才能让编译器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
。