2016-06-05 12 views
7

Standardmäßig haben alle Java-Projekte von Gradle eine version-Eigenschaft. Normalerweise sieht das so etwas wie:Gradle: Build-Version für Java verfügbar machen

allprojects { 
    apply plugin: 'java' 
    // ... 

    // configure the group and version for this project 
    group = 'org.example' 
    version = '0.2-SNAPSHOT' 
} 

Gibt es eine Möglichkeit, das „Version“ Eigentum hier zu dem integrierten Java-Code definiert zu machen? Was ich möchte, ist eine Klasse haben, wie dies im Projekt:

public class BuildVersion { 

    public static String getBuildVersion(){ 
     return // ... what was configured in gradle when project was built 
    } 

} 

Ich kann mir vorstellen, dass dies durch eine Art von Quellcode Generation getan werden könnte. Oder indem Sie die Variable in eine Art Konfigurationsdatei in src/main/resources schreiben lassen. Gibt es einen "Standard" (d. H. Allgemein akzeptierten) Weg, dies in Gradle zu tun?

Antwort

20

Angenommen, Ihre Gradle Skript die version in das Glas fügt manifestiert richtig, wie here gezeigt:

version = '1.0' 
jar { 
    manifest { 
     attributes 'Implementation-Title': 'Gradle Quickstart', 
        'Implementation-Version': version 
    } 
} 

Ihr Code in der Lage sein wird, die Version von dieser jar-Manifest-Datei zu holen:

public class BuildVersion { 

    public static String getBuildVersion(){ 
     return BuildVersion.class.getPackage().getImplementationVersion(); 
    } 

} 

Alternativ können Sie eine Gradle-Task zum Erstellen einer Eigenschaftendatei mit der darin enthaltenen Version schreiben und diese generierte Eigenschaftendatei in die JAR-Datei einschließen und dann unter Verwendung von getResouceAsStream() darauf zugreifen.

Sie könnten natürlich auch die BuildVersion.java Datei von einem Gradle-Task mit der direkt als String-Literal eingebetteten Version generieren und sicherstellen, dass der Task vor der compile-Task ausgeführt wird.

Aber ich würde vorschlagen, nur die Versionsnummer zu verwenden, die Sie bereits enthalten (Manifest-Datei), die volle Unterstützung von Gradle zum Schreiben und Java Runtime zum Lesen hat, ohne benutzerdefinierte Gradle Task oder Java Datei lesen.

+0

Danke für die ausführliche Antwort, das ist wirklich gut zu wissen! – Alan47

+1

Stellen Sie sicher, dass sich das Paket nur in einem einzigen Glas befindet: https://stackoverflow.com/questions/38204059/how-to-obtain-a-package-version-from-the-jars-manifest-using-the-getimplementa/ 47442055 # 47442055 – Tom

Verwandte Themen