我有一个cmake项目,看起来像:
project(myProject JAVA)
add_library(myLibrary foo.java bar.java)
但是当我在目录中运行make时,即使它们没有被更改,也会重建所有java文件。有没有办法关闭这种行为?
谢谢,
答案 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文件数量很少,看起来它们应该在几秒或更短的时间内编译。