Jawaban:
Dengan asumsi Anda menggunakan Java, Anda bisa
Buat .properties
file di (paling umum) src/main/resources
direktori Anda (tetapi pada langkah 4 Anda bisa mengatakannya untuk mencari di tempat lain).
Tetapkan nilai beberapa properti dalam .properties
file Anda menggunakan properti Maven standar untuk versi proyek: foo.bar=${project.version}
Dalam kode Java Anda, muat nilai dari file properti sebagai sumber daya dari classpath (google untuk contoh berlebihan tentang bagaimana melakukan ini, tapi di sini adalah contoh untuk pemula ).
Di Maven, aktifkan pemfilteran sumber daya - ini akan menyebabkan Maven menyalin file itu ke kelas output Anda dan menerjemahkan sumber daya selama salinan itu, menafsirkan properti. Anda dapat menemukan beberapa info di sini tetapi kebanyakan Anda hanya melakukan ini di pom Anda:
<bangun> <resources> <resource> <directory> src / main / resources </directory> <filtering> true </filtering> </resource> </resources> </build>
Anda juga bisa mendapatkan properti standar lain seperti project.name
,, project.description
atau bahkan properti sewenang-wenang yang Anda masukkan ke dalam pom <properties>
, dll. Pemfilteran sumber daya, dikombinasikan dengan profil Maven, dapat memberi Anda perilaku membangun variabel saat membangun. Saat Anda menentukan profil saat runtime dengan -PmyProfile
, itu dapat mengaktifkan properti yang kemudian dapat muncul di build Anda.
src/main/resources
, karena ini dapat memproses semua file yang terletak di direktori ini, termasuk file binari. Untuk menghindari perilaku tak terduga, lebih baik lakukan pemfilteran pada src/main/resources-filtered
direktori, seperti yang disarankan di sini . Bagaimanapun, terima kasih atas trik yang bagus ini!
Jawaban yang diterima mungkin merupakan cara terbaik dan paling stabil untuk memasukkan nomor versi ke aplikasi secara statis , tetapi tidak benar-benar menjawab pertanyaan awal: Bagaimana cara mengambil nomor versi artifact dari pom.xml? Jadi, saya ingin menawarkan alternatif yang menunjukkan bagaimana melakukannya secara dinamis selama runtime:
Anda bisa menggunakan Maven itu sendiri. Untuk lebih tepatnya, Anda bisa menggunakan perpustakaan Maven.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
Dan kemudian lakukan sesuatu seperti ini di Jawa:
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());
}
}
Log konsol adalah sebagai berikut:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
Pembaruan 2017-10-31: Untuk menjawab pertanyaan tindak lanjut Simon Sobisch saya memodifikasi contoh seperti ini:
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
tabung normal (kelas dependensi tidak terintegrasi) dan tidak berfungsi ketika dikemas dengan maven-assembly-plugin yang jar-with-dependencies
saya dapatkan a java.io.FileNotFoundException: pom.xml
(ada di dalam guci terakhir sebagai META-INF/maven/my.package/myapp/pom.xml
) - ada petunjuk bagaimana mengatasi ini?
Artefak terpaket berisi META-INF/maven/${groupId}/${artifactId}/pom.properties
file yang kontennya seperti:
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
Banyak aplikasi menggunakan file ini untuk membaca versi aplikasi / jar saat runtime, tidak ada pengaturan yang diperlukan.
Satu-satunya masalah dengan pendekatan di atas adalah bahwa file ini (saat ini) dihasilkan selama package
fase dan dengan demikian tidak akan ada selama tes, dll (ada masalah Jira untuk mengubah ini, lihat MJAR-76 ). Jika ini merupakan masalah bagi Anda, maka pendekatan yang dijelaskan oleh Alex adalah cara yang harus dilakukan.
Ada juga metode yang dijelaskan dalam Cara mudah untuk menampilkan nomor versi aplikasi Anda menggunakan Maven :
Tambahkan ini ke pom.xml
<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>
Kemudian gunakan ini:
App.class.getPackage().getImplementationVersion()
Saya menemukan metode ini lebih sederhana.
getImplementationVersion()
itu null
. (maven versi 3.0.4)
.war
artefak, ingat untuk menggunakan maven-war-plugin
bukannyamaven-jar-plugin
getImplementationVersion()
mengembalikan nol).
Jika Anda menggunakan kemasan mvn seperti stoples atau perang, gunakan:
getClass().getPackage().getImplementationVersion()
Bunyinya properti "Versi Implementasi" dari META-INF / MANIFEST.MF yang dihasilkan (yang disetel ke versi pom.xml) dalam arsip.
Untuk melengkapi apa yang telah diposting @kieste, yang menurut saya merupakan cara terbaik untuk membuat Maven membangun informasi yang tersedia dalam kode Anda jika Anda menggunakan Spring-boot: dokumentasi di http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # production-ready-application-info sangat berguna.
Anda hanya perlu mengaktifkan aktuator, dan menambahkan properti yang Anda butuhkan di application.properties
atauapplication.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@
Gunakan Perpustakaan ini untuk kemudahan solusi sederhana. Tambahkan ke manifes apa pun yang Anda butuhkan lalu kueri dengan string.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Kadang-kadang baris perintah Maven cukup ketika menulis sesuatu yang berkaitan dengan versi proyek, misalnya untuk pengambilan artifak melalui URL dari repositori:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Contoh penggunaan:
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>
Dapatkan Versi menggunakan this.getClass().getPackage().getImplementationVersion()
PS Jangan lupa menambahkan:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
Dengan mengacu pada jawaban ketankk :
Sayangnya, menambahkan ini mengacaukan bagaimana aplikasi saya menangani sumber daya:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Tetapi dengan menggunakan tag <manifest> maven-assemble-plugin ini berhasil:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
Jadi saya bisa mendapatkan versi menggunakan
String version = getClass().getPackage().getImplementationVersion();