উত্তর:
ধরে নিই যে আপনি জাভা ব্যবহার করছেন, আপনি পারবেন
.properties
আপনার src/main/resources
ডিরেক্টরিতে (সর্বাধিক সাধারণভাবে) একটি ফাইল তৈরি করুন (তবে চতুর্থ ধাপে আপনি এটি অন্য কোথাও দেখার জন্য বলতে পারেন)।
.properties
প্রকল্প সংস্করণের জন্য স্ট্যান্ডার্ড মাভেন সম্পত্তি ব্যবহার করে আপনার ফাইলে কিছু সংখ্যার সম্পত্তি সেট করুন : foo.bar=${project.version}
আপনার জাভা কোডে, শ্রেণিপথ থেকে উত্স হিসাবে সম্পত্তি বৈশিষ্ট্য ফাইলটি থেকে মানটি লোড করুন (এটি কীভাবে করা যায় তার বিশিষ্ট উদাহরণগুলির জন্য গুগল, তবে শুরুর ক্ষেত্রে এখানে উদাহরণ রয়েছে )।
মাভেনে, রিসোর্স ফিল্টারিং সক্ষম করুন - এর ফলে ম্যাভেন সেই ফাইলটি আপনার আউটপুট ক্লাসে অনুলিপি করবে এবং সেই অনুলিপিটির সময় সম্পদটির অনুবাদ করবে, সম্পত্তিটির ব্যাখ্যা করবে। আপনি এখানে কিছু তথ্য পেতে পারেন তবে আপনি বেশিরভাগই আপনার পোমে এটি করেন:
<বিল্ড> <সম্পদ> <রিসোর্স> <ডিরেক্টরির> src / প্রধান / সম্পদ </ ডিরেক্টরির> <ফিল্টারিং> সত্য </ ফিল্টারিং> </ রিসোর্স> </ সম্পদ> </ বিল্ড>
আপনি অন্যান্য স্ট্যান্ডার্ড বৈশিষ্ট্য যেমন project.name
, project.description
বা এমনকি নিজের পোমতে রেখেছেন এমন স্বেচ্ছাসেবী সম্পত্তিগুলিতেও <properties>
যেতে পারেন Ma ম্যাসেন প্রোফাইলগুলির সাথে মিলিত রিসোর্স ফিল্টারিং, আপনাকে বিল্ড টাইমের সময় পরিবর্তনশীল বিল্ড আচরণ দিতে পারে। আপনি যখন রানটাইমের সময় কোনও প্রোফাইল নির্দিষ্ট করেন -PmyProfile
, তখন এমন বৈশিষ্ট্য সক্ষম করতে পারে যা আপনার বিল্ডে প্রদর্শিত হতে পারে।
src/main/resources
, কারণ এটি বাইনারি ফাইলগুলি সহ এই ডিরেক্টরিতে অবস্থিত সমস্ত ফাইল প্রক্রিয়া করতে পারে। অপ্রত্যাশিত আচরণ এড়াতে src/main/resources-filtered
, এখানে পরামর্শ হিসাবে ডিরেক্টরিতে ফিল্টারিং করা ভাল । যাইহোক, এই দুর্দান্ত কৌশলটির জন্য আপনাকে ধন্যবাদ!
গ্রহণযোগ্য উত্তরটি স্ট্যাটিক্যালি কোনও অ্যাপ্লিকেশনটিতে সংস্করণ নম্বর পাওয়ার সেরা এবং সবচেয়ে স্থিতিশীল উপায় হতে পারে , তবে আসলে আসল প্রশ্নের উত্তর দেয় না: পম.এক্সএমএল থেকে কীভাবে শিল্পের সংস্করণ নম্বরটি পাওয়া যাবে? সুতরাং, আমি রানটাইম চলাকালীন কীভাবে এটি ডায়নামিকভাবে করতে হয় তার একটি বিকল্প প্রস্তাব দিতে চাই :
আপনি মাভেন নিজেই ব্যবহার করতে পারবেন। আরও নির্ভুল হতে, আপনি একটি ম্যাভেন লাইব্রেরি ব্যবহার করতে পারেন।
<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
আমি পেতে একটি 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
পর্বের সময় উত্পন্ন হয়েছে এবং সুতরাং পরীক্ষার সময় ইত্যাদি উপস্থিত হবে না (এটি পরিবর্তন করার জন্য জিরার সমস্যা রয়েছে, এমজেআর-76 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()
নাল ফেরায় )।
আপনি এমভিএন প্যাকেজিং যেমন জার বা যুদ্ধ ব্যবহার করেন তবে ব্যবহার করুন:
getClass().getPackage().getImplementationVersion()
এটি সংরক্ষণাগারটিতে উত্পন্ন META-INF / MANIFEST.MF (যা pom.xML এর সংস্করণে সেট করা আছে) এর একটি সম্পত্তি "বাস্তবায়ন-সংস্করণ" পড়ে।
@ কিয়েস্ট যা পোস্ট করেছে তা পরিপূর্ণ করার জন্য যা আমি মনে করি আপনি যদি স্প্রিং-বুট ব্যবহার করেন তবে ম্যাভেন আপনার কোডে তথ্য সরবরাহ করার সর্বোত্তম উপায়: ডকুমেন্টেশন http://docs.spring.io/spring-boot/ ডকস / বর্তমান / রেফারেন্স / এইচটিএমএলসিং / # প্রোডাকশন-রেডি-অ্যাপ্লিকেশন-তথ্য খুব দরকারী।
আপনাকে কেবল অ্যাকিউইউটর সক্রিয় করতে হবে এবং আপনার 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"));
প্রকল্পের সংস্করণ সম্পর্কিত কোনও কিছু স্ক্রিপ্ট করার সময় কখনও কখনও মাভেন কমান্ড লাইনই যথেষ্ট, যেমন কোনও সংগ্রহস্থল থেকে ইউআরএলের মাধ্যমে শিল্পীকরণের পুনরুদ্ধারের জন্য:
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();