2015-05-08 16 views
6

Sono abbastanza nuovo per Gradle e Groovy. Ecco il mio compito che genera le intestazioni JNI:Il modo migliore per definire l'attività javah nel gradle

apply plugin: 'java' 
apply plugin: 'application' 

mainClassName = "com.my.example.HelloG" 

task GenerateJniHeaders(dependsOn: 'classes') << { 
    def classpath = "build/classes/main" 
    def nativeIncludes = "src/native/include" 
    "javah -d ${nativeIncludes} -classpath ${classpath} ${mainClassName}".execute() 
} 
classes.finalizedBy GenerateJniHeaders 
build.dependsOn GenerateJniHeaders 

Funziona bene, ma sento che è un po 'brutto. Come posso migliorarlo? Apprezzo qualsiasi suggerimento, specialmente quelli che mi aiutano a rimuovere le variabili codificate da me. Mi piacerebbe anche rendere questo compito più generico - ora genera solo l'intestazione JNI per la classe principale, ma vorrei eseguirlo per tutti i file java. Inoltre, quando questa attività ha esito negativo (ad esempio classpath è errato) non stampa alcun messaggio di errore e genera successo, il che è fuorviante.

risposta

12
  1. Gradle ha un tipo di attività di tipo Exec con proprietà della linea di comando per cui sarebbe più opportuno utilizzare:

    task generateJniHeaders(type:Exec) { 
        def classpath = sourceSets.main.output.classesDir 
        def nativeIncludes = "src/native/include"      
        commandLine "javah", "-d", nativeIncludes, "-classpath", classpath, "$mainClassName" 
    
        dependsOn classes 
    } 
    

    noti che in questo modo tutto in questo compito è una configurazione piuttosto che un'azione (se non si ha familiarità con il ciclo di vita build di Gradle poi una lettura consigliata sarebbe this sezione nel manuale d'uso.

  2. build.dependsOn GenerateJniHeaders dovrebbe essere sostituito da jar.dependsOn GenerateJniHeaders

  3. classes.finalizedBy non è necessario a tutti. Si noti che finalizedBy viene in genere utilizzato per le pulizie durante l'esecuzione anche se l'attività non riesce.

Problemi correlati