Il supporto add_library
in CMake non è troppo caldo. Ignora la direttiva "pacchetto" e assume che "foo.java" crei "foo.class" nella directory di base, non in una sottodirectory com/example/
per package com.example;
.
Se si guardano le makefile generati in CMakeFiles/<jar_file>.dir/build.make
, è il codice come questo (ripulito un po ')
CMakeFiles/test.dir/foo.class: ../foo.java
javac $(Java_FLAGS) /full/path/to/foo.java -d CMakeFiles/test.dir
Questa è una dipendenza rotto quando foo.java contiene "pacchetto com.example;" in cima. Fai in attesa che venga creato foo.class, quando non lo è e tu esegui make di nuovo, compilerà foo.java per vedere se forse questa volta funzionerà. Il vero file generato è in com/example (che per fortuna viene aggiunto al file jar finale).
La buona notizia è che le cose sono migliorate di recente. Nella versione 2.8.6 di CMake è stato aggiunto un nuovo modulo chiamato UseJava
che svolge un lavoro molto migliore nella compilazione di file Java e nella ricostruzione corretta in caso di modifiche. Invece di usare add_library
devi usare add_jar
. Ecco un completo file di esempio 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})
che produrrà hello.jar dai file di origine di ingresso.
Sono curioso, perché la creazione di tutti i file Java è un problema? Qual è il problema di root qui? – jzd
Scusa, non ho una risposta alla tua domanda, ma ...: perché stai usando cmake per il tuo progetto Java? Esistono strumenti come Apache Ant e Apache Maven che sono di fatto gli strumenti di compilazione standard per i progetti Java. – Jesper
jzd - Fondamentalmente, sto entrando nel range di ~ 40 file java in questo progetto, e ricostruirlo ogni volta che apporto una modifica sta diventando dispendioso in termini di tempo – PerilousApricot