কোডে maven pom.xML থেকে সংস্করণটি পুনরুদ্ধার করুন


255

কোডে ম্যাভেনের pom.xML থেকে সংস্করণ নম্বর পুনরুদ্ধারের সহজ উপায় কী, অর্থাত্ প্রোগ্রামক্রমে?

উত্তর:


262

ধরে নিই যে আপনি জাভা ব্যবহার করছেন, আপনি পারবেন

  1. .propertiesআপনার src/main/resourcesডিরেক্টরিতে (সর্বাধিক সাধারণভাবে) একটি ফাইল তৈরি করুন (তবে চতুর্থ ধাপে আপনি এটি অন্য কোথাও দেখার জন্য বলতে পারেন)।

  2. .propertiesপ্রকল্প সংস্করণের জন্য স্ট্যান্ডার্ড মাভেন সম্পত্তি ব্যবহার করে আপনার ফাইলে কিছু সংখ্যার সম্পত্তি সেট করুন : foo.bar=${project.version}

  3. আপনার জাভা কোডে, শ্রেণিপথ থেকে উত্স হিসাবে সম্পত্তি বৈশিষ্ট্য ফাইলটি থেকে মানটি লোড করুন (এটি কীভাবে করা যায় তার বিশিষ্ট উদাহরণগুলির জন্য গুগল, তবে শুরুর ক্ষেত্রে এখানে উদাহরণ রয়েছে )।

  4. মাভেনে, রিসোর্স ফিল্টারিং সক্ষম করুন - এর ফলে ম্যাভেন সেই ফাইলটি আপনার আউটপুট ক্লাসে অনুলিপি করবে এবং সেই অনুলিপিটির সময় সম্পদটির অনুবাদ করবে, সম্পত্তিটির ব্যাখ্যা করবে। আপনি এখানে কিছু তথ্য পেতে পারেন তবে আপনি বেশিরভাগই আপনার পোমে এটি করেন:

    <বিল্ড>
      <সম্পদ>
        <রিসোর্স>
          <ডিরেক্টরির> src / প্রধান / সম্পদ </ ডিরেক্টরির>
          <ফিল্টারিং> সত্য </ ফিল্টারিং>
        </ রিসোর্স>
      </ সম্পদ>   
    </ বিল্ড>

আপনি অন্যান্য স্ট্যান্ডার্ড বৈশিষ্ট্য যেমন project.name, project.descriptionবা এমনকি নিজের পোমতে রেখেছেন এমন স্বেচ্ছাসেবী সম্পত্তিগুলিতেও <properties>যেতে পারেন Ma ম্যাসেন প্রোফাইলগুলির সাথে মিলিত রিসোর্স ফিল্টারিং, আপনাকে বিল্ড টাইমের সময় পরিবর্তনশীল বিল্ড আচরণ দিতে পারে। আপনি যখন রানটাইমের সময় কোনও প্রোফাইল নির্দিষ্ট করেন -PmyProfile, তখন এমন বৈশিষ্ট্য সক্ষম করতে পারে যা আপনার বিল্ডে প্রদর্শিত হতে পারে।


2
আমি একটি কোড পাওয়া এই কোনো পরিবর্তন ম্যাভেন কনফিগ।
ওয়েন্ডেল

7
সরাসরি ফিল্টারিং ব্যবহার থেকে সাবধান থাকুন src/main/resources, কারণ এটি বাইনারি ফাইলগুলি সহ এই ডিরেক্টরিতে অবস্থিত সমস্ত ফাইল প্রক্রিয়া করতে পারে। অপ্রত্যাশিত আচরণ এড়াতে src/main/resources-filtered, এখানে পরামর্শ হিসাবে ডিরেক্টরিতে ফিল্টারিং করা ভাল । যাইহোক, এই দুর্দান্ত কৌশলটির জন্য আপনাকে ধন্যবাদ!
সিজিওস

1
আসল মডেলটি পাওয়ার জন্য মাভেনএক্সপিআরপিডার ব্যবহার করে নীচের উত্তরটি সত্যই দরকারী, কারণ এটির সন্ধানের জন্য কোনও চালানোর দরকার নেই। যে কোনও ক্ষেত্রে চালনার আগে আপনাকে সংস্করণটি জানতে হবে, নীচের উত্তরগুলি দেখুন; গ্রেডকে চেক আউট মাভেন প্রকল্পটির কোন সংস্করণ রয়েছে তা জানাতে আমার পক্ষে খুব সহায়ক হয়েছিল, তাই আউটপুট জারের অবস্থান আগেই জানতে পারতাম।
আজাক্স

92

গ্রহণযোগ্য উত্তরটি স্ট্যাটিক্যালি কোনও অ্যাপ্লিকেশনটিতে সংস্করণ নম্বর পাওয়ার সেরা এবং সবচেয়ে স্থিতিশীল উপায় হতে পারে , তবে আসলে আসল প্রশ্নের উত্তর দেয় না: পম.এক্সএমএল থেকে কীভাবে শিল্পের সংস্করণ নম্বরটি পাওয়া যাবে? সুতরাং, আমি রানটাইম চলাকালীন কীভাবে এটি ডায়নামিকভাবে করতে হয় তার একটি বিকল্প প্রস্তাব দিতে চাই :

আপনি মাভেন নিজেই ব্যবহার করতে পারবেন। আরও নির্ভুল হতে, আপনি একটি ম্যাভেন লাইব্রেরি ব্যবহার করতে পারেন।

<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());
  }
}

1
এই আমি কি ব্যবহার করতে মতো প্রায় একই এবং কাজ করে জরিমানা যখন অন্ধকার থেকে শুরু, কিন্তু স্বাভাবিক থেকে শুরু করে না packageঘ বয়াম (নির্ভরতা শ্রেণীর ইন্টিগ্রেটেড হয় না) এবং কাজ করে না যখন ম্যাভেন-সমাবেশ-প্লাগইন প্যাকেজ jar-with-dependenciesআমি পেতে একটি java.io.FileNotFoundException: pom.xml(এটি চূড়ান্ত জারে হিসাবে রয়েছে META-INF/maven/my.package/myapp/pom.xml) - কোনও সমাধান কীভাবে এটি সমাধান করবেন?
সাইমন সোবিচ

1
আমার সমাধানটি বিকাশের পরিবেশগুলিতে গতিশীল কাজ করা, যেমন আইডিই বা কনসোল থেকে শুরু হওয়া টেস্ট বা সরঞ্জামগুলিতে ব্যবহৃত হয়। এই প্রশ্নের স্বীকৃত উত্তরটি আপনার নিদর্শনগুলিতে স্ট্যাটিক্যালি সংস্করণ নম্বরটি প্যাকেজ করার বিভিন্ন উপায় দেখায়। আমি ধরে নিচ্ছিলাম না যে pom.xML জার্সের মধ্যে পাওয়া যাবে all আপনার জন্য খুব ভালো লাগছে যে আপনার কাছে এটি আছে। ফাইল রিডার খোলার সময় হয়ত আপনি পথটি সামঞ্জস্য করতে পারেন এবং এটি ক্লাসলোডার পরিস্থিতির উপর নির্ভরশীল করে তুলতে পারেন। আমাকে নিজের জন্য চেষ্টা করতে হবে। এটি যদি সহায়তা না করে তবে ফ্রি-আপ প্রশ্ন জিজ্ঞাসা করতে নির্দ্বিধায়।
ক্রিগেক্স 6

2
হাই @ সিমোনসবিশ, আমি আপনার উত্তরটি আপডেট করেছি যাতে আপনি কী চান তা আপনাকে প্রদর্শন করতে পারেন। তবে দয়া করে এই বিষয়টি সম্পর্কে সচেতন থাকুন যে আমি কেবল তাড়াতাড়ি এবং নোংরা কাজ করেছি, আমি বিশেষভাবে নেস্টেড কনস্ট্রাক্টরগুলির সাথে কোডটি পছন্দ করি না।
ক্রেইগেক্স

75

প্যাকেজড আর্টফ্যাক্টসগুলিতে এমন একটি 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 দেখুন )। যদি এটি আপনার পক্ষে কোনও সমস্যা হয় তবে অ্যালেক্সের দ্বারা বর্ণিত পদ্ধতির পথটিই।


10
বৈশিষ্ট্যগুলি পড়ার উদাহরণ খুঁজছেন এমন লোকদের জন্য, এই পোস্টটি বেশ কয়েকটি পদ্ধতির উপর দিয়ে যায় - javablog.fr/…
ক্রিসমার্ক

43

মাভেন ব্যবহার করে আপনার অ্যাপ্লিকেশন সংস্করণ নম্বর প্রদর্শন করার সহজ পদ্ধতিতে বর্ণিত পদ্ধতিটিও রয়েছে :

এটি 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()

আমি এই পদ্ধতিটি সহজ বলে খুঁজে পেয়েছি।


18
-1 - এই সমাধানটি আমার পক্ষে কার্যকর হয়নি; মান getImplementationVersion()ছিল null। (মার্ভেন সংস্করণ 3.0.4)
জেসি ওয়েব

7
পর্যায়ের উপর নির্ভর করে ... কেবলমাত্র যখন নিদর্শনগুলি প্যাকেজ করা হচ্ছে তখন কাজ করে, তাই ইউনিট পরীক্ষায় কাজ করে না: - /
উইকিয়ের

2
জন্য .warনিদর্শন, ব্যবহার করা মনে রাখবেন maven-war-pluginপরিবর্তেmaven-jar-plugin
cs_pupil

আমার জন্য, এটি টমক্যাট 8 এ কাজ করে, তবে টমক্যাট 7 এ কাজ করে না ( getImplementationVersion()নাল ফেরায় )।
আলফোনসো নিশিকাওয়া

18

আপনি এমভিএন প্যাকেজিং যেমন জার বা যুদ্ধ ব্যবহার করেন তবে ব্যবহার করুন:

getClass().getPackage().getImplementationVersion()

এটি সংরক্ষণাগারটিতে উত্পন্ন META-INF / MANIFEST.MF (যা pom.xML এর সংস্করণে সেট করা আছে) এর একটি সম্পত্তি "বাস্তবায়ন-সংস্করণ" পড়ে।


18

@ কিয়েস্ট যা পোস্ট করেছে তা পরিপূর্ণ করার জন্য যা আমি মনে করি আপনি যদি স্প্রিং-বুট ব্যবহার করেন তবে ম্যাভেন আপনার কোডে তথ্য সরবরাহ করার সর্বোত্তম উপায়: ডকুমেন্টেশন 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@

6

একটি সহজ সমাধানের স্বাচ্ছন্দ্যের জন্য এই লাইব্রেরিটি ব্যবহার করুন। আপনার যা যা প্রয়োজন তা ম্যানিফেস্টে যুক্ত করুন এবং তারপরে স্ট্রিংয়ের মাধ্যমে কোয়েরি করুন।

 System.out.println("JAR was created by " + Manifests.read("Created-By"));

http://manifests.jcabi.com/index.html


3

প্রকল্পের সংস্করণ সম্পর্কিত কোনও কিছু স্ক্রিপ্ট করার সময় কখনও কখনও মাভেন কমান্ড লাইনই যথেষ্ট, যেমন কোনও সংগ্রহস্থল থেকে ইউআরএলের মাধ্যমে শিল্পীকরণের পুনরুদ্ধারের জন্য:

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

1
    <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>

0

কেট্যাঙ্কের উত্তরের প্রসঙ্গে :

দুর্ভাগ্যক্রমে, আমার অ্যাপ্লিকেশন কীভাবে সম্পদের সাথে লেনদেন করেছে তাতে এটিকে বিভ্রান্ত করা যুক্ত:

<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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.