繁体   English   中英

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

[英]javac option to compile all java files under a given directory recursively

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

(一行)

与其给出这么多路径,不如让编译器递归编译父 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提供的一个小技巧:可以在文件中指定要编译的类名。 您只需将文件名以@前缀传递给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

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

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

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

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

使用 Maven

Maven 的设置和使用并不是那么简单,但学习它是值得的。 这是一个很棒的教程,可以在 5 分钟内启动一个项目

  • 它的主要优点(对我来说)是它也可以处理依赖关系,因此您无需下载任何 Jar 文件并手动管理它们,我发现它对于构建、打包和测试更大的项目更有用。
  • The drawback is that it has a steep learning curve, and if Maven plugins like to suppress errors:-) Another thing is that quite a lot of tools also operate with Maven repositories (like Sbt for Scala, Ivy for Ant, Graddle for Groovy) .

使用 IDE

现在,什么可以提高您的开发效率。 有一些开源替代品(例如EclipseNetBeans ,我更喜欢前者)甚至是商业替代品(例如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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM