Поддержка add_library
Java в CMake не слишком горячая. Он игнорирует директиву package и предполагает, что foo.java создает foo.class в базовом каталоге, а не в подкаталоге com/example/
для package com.example;
.
Если вы посмотрите на сгенерированные make-файлы в 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
Это нарушенная зависимость, когда foo.java содержит "package com.example;" на вершине. Make ожидает, что будет создан файл foo.class. Если этого не произойдет, и вы запустите make снова, он скомпилирует файл foo.java, чтобы посмотреть, будет ли в этот раз он работать. Фактический сгенерированный файл находится в com / example (который, к счастью, добавляется в окончательный файл jar).
Хорошая новость заключается в том, что в последнее время ситуация улучшилась. В версии 2.8.6 CMake был добавлен новый модуль под названием 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 из исходных файлов.