我有一个cmake的项目,看起来像:如何配置cmake以仅重建java项目中已更改的.java文件?
project(myProject JAVA)
add_library(myLibrary foo.java bar.java)
但是当我运行make目录中的所有java文件被重建,即使他们没有改变。有没有办法关闭这种行为?
谢谢,
我有一个cmake的项目,看起来像:如何配置cmake以仅重建java项目中已更改的.java文件?
project(myProject JAVA)
add_library(myLibrary foo.java bar.java)
但是当我运行make目录中的所有java文件被重建,即使他们没有改变。有没有办法关闭这种行为?
谢谢,
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。
我认为你的答案是只建立整个Java项目。如果你改变一个类并重新编译它,cmake将如何知道编译另一个依赖于它的类。如果您在其他人所依赖的某个类中移除某个方法,会发生什么情况,跳过重新编译其他类会导致运行时错误而不是编译器错误。
然而,40个java文件是一个小数目,它似乎应该在几秒钟或更少的时间内编译。
我很好奇,为什么要构建所有的java文件成为一个问题?这里的根本问题是什么? – jzd 2011-01-24 13:14:09