Antworten:
Angenommen, Sie verwenden Java, können Sie
Erstellen Sie eine .properties
Datei in Ihrem src/main/resources
Verzeichnis (am häufigsten) (in Schritt 4 können Sie sie jedoch anweisen, woanders zu suchen).
Legen Sie den Wert einer Eigenschaft in Ihrer .properties
Datei mithilfe der Standardeigenschaft Maven für die Projektversion fest: foo.bar=${project.version}
Laden Sie in Ihrem Java-Code den Wert aus der Eigenschaftendatei als Ressource aus dem Klassenpfad (Google für zahlreiche Beispiele, aber hier ein Beispiel für den Anfang ).
Aktivieren Sie in Maven die Ressourcenfilterung. Dadurch kopiert Maven diese Datei in Ihre Ausgabeklassen und übersetzt die Ressource während dieser Kopie, wobei die Eigenschaft interpretiert wird. Sie können hier einige Informationen finden, aber Sie tun dies meistens nur in Ihrem Pom:
<build> <Ressourcen> <Ressource> <Verzeichnis> src / main / resources </ Verzeichnis> <filtering> true </ filtering> </ resource> </ resources> </ build>
Sie können auch auf andere Standardeigenschaften wie erhalten project.name
, project.description
oder auch beliebige Eigenschaften , die Sie in Ihrem pom setzen <properties>
usw. Ressourcenfilterung, mit Maven Profilen kombiniert, können Sie bei der Erstellung variabler Build Verhalten geben. Wenn Sie zur Laufzeit ein Profil mit angeben -PmyProfile
, können Eigenschaften aktiviert werden, die dann in Ihrem Build angezeigt werden können.
src/main/resources
, da hierdurch möglicherweise alle in diesem Verzeichnis befindlichen Dateien verarbeitet werden, einschließlich Binärdateien. Um unvorhersehbare Verhaltensweisen zu vermeiden, ist es besser, nach einem src/main/resources-filtered
Verzeichnis zu filtern , wie hier vorgeschlagen . Trotzdem danke für diesen schönen Trick!
Die akzeptierte Antwort ist möglicherweise der beste und stabilste Weg, um eine Versionsnummer statisch in eine Anwendung zu übernehmen , beantwortet jedoch nicht die ursprüngliche Frage: Wie kann die Versionsnummer des Artefakts aus pom.xml abgerufen werden? Daher möchte ich eine Alternative anbieten, die zeigt, wie dies zur Laufzeit dynamisch gemacht wird:
Sie können Maven selbst verwenden. Genauer gesagt können Sie eine Maven-Bibliothek verwenden.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
Und dann machen Sie so etwas in Java:
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 Application {
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());
}
}
Das Konsolenprotokoll lautet wie folgt:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
Update 31.10.2017: Um die Folgefrage von Simon Sobisch zu beantworten, habe ich das Beispiel folgendermaßen geändert:
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.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model;
if ((new File("pom.xml")).exists())
model = reader.read(new FileReader("pom.xml"));
else
model = reader.read(
new InputStreamReader(
Application.class.getResourceAsStream(
"/META-INF/maven/de.scrum-master.stackoverflow/aspectj-introduce-method/pom.xml"
)
)
);
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
package
D-JAR aus gestartet werde (Abhängigkeitsklassen sind nicht integriert) und funktioniert nicht, wenn jar-with-dependencies
ich mit dem Maven-Assembly-Plugin gepackt bin, das ich bekomme a java.io.FileNotFoundException: pom.xml
(es ist im letzten Glas als META-INF/maven/my.package/myapp/pom.xml
) - irgendwelche Hinweise, wie man das löst?
Gepackte Artefakte enthalten eine META-INF/maven/${groupId}/${artifactId}/pom.properties
Datei, deren Inhalt wie folgt aussieht:
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
Viele Anwendungen verwenden diese Datei, um die Anwendungs- / JAR-Version zur Laufzeit zu lesen. Es ist kein Setup erforderlich.
Das einzige Problem bei dem obigen Ansatz besteht darin, dass diese Datei (derzeit) während der package
Phase generiert wird und daher während Tests usw. nicht vorhanden ist (es gibt ein Jira-Problem, um dies zu ändern, siehe MJAR-76 ). Wenn dies ein Problem für Sie ist, ist der von Alex beschriebene Ansatz der richtige Weg.
Es gibt auch die unter Einfache Methode beschriebene Methode , um die Versionsnummer Ihrer Apps mit Maven anzuzeigen :
Fügen Sie dies zu pom.xml hinzu
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>test.App</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Dann benutze dies:
App.class.getPackage().getImplementationVersion()
Ich habe festgestellt, dass diese Methode einfacher ist.
getImplementationVersion()
war null
. (Maven Version 3.0.4)
.war
maven-war-plugin
maven-jar-plugin
getImplementationVersion()
gibt null zurück).
Wenn Sie MVN-Verpackungen wie Jar oder War verwenden, verwenden Sie:
getClass().getPackage().getImplementationVersion()
Es liest eine Eigenschaft "Implementation-Version" der generierten META-INF / MANIFEST.MF (die auf die Version von pom.xml festgelegt ist) im Archiv.
Als Ergänzung zu dem, was @kieste gepostet hat, ist dies meiner Meinung nach der beste Weg, um Maven-Build-Informationen in Ihrem Code verfügbar zu machen, wenn Sie Spring-boot verwenden: die Dokumentation unter http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # Production-Ready-Application-Info ist sehr nützlich.
Sie müssen nur die Aktuatoren aktivieren und die Eigenschaften hinzufügen, die Sie in Ihrem application.properties
oder benötigenapplication.yml
Automatic property expansion using Maven
You can automatically expand info properties from the Maven project using resource filtering. If you use the spring-boot-starter-parent you can then refer to your Maven ‘project properties’ via @..@ placeholders, e.g.
project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
info.build.artifact=@project.artifactId@
info.build.name=@project.name@
info.build.description=@project.description@
info.build.version=@project.version@
Verwenden Sie diese Bibliothek, um eine einfache Lösung zu vereinfachen. Fügen Sie dem Manifest alles hinzu, was Sie benötigen, und fragen Sie dann nach Zeichenfolge ab.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Manchmal reicht die Maven-Befehlszeile aus, wenn Skripte für die Projektversion erstellt werden, z. B. zum Abrufen von Artefakten über eine URL aus einem Repository:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Anwendungsbeispiel:
VERSION=$( mvn help:evaluate -Dexpression=project.version -q -DforceStdout )
ARTIFACT_ID=$( mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout )
GROUP_ID_URL=$( mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout | sed -e 's#\.#/#g' )
curl -f -S -O http://REPO-URL/mvn-repos/${GROUP_ID_URL}/${ARTIFACT_ID}/${VERSION}/${ARTIFACT_ID}-${VERSION}.jar
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Holen Sie sich die Version mit this.getClass().getPackage().getImplementationVersion()
PS Vergessen Sie nicht hinzuzufügen:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
In Bezug auf Ketankks Antwort :
Leider hat das Hinzufügen dies den Umgang meiner Anwendung mit Ressourcen durcheinander gebracht:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Aber die Verwendung dieses <manifest> -Tags im Maven-Assemble-Plugin hat den Trick getan:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
So konnte ich Version mit bekommen
String version = getClass().getPackage().getImplementationVersion();