如何配置cmake只重建java项目中更改的.java文件?

时间:2011-01-24 13:10:35

标签: java cmake

我有一个cmake项目,看起来像:

project(myProject JAVA)
add_library(myLibrary foo.java bar.java)

但是当我在目录中运行make时,即使它们没有被更改,也会重建所有java文件。有没有办法关闭这种行为?

谢谢,

2 个答案:

答案 0 :(得分:5)

CMake中的add_library Java支持不是太热。它忽略了“package”指令,并假设“foo.java”在基目录中创建“foo.class”,而不是在com/example/的子目录package com.example;中创建。

如果你看一下CMakeFiles/<jar_file>.dir/build.make中生成的makefile,它就会有这样的代码(清理一下)

CMakeFiles/test.dir/foo.class: ../foo.java
    javac  $(Java_FLAGS) /full/path/to/foo.java -d CMakeFiles/test.dir

当foo.java包含“package com.example;”时,这是一个破坏的依赖项。在顶部。 make期望创建foo.class,当它不是,并且你再次运行make时,它将编译foo.java以查看是否可能这次它将起作用。生成的实际文件是在com / example中(幸运的是,它被添加到最终的jar文件中)。

好消息是最近情况有所改善。在CMake的2.8.6版本中添加了一个名为UseJava的新模块,它可以更好地编译Java文件并在发生更改时正确重建。您需要使用add_library,而不是add_jar。这是一个完整的示例CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8.6)
find_package(Java)
include(UseJava)
project(java_test Java)
set(SRC
    src/com/example/test/Hello.java
    src/com/example/test/Message.java
)
add_jar(hello ${SRC})

这将从输入源文件生成hello.jar。

答案 1 :(得分:0)

我认为您的答案是构建整个Java项目。如果你改变一个类并重新编译它,cmake将如何知道编译另一个依赖它的类。如果删除其他类所依赖的一个类中的方法会发生什么,跳过重新编译其他类会给出运行时错误而不是编译器错误。

但是,40个java文件数量很少,看起来它们应该在几秒或更短的时间内编译。