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

时间:2011-07-08 10:26:02

标签: java javac

我正在使用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文件,而不是提供这么多路径?

9 个答案:

答案 0 :(得分:194)

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

如果您创建一个描述如何构建软件的简单build.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存储库(如{{ 3}}用于Scala,Sbt用于Ant,Ivy用于Groovy。)

使用IDE

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

他们可以在后台管理项目构建,因此您不必处理所有命令行内容。但是,如果您知道背景中的实际发生,那么它总是很方便,因此您可以像ClassNotFoundException一样找出偶然的错误。

另外一个注释

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

答案 1 :(得分:39)

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

有点野蛮,但是像地狱一样。 (仅限小型程序使用,绝对无效)

答案 2 :(得分:27)

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

javac com/**/*.java 

如果您的shell不支持**,那么可能

javac com/*/*/*.java

有效(适用于所有包含3个组件的包 - 适应或多或少)。

答案 3 :(得分:22)

在通常情况下,如果要编译整个项目,可以简单地为主类提供javac,并让它编译所有必需的依赖项:

<html lang="en"><head> <meta charset="utf-8"> <title>G.S.DB</title> <meta name="author" content="Author name"> <link href="http://fonts.googleapis.com/css?family=Open+Sans:300" rel="stylesheet" type="text/css"> <link rel="stylesheet" href="css/styles.css"> </head> <body data-feedly-mini="yes"><header> <img src="images/logo.png" alt="Good Show Database"> </header> <div id="nav" class="centre" ;=""> <nav> <ul> <li><a href="index.php">Home</a></li> <li><a href="login.php">Login</a></li> <li><a href="search.php">Search</a></li> <li><a href="shows.php">Show list</a></li> <li><a href="cast.php">Actor list</a></li> </ul> </nav> </div> <div id="main">Access denied!</div><iframe frameborder="0" scrolling="no" style="border: 0px; display: none; background-color: transparent;"></iframe><div id="GOOGLE_INPUT_CHEXT_FLAG" input="" input_stat="{&quot;tlang&quot;:true,&quot;tsbc&quot;:true,&quot;pun&quot;:true,&quot;mk&quot;:false,&quot;ss&quot;:true}" style="display: none;"></div><div id="feedly-mini" title="feedly Mini tookit"></div></body></html>

答案 4 :(得分:3)

我建议你学习使用ant,这非常适合这项任务,并且很容易掌握和记录。

您只需在build.xml文件中定义这样的目标:

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

答案 5 :(得分:2)

我只是将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) $<

它一次编译一个源,只在必要时重新编译。

答案 6 :(得分:2)

javac -cp "jar_path/*" $(find . -name '*.java')

(我不想使用xargs,因为它可以将它们拆分并多次运行javac,每个都有一个java文件的子集,其中一些文件可能导入未在同一javac命令行上指定的其他文件)

如果您有App.java入口点,则最好使用freaker的-sourcepath方法。它根据导入依赖关系编译它需要的所有其他Java文件。例如:

javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java

您还可以指定目标类文件目录:-d target/

答案 7 :(得分:1)

javac命令不遵循递归编译过程,因此您在运行命令时指定每个目录,或者提供包含要包含的目录的文本文件:

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

答案 8 :(得分:0)

我一直在Xcode JNI项目中使用它来递归构建我的测试类:

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