जवाबों:
मान लें कि आप जावा का उपयोग कर रहे हैं, तो आप कर सकते हैं
.properties
अपनी src/main/resources
निर्देशिका में ( आमतौर पर) एक फ़ाइल बनाएं (लेकिन चरण 4 में आप इसे कहीं और देखने के लिए कह सकते हैं)।
.properties
परियोजना संस्करण के लिए मानक मावेन संपत्ति का उपयोग करके अपनी फ़ाइल में कुछ संपत्ति का मूल्य निर्धारित करें : foo.bar=${project.version}
अपने जावा कोड में, गुणों की फ़ाइल को classpath से संसाधन के रूप में लोड करें (यह कैसे करना है इसके प्रचुर उदाहरण के लिए Google, लेकिन यहां शुरुआत के लिए एक उदाहरण है )।
मावेन में, संसाधन फ़िल्टरिंग सक्षम करें - इससे मावेन उस फ़ाइल को आपकी आउटपुट कक्षाओं में कॉपी कर देगा और उस कॉपी के दौरान संसाधन का अनुवाद कर सकता है, संपत्ति की व्याख्या करेगा। आप यहाँ कुछ जानकारी पा सकते हैं, लेकिन आप ज्यादातर अपने पोम में ऐसा करते हैं:
<निर्माण> <संसाधनों> <संसाधन> <निर्देशिका> src / मुख्य / संसाधनों </ निर्देशिका> <छानने> सच </ छानने> </ संसाधन> </ संसाधनों> </ निर्माण>
आप अन्य मानक गुणों को भी प्राप्त कर सकते हैं project.name
, जैसे project.description
कि, या यहां तक कि मनमानी गुण जो आप अपने पोम में डालते हैं <properties>
, आदि। संसाधन फ़िल्टरिंग, मावेन प्रोफाइल के साथ मिलकर, आप बिल्ड समय पर परिवर्तनशील निर्माण व्यवहार दे सकते हैं। जब आप रनटाइम के साथ एक प्रोफ़ाइल निर्दिष्ट करते हैं -PmyProfile
, तो यह उन गुणों को सक्षम कर सकता है जो आपके निर्माण में दिखाई दे सकते हैं।
src/main/resources
, क्योंकि यह इस निर्देशिका में स्थित सभी फ़ाइलों को संसाधित कर सकता है, जिसमें बायनेरी फाइलें भी शामिल हैं। अप्रत्याशित व्यवहार से बचने के लिए, एक src/main/resources-filtered
निर्देशिका पर फ़िल्टरिंग करना बेहतर है , जैसा कि यहां सुझाया गया है । वैसे भी, इस अच्छी चाल के लिए धन्यवाद!
स्वीकृत उत्तर किसी एप्लिकेशन में संस्करण संख्या को सांख्यिकीय रूप से प्राप्त करने के लिए सबसे अच्छा और सबसे स्थिर तरीका हो सकता है , लेकिन वास्तव में मूल प्रश्न का उत्तर नहीं देता है: pom.xml से विरूपण साक्ष्य के संस्करण संख्या को कैसे पुनः प्राप्त करें? इस प्रकार, मैं एक विकल्प दिखाना चाहता हूं कि यह रनटाइम के दौरान गतिशील रूप से कैसे किया जाए :
आप मावेन का उपयोग कर सकते हैं। अधिक सटीक होने के लिए, आप मावेन लाइब्रेरी का उपयोग कर सकते हैं।
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
और फिर जावा में ऐसा कुछ करें:
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());
}
}
कंसोल लॉग निम्नानुसार है:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
अपडेट 2017-10-31: साइमन सोबिश के अनुवर्ती प्रश्न का उत्तर देने के लिए मैंने इस तरह के उदाहरण को संशोधित किया:
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
डी जार से शुरू नहीं होता है (निर्भरता कक्षाएं एकीकृत नहीं होती हैं) और मावेन-असेंबली-प्लगइन के साथ पैक किए जाने पर काम नहीं करता है जो jar-with-dependencies
मुझे मिलता है। a java.io.FileNotFoundException: pom.xml
(यह अंतिम जार में है के रूप में META-INF/maven/my.package/myapp/pom.xml
) - किसी भी संकेत इसे हल करने के लिए कैसे?
पैकेज्ड कलाकृतियों में एक META-INF/maven/${groupId}/${artifactId}/pom.properties
फाइल होती है जो सामग्री की तरह दिखाई देती है:
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
कई एप्लिकेशन रनटाइम पर एप्लिकेशन / जार संस्करण को पढ़ने के लिए इस फाइल का उपयोग करते हैं, इसके लिए शून्य सेटअप की आवश्यकता होती है।
उपरोक्त दृष्टिकोण के साथ एकमात्र समस्या यह है कि यह फ़ाइल (वर्तमान में) package
चरण के दौरान उत्पन्न होती है और इस प्रकार परीक्षण के दौरान मौजूद नहीं होगी, आदि (इसे बदलने के लिए एक जीरा मुद्दा है, MJAR-76 देखें )। यदि यह आपके लिए एक मुद्दा है, तो एलेक्स द्वारा वर्णित दृष्टिकोण जाने का रास्ता है।
मावेन का उपयोग करके अपने एप्लिकेशन संस्करण संख्या को प्रदर्शित करने के लिए आसान तरीके से वर्णित विधि भी है :
इसे 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>
तो इस का उपयोग करें:
App.class.getPackage().getImplementationVersion()
मुझे यह विधि सरल लग रही है।
getImplementationVersion()
था null
। (मावेन संस्करण 3.0.4)
.war
कलाकृतियों, उपयोग करने के लिए याद maven-war-plugin
करने के बजायmaven-jar-plugin
getImplementationVersion()
रिटर्न शून्य) में काम नहीं करता है ।
यदि आप जार या युद्ध जैसे mvan पैकेजिंग का उपयोग करते हैं, तो उपयोग करें:
getClass().getPackage().getImplementationVersion()
यह संग्रह में उत्पन्न META-INF / MANIFEST.MF (जो pom.xml के संस्करण पर सेट है) का एक गुण "कार्यान्वयन-संस्करण" पढ़ता है।
@Kieste ने जो पोस्ट किया है, उसे पूरक करने के लिए, जो मुझे लगता है कि आपके कोड में Maven बिल्ड informations उपलब्ध होने का सबसे अच्छा तरीका है यदि आप स्प्रिंग-बूट का उपयोग कर रहे हैं: http://docs.spring.io/spring-boot/ पर प्रलेखन डॉक्स / वर्तमान / संदर्भ / htmlsingle / # उत्पादन-तैयार-अनुप्रयोग-जानकारी बहुत उपयोगी है।
आपको बस एक्ट्यूएटर्स को सक्रिय करने, और उन गुणों को जोड़ने की ज़रूरत है जो आपको अपनी ज़रूरत है application.properties
याapplication.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@
एक सरल समाधान की आसानी के लिए इस लाइब्रेरी का उपयोग करें। आपको जो भी जरूरत है, उसे प्रकट करें और फिर स्ट्रिंग द्वारा क्वेरी करें।
System.out.println("JAR was created by " + Manifests.read("Created-By"));
कभी-कभी मावेन कमांड लाइन पर्याप्त होती है, जब परियोजना संस्करण से संबंधित किसी चीज़ की स्क्रिप्टिंग की जाती है, उदाहरण के लिए रिपॉजिटर्स द्वारा URL से आर्टवर्क पुनर्प्राप्ति के लिए:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
उपयोग उदाहरण:
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>
संस्करण का उपयोग करें this.getClass().getPackage().getImplementationVersion()
पुनश्च जोड़ना न भूलें:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
केटंक के उत्तर के संदर्भ में :
दुर्भाग्य से, यह जोड़ने के साथ कि मेरा आवेदन संसाधनों से कैसे निपटता है:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
लेकिन इसके अंदर मावेन-असेंबल-प्लगइन के <मैनिफ़ेस्ट> टैग का उपयोग करके इस ट्रिक को किया:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
इसलिए मैं संस्करण का उपयोग कर पाने में सक्षम था
String version = getClass().getPackage().getImplementationVersion();