[英]javac option to compile all java files under a given directory recursively
我正在使用 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 文件?
I would also suggest using some kind of build tool ( Ant or Maven , Ant is already suggested and is easier to start with) or an IDE that handles the compilation (Eclipse uses incremental compilation with reconciling strategy, and you don't even have to注意按任何“编译”按钮)。
如果您需要为更大的项目尝试一些东西并且附近没有任何合适的构建工具,您总是可以使用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
文件,这很容易忘记(因此容易出错)和令人厌烦的任务。从长远来看,最好使用专为构建软件而设计的工具。
如果您创建一个描述如何构建软件的简单build.xml
文件:
<project default="compile">
<target name="compile">
<mkdir dir="bin"/>
<javac srcdir="src" destdir="bin"/>
</target>
</project>
您可以通过运行以下命令来编译整个软件:
$ ant
Maven 的设置和使用并不是那么简单,但学习它是值得的。 这是一个很棒的教程,可以在 5 分钟内启动一个项目。
现在,什么可以提高您的开发效率。 有一些开源替代品(例如Eclipse和NetBeans ,我更喜欢前者)甚至是商业替代品(例如IntelliJ ),它们非常流行且功能强大。
他们可以在后台管理项目构建,因此您不必处理所有命令行内容。 但是,如果您知道后台实际发生的情况,它总是会派上用场,这样您就可以寻找偶尔出现的错误,例如ClassNotFoundException
。
对于较大的项目,始终建议使用 IDE和构建工具。 The former boosts your productivity, while the latter makes it possible to use different IDEs with the project (eg, Maven can generate Eclipse project descriptors with a simple mvn eclipse:eclipse
command). 此外,拥有一个可以使用单行命令测试/构建的项目很容易介绍给新同事和持续集成服务器。 小菜一碟:-)
find . -name "*.java" -print | xargs javac
有点残酷,但像地狱一样工作。 (只在小程序上使用,绝对没有效率)
在您想要编译整个项目的通常情况下,您可以简单地为您的主要 class 提供 javac 并让它编译所有必需的依赖项:
javac -sourcepath. path/to/Main.java
如果您的 shell 支持它,这样的东西会起作用吗?
javac com/**/*.java
如果您的 shell 不支持**
,那么也许
javac com/*/*/*.java
有效(适用于具有 3 个组件的所有软件包 - 或多或少地适应)。
javac -cp "jar_path/*" $(find. -name '*.java')
(我不喜欢使用 xargs,因为它可以将它们拆分并多次运行 javac,每个文件都有 java 文件的子集,其中一些可能会导入未在同一 javac 命令行上指定的其他文件)
如果您有 App.java 入口点,最好使用 -sourcepath 的方式。 它按照导入依赖项编译它需要的所有其他 java 文件。 例如:
javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java
您还可以指定目标类文件目录: -d target/
。
我只是将 make 与一个简单的 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) $<
它一次编译一个源,并且仅在必要时重新编译。
我建议您学习使用ant ,它非常适合这项任务,并且非常容易掌握并且有据可查。
您只需要在 build.xml 文件中定义这样的目标:
<target name="compile">
<javac srcdir="your/source/directory"
destdir="your/output/directory"
classpath="xyz.jar" />
</target>
javac 命令不遵循递归编译过程,因此您可以在运行命令时指定每个目录,或者提供包含要包含的目录的文本文件:
javac -classpath "${CLASSPATH}" @java_sources.txt
这个非常酷:我位于项目根目录。
find . -name *.java -exec javac {} -d ../out \;
我一直在 Xcode JNI 项目中使用它来递归地构建我的测试类:
find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.