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

Per*_*cot 5 java cmake

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

project(myProject JAVA)
add_library(myLibrary foo.java bar.java)
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

ric*_*chq 5

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

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

CMakeFiles/test.dir/foo.class: ../foo.java
    javac  $(Java_FLAGS) /full/path/to/foo.java -d CMakeFiles/test.dir
Run Code Online (Sandbox Code Playgroud)

当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})
Run Code Online (Sandbox Code Playgroud)

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