2011-01-24 15 views
5

Tengo un proyecto cmake que se parece a:¿Cómo se configura cmake para que solo reconstruya los archivos .java modificados en un proyecto de Java?

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

pero cuando ejecuto make en el directorio, se reconstruyen todos los archivos de Java, incluso si no se han cambiado. ¿Hay alguna forma de desactivar ese comportamiento?

Gracias,

+0

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

+0

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

+0

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

Respuesta

5

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.

0

creo que su respuesta es simplemente construir todo el proyecto Java. Si cambia una clase y simplemente lo recompila, ¿cómo sabrá cmake que compilará otra clase que dependa de ella? ¿Qué sucede si elimina un método en una clase de la que otros dependen, omitiendo la recompilación de las otras clases le dará errores en tiempo de ejecución en lugar de un error de compilación.

Sin embargo, 40 archivos Java es una cantidad pequeña y parece que deberían compilarse en segundos o menos.

Cuestiones relacionadas