Apache Maven
Uzyskaj dostęp do informacji Maven w kodzie
Szukaj…
Wprowadzenie
Czasami przydatne jest uzyskanie w kodzie właściwości maven, takich jak bieżąca wersja. Oto kilka sposobów na to.
Pobieranie numeru wersji ze słoika
Jeśli spakujesz aplikację do jar
za pomocą maven-jar-plugin
lub maven-assembly-plugin
, łatwym sposobem na uzyskanie bieżącej wersji pom jest dodanie wpisu do manifestu, który jest następnie dostępny z Java.
Sekret polega na ustawieniu flagi addDefaultImplementationEntries
na true (a addDefaultSpecificationEntries
wymaga również identyfikatora artefaktu).
Konfiguracja wtyczki jar :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>...</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
konfiguracja wtyczki montażu :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution .../>
</executions>
</plugin>
addDefaultImplementationEntries
instruuje Maven, aby dodał następujące nagłówki do addDefaultImplementationEntries
MANIFEST.MF
słoika:
Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test
Teraz możesz użyć tego wiersza kodu w dowolnym miejscu w słoiku, aby uzyskać dostęp do numeru wersji:
getClass().getPackage().getImplementationVersion()
Więcej informacji tutaj i tutaj .
Synchronizowanie pliku właściwości za pomocą mekanizmu filtrującego właściwości maven
Jak wyjaśnia ta dokumentacja ,
Czasami plik zasobów musi zawierać wartość, którą można podać tylko podczas kompilacji. Aby to zrobić w Maven, umieść odniesienie do właściwości, która będzie zawierać wartość w pliku zasobów, używając składni
${<property name>}
. Właściwość może być jedną z wartości zdefiniowanych wpom.xml
, wartością zdefiniowaną w plikusettings.xml
użytkownika, właściwością zdefiniowaną w zewnętrznym pliku właściwości lub właściwością systemową.
Jako przykład, stwórzmy prosty info.txt
w src/main/resources
zawierający wersję pom i czas kompilacji.
utwórz plik
src/main/resources/info.txt
o następującej treści:version = $ {pom.version} build.date = $ {timestamp}
poproś Maven o rozwinięcie właściwości poprzez ustawienie
filtering
na true:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
dzięki temu wersja zostanie zaktualizowana, ale niestety błąd w Maven uniemożliwia przekazanie właściwości
${maven.build.timestamp}
do mechanizmu filtrowania zasobów (więcej informacji tutaj ). Utwórzmy więc właściwośćtimestamp
jako obejście! Dodaj następujące właściwości do właściwości pom:<properties> <timestamp>${maven.build.timestamp}</timestamp> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format> </properties>
uruchom maven, powinieneś znaleźć
info.txt
wtarget/classes
info.txt
o treści takiej jak:version=0.3.2 build.date=2017-04-20T13:56
Czytanie pliku pom.xml w czasie wykonywania przy użyciu wtyczki maven-model
Inne przykłady mogą być najlepszym i najbardziej stabilnym sposobem na statyczne wprowadzenie numeru wersji do aplikacji. Ta odpowiedź proponuje alternatywne pokazanie, jak to zrobić dynamicznie w czasie wykonywania, przy użyciu biblioteki maven-model .
Dodaj zależność:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
W Javie utwórz MavenXpp3Reader
aby odczytać swój pom. Na przykład:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.FileReader;
import java.io.IOException;
public class MavenModelExample {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(new FileReader("pom.xml"));
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
Dziennik konsoli wygląda następująco:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT