El soporte de Java add_library
en CMake no está demasiado caliente. Ignora la directiva "paquete" y asume que "foo.java" crea "foo.class" en el directorio base, no en un subdirectorio com/example/
para package com.example;
.
Si nos fijamos en los makefiles generados en CMakeFiles/<jar_file>.dir/build.make
, que tiene un código como éste (limpiado un poco)
CMakeFiles/test.dir/foo.class: ../foo.java
javac $(Java_FLAGS) /full/path/to/foo.java -d CMakeFiles/test.dir
Ésta es una dependencia rompe cuando foo.java contiene "paquete com.example;" en la cima. Make espera que se cree foo.class, cuando no está y se ejecuta make nuevamente, compilará foo.java para ver si tal vez esta vez funcionará. El archivo real generado está en com/example (que afortunadamente se agrega al archivo jar final).
La buena noticia es que las cosas han mejorado recientemente. En la versión 2.8.6 de CMake, se agregó un nuevo módulo llamado UseJava
que hace un trabajo mucho mejor al compilar los archivos Java y reconstruirlos correctamente cuando hay cambios. En lugar de usar add_library
, necesita usar add_jar
. Este es un archivo completo CMakeLists.txt ejemplo:
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})
que producirá hello.jar a partir de los archivos de código fuente de entrada.
Tengo curiosidad, ¿por qué la creación de todos los archivos java sería un problema? ¿Cuál es el problema de raíz aquí? – jzd
Disculpe, no tengo una respuesta para su pregunta, pero ...: ¿por qué está usando cmake para su proyecto Java? Existen herramientas como Apache Ant y Apache Maven, que son las herramientas de compilación estándar de facto para los proyectos de Java. – Jesper
jzd - Básicamente, me estoy metiendo en el rango de ~ 40 archivos Java en este proyecto, y reconstruirlo cada vez que hago un cambio consume tiempo. – PerilousApricot