【问题标题】:Fast, easy to maintain, and parallelizable way to build java code?构建 Java 代码的快速、易于维护和可并行化的方式?
【发布时间】:2011-09-01 16:17:52
【问题描述】:

我正在开发一个构建系统,该系统的不良做法长期与其他不良做法相叠加,并且我正在重新编写构建。涉及的语言是 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- 每个 @987654323 有一个目标@ 文件?
    • 如果这种情况更常见,这是为了简单起见还是有更深层次的原因?
    • 注意:我知道对于顺序构建这将是更快的选择,但我想要一个答案来对并行构建进行经验测试

【问题讨论】:

    标签: java makefile parallel-builds


    【解决方案1】:

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

    除非您有很多 JNI (c++ java) 依赖项,否则这也可能对您有用。

    祝你好运。

    【讨论】:

    • 在完全重写期间可能会出现这种情况,尽管肯定有相当多的 JNI 正在进行。
    【解决方案2】:

    做类似的事情

    javac -cp MY_CLASSPATH Main.java
    

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

    还有 antmavenivy 等等,但对于这么简单的事情来说,这有点过头了。

    【讨论】:

    • 你确定自动依赖解析吗?我可能做错了什么;假设 Main.java 依赖于从 Blah.java 生成的类文件,执行上面会抱怨缺少符号,除非我先编译 Blah.java。
    • 我很确定,它总是对我有用。当然,假设可以找到 Blah.java。
    【解决方案3】:

    在一个构建步骤中指定所有源文件并允许 javac 以这种方式解决所有依赖项是最方便的(也是整个 Java 开发的规范)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2013-07-25
      相关资源
      最近更新 更多