2015-10-08 8 views
6

Ho un semplice progetto padre con moduli/applicazioni al suo interno. Il mio strumento di scelta è il gradle. Il genitore build.gradle è definito di seguito.Come ottenere l'attributo di versione da una build gradle da includere in runtime Applicazione Swing

apply plugin: 'groovy' 
dependencies { 
    compile gradleApi() 
    compile localGroovy() 
} 


allprojects { 
    repositories { 
     mavenCentral() 
    } 

    version "0.1.0-SNAPSHOT" 
} 

Quello che vorrei fare è utilizzare l'attributo di versione (0.1.0-SNAPSHOT) all'interno della mia applicazione swing. In particolare, mi piacerebbe che fosse visualizzato nella barra del titolo del JFrame principale. Mi aspetto di essere in grado di fare qualcosa come this.setTitle("My Application - v." + ???.version);

L'applicazione è un semplice progetto Java, ma non sono contrario ad aggiungere il supporto groovy che aiuterà.

+1

alcuni [ '.properties'] (http://crunchify.com/java-properties-file-how-to-read-config-properties-values-in-java/) file che ottiene la versione in modo dinamico (come l'esempio 1-8 in https: //www.safaribooksonline. com/library/view/gradle-beyond-the/9781449373801/ch01.html)? – zapl

risposta

17

Mi piace creare un file di proprietà durante la compilazione. Ecco un modo per farlo da Gradle direttamente:

task createProperties(dependsOn: processResources) { 
    doLast { 
    new File("$buildDir/resources/main/version.properties").withWriter { w -> 
     Properties p = new Properties() 
     p['version'] = project.version.toString() 
     p.store w, null 
    } 
    } 
} 

classes { 
    dependsOn createProperties 
} 
+0

Mi piace questa soluzione. Ma il mio setup ha avuto un errore su 'project.buildTimestamp' ... e guardando gli attuali documenti Gradle Javadoc e DSL non vedo alcun segno di questo metodo per' Project' o qualsiasi altra classe. La versione è 2.14, presumibilmente questa è la ragione. Non hai idea di come fare una tale data ora, vero? Cura aggiornare la tua risposta? –

+0

Apparentemente 'project.buildTimestamp' era un frutto della mia immaginazione.Puoi ancora aggiungere altre proprietà in base alle tue esigenze, ma non sono rilevanti per questo esempio, quindi l'ho rimosso dalla risposta. –

+0

Non c'è niente di sbagliato nel desiderare che il mondo sia migliore di quello che è ;-). Ma grazie per aver rimosso una fonte di potenziale confusione! –

6

È sempre possibile utilizzare la forza bruta come suggerito da qualcuno e generare il file delle proprietà durante la creazione. Più risposta elegante, che funziona solo in parte sarebbe di usare

getClass().getPackage().getImplementationVersion() 

problema è che questo funziona solo se si esegue l'applicazione dal vaso generato - se lo si esegue direttamente da IDE/classi espansi, getPackage sopra tornerà nullo. È sufficiente per molti casi: è sufficiente visualizzare "SVILUPPO" se si esegue da IDE (ottenendo il pacchetto nullo) e funzionerà per le distribuzioni effettive dei client.

+0

Grazie ... Sì, in effetti ti suggerisco di usare il tuo per l'implementazione e la soluzione di Craig Trader durante i test ... per cui il percorso verso version.properties nella sua risposta dovrebbe essere ".../resources/* ** *** TEST/version.properties". Non c'è bisogno di ingombrare il tuo vaso distribuito con questo file. –

6

L'idea migliore è di mantenere la versione del progetto nel file gradle.properties. Tutte le proprietà di questo file verranno caricate automaticamente e possono essere utilizzate nello script build.gradle.

Poi, se avete bisogno della versione nell'applicazione swing, aggiungere un file nella cartella version.propertiessrc/main/resources e filtrare questo file durante la generazione dell'applicazione, here è un post che mostra come dovrebbe essere fatto.

version.properties sarà incluso nel contenitore finale, quindi può essere letto e tramite ClassLoader e le proprietà da questo file possono essere visualizzate nell'applicazione.

+0

Il filtro delle risorse è un'ottima soluzione. Separa le preoccupazioni consentendo allo strumento di creazione di fornire i dettagli che conosce. Vedo [Gradle docs] (https://guides.gradle.org/migrating-from-maven/#resource_filtering) '' 'processResources { espandere (versione: versione, BuildNumber: currentBuildNumber) }' '' – KingJahfy

0

più semplice e la soluzione aggiornata di @ Craig Trader (pronto per Gradle 4,0/5,0)

task createProperties { 
    doLast { 
     def version = project.version.toString() 
     def file = new File("$buildDir/resources/main/version.txt") 
     file.write(version) 
    } 
} 

war { 
    dependsOn createProperties 
} 
+0

Scrivere un file di testo semplice è più semplice della scrittura di un file di proprietà, ma non altrettanto utile a lungo termine, IMHO. –