2011-01-24 37 views
5

我有一个cmake的项目,看起来像:如何配置cmake以仅重建java项目中已更改的.java文件?

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

但是当我运行make目录中的所有java文件被重建,即使他们没有改变。有没有办法关闭这种行为?

谢谢,

+0

我很好奇,为什么要构建所有的java文件成为一个问题?这里的根本问题是什么? – jzd 2011-01-24 13:14:09

回答

5

The add_library CMake中的Java支持不是太热。它忽略了“包”指令,并假定“foo.java”在基目录中创建“foo.class”,而不是在package com.example;的子目录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含有破碎的依赖“包com。示例;”在顶部。请期待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。

0

我认为你的答案是只建立整个Java项目。如果你改变一个类并重新编译它,cmake将如何知道编译另一个依赖于它的类。如果您在其他人所依赖的某个类中移除某个方法,会发生什么情况,跳过重新编译其他类会导致运行时错误而不是编译器错误。

然而,40个java文件是一个小数目,它似乎应该在几秒钟或更少的时间内编译。

相关问题