构建Java代码的快速,易维护和可并行化的方式?

时间:2011-09-01 16:17:52

标签: java makefile parallel-builds

我正在开发一个构建系统,这个系统在很长一段时间内都会遇到其他不良做法的错误做法,而我正在重新编写构建版本。涉及的语言是C / C ++,Fortran,Ada和Java,目前我仍然坚持使用GNU风格的makefile - 尽管我们正在考虑其他替代品,如SCons。

话虽如此,我正在寻找一些具体的建议 - 而不是“使用不同的构建系统”等形式的建议。

无论是谁编写了我现在正在查看的特定makefile,都计划在java代码的顺序构建中看起来像这样:

LIST_OF_JAVA_FILES  = file1.java
LIST_OF_JAVA_FILES += file2.java
LIST_OF_JAVA_FILES += file3.java
...
LIST_OF_JAVA_FILES += fileN.java

all: ${LIST_OF_JAVA_FILES}

${LIST_OF_JAVA_FILES} : %.class : %.java
  ${JAVAC} ${CLASSPATH} ${<}

如果您执行串口构建,这可以正常工作。但是,只要依赖关系进入混合,就会出现问题。

  1. C / C ++编译器内置了用于依赖关系生成的选项...... Java是否存在类似的工具?
  2. 是否有必要使用第三方工具(如Jikes)来生成依赖项?
  3. 通常来说,如果一个团队使用makefile来构建任何与java相关的东西,那么更常见的是调用java编译器一次列出一个命令行中的所有.java文件-vs-每个目标一个目标.class档案?
    • 如果这种情况比较常见,这是为了简单起见还是有更深层次的原因?
    • 注意:我理解,对于顺序构建,这将是更快的选择,但我想要一个答案来做并行构建的经验测试

3 个答案:

答案 0 :(得分:1)

我们的项目有类似的问题。 我们决定通过ant构建所有java代码,并从makefile中调用ant。

除非你有很多JNI(c ++&lt; ----&gt; java)依赖项,否则这对你也有用。

祝你好运。

答案 1 :(得分:0)

做类似

的事情
javac -cp MY_CLASSPATH Main.java

大部分时间都足够,因为它会自动解决依赖关系。有时您可能需要在命令行上使用更多文件,因为其中一些文件可能在没有明确引用的情况下使用。

还有antmaven以及ivy等等,但对于那些简单的事情来说,这是一种过度杀伤力。

答案 2 :(得分:0)

它最终成为最合适的(并且是整个Java开发的标准),只需在单个构建步骤中指定所有源文件,并允许javac以这种方式解析所有依赖项。