ম্যাভেন প্রকল্পের সংস্করণ উত্তরাধিকার - আমার কি পিতামাতার সংস্করণটি নির্দিষ্ট করতে হবে?


188

আমার দুটি প্রকল্প রয়েছে: মূল প্রকল্প: এ, সাব প্রকল্প: বি

এ / pom.xml:

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>

এবং বি / পম.এক্সএমএল-তে আমার কাছে রয়েছে:

    <parent>
        <groupId>com.dummy.bla</groupId>
        <artifactId>parent</artifactId>
        <version>0.1-SNAPSHOT</version>     
    </parent>

    <groupId>com.dummy.bla.sub</groupId>
    <artifactId>kid</artifactId>

আমি চাই অভিভাবকের কাছ থেকে সংস্করণটি উত্তরাধিকার সূত্রে প্রাপ্ত, সুতরাং আমার ক্ষেত্রে কেবলমাত্র আমার অবস্থান করা 0.1-SNAPSHOTউচিত A/pom.xml। তবে আমি যদি পিতামাতার বিভাগের অধীনে <version>0.1-SNAPSHOT</version>থেকে অপসারণ করি তবে B/pom.xmlমাভেন পিতামাতার জন্য অনুপস্থিত সংস্করণ সম্পর্কে অভিযোগ করেন।

উভয় পোমে ${project.version}থাকা এড়াতে আমি কি কোনও উপায় ব্যবহার করতে পারি বা এই জাতীয় কিছু ব্যবহার করতে পারি 01.-SNAPSHOT?


4
এর জন্য আপনাকে ম্যাভেন 3.1 এর জন্য অপেক্ষা করতে হবে, আমি ভয় পাচ্ছি।
অনুভূতি



1
উপরের লিঙ্কটি সরানো হয়েছে। অন্তিম অবস্থা ছিল "বন্ধ / ঠিক হবে না" issues.apache.org/jira/browse/MNG-624
jocull

উত্তর:


86

সম্পাদনা করুন: ম্যাভেন ৩.০.০ থেকে ${revision}স্থানধারক ব্যবহার করে এটির জন্য একটি দুর্দান্ত সমাধান রয়েছে । বিশদ জন্য ফ্রাভাবের উত্তর দেখুন । পূর্ববর্তী মাভেন সংস্করণগুলির জন্য নীচে আমার মূল উত্তরটি দেখুন।


না, নেই। আপনাকে সর্বদা পিতামাতার সংস্করণ নির্দিষ্ট করতে হবে। ভাগ্যক্রমে, এটি মডিউলের সংস্করণ হিসাবে উত্তরাধিকার সূত্রে প্রাপ্ত যা বেশিরভাগ ক্ষেত্রেই কাম্য। তদুপরি, এই পিতামাতার সংস্করণ ঘোষণাটি মাভেন রিলিজ প্লাগইন দ্বারা স্বয়ংক্রিয়ভাবে চূর্ণ হয়ে যায়, সুতরাং - বাস্তবে - আপনি যতক্ষণ না ভার্শন রিলিজ বা কেবল বাম্পিংয়ের জন্য মাভেন রিলিজ প্লাগিন ব্যবহার করেন ততক্ষণ আপনি 2 জায়গায় সংস্করণ রাখবেন এমন কোনও সমস্যা নয়।

লক্ষ্য করুন যে কিছু ক্ষেত্রে রয়েছে যখন এই আচরণটি আসলে বেশ ঠিক থাকে এবং আপনার প্রয়োজন হতে পারে আরও নমনীয়তা দেয়। কখনও কখনও আপনি পূর্ববর্তী পিতামাতার কিছু সংস্করণ উত্তরাধিকারী হিসাবে ব্যবহার করতে চান তবে এটি মূলধারার কেস নয়।


3
নওডিস আপনি এর ${revision}জন্য স্থানধারকটি ব্যবহার করতে পারেন । আমার উত্তরটি দেখুন ;-)
ফ্রিভাবি

2
এটি এখন পুরনো হয়ে গেছে - চেক @ FrVaBe এর উত্তর এখানে: stackoverflow.com/a/51969067/514483
robd

@ ফ্রভবা যদি আমরা বিভিন্ন সংস্করণে বাবা-মাকে বাসা বেঁধে রাখি তবে কী হবে? আমরা সেখানে একটি "পুনর্বিবেচনা" সম্পত্তি ব্যবহার করতে পারি না, এটি যথেষ্ট নয়।
হালিল

@ হালিল প্রশ্নটি দুটি শিল্পকর্মে একই সংস্করণ রাখার লক্ষ্য সহ পিতামাতার কাছ থেকে কোনও সংস্করণ উত্তরাধিকার সূত্রে হয়। আপনার যদি বিভিন্ন সংস্করণ (উত্তরাধিকারের শ্রেণিবিন্যাসে) এর সাথে আলাদা আলাদা বাবা-মা থাকে তবে আপনি সম্ভবত তাদের সমস্ত সংস্করণ তৈরি করতে পারবেন না। আমি মন্তব্য সম্পূর্ণ বুঝতে পারি না।
FrVaBe

86

মাভেনকে সেভাবে কাজ করার জন্য ডিজাইন করা হয়নি, তবে এই লক্ষ্য অর্জনের জন্য একটি কার্যতালিকা বিদ্যমান রয়েছে (পার্শ্ব প্রতিক্রিয়া সহ, আপনাকে চেষ্টা করে দেখতে হবে)। কৌতুকটি হ'ল শিশু প্রকল্পটিকে তার খাঁটি মেভেন স্থানাঙ্কের চেয়ে তার তুলনামূলক পথে তার পিতামাতাকে সন্ধান করতে বলা এবং কোনও সংখ্যার সংস্করণ নম্বরটি বহিরাগত করার পাশাপাশি:

পিতামাতা পোম

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>

<properties>
   <!-- Unique entry point for version number management --> 
   <global.version>0.1-SNAPSHOT</global.version>
</properties>

চাইল্ড পোম

<parent>
   <groupId>com.dummy.bla</groupId>
   <artifactId>parent</artifactId>
   <version>${global.version}</version>
   <relativePath>..</relativePath>    
</parent>

<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>

আমি এই কৌশলটি কিছু সময়ের জন্য আমার প্রকল্পের জন্য ব্যবহার করেছি, কোনও নির্দিষ্ট সমস্যা ছাড়াই, মাভেন বিল্ডের শুরুতে প্রচুর সতর্কতা লগ করে ফেলেছিল, যা খুব মার্জিত নয়।

সম্পাদনা

মনে হয় maven 3.0.4 আর এই ধরনের কনফিগারেশন অনুমতি দেয় না।


2
হ্যাঁ, আমি আশঙ্কা করছি যে মাভেনগুলি সেভাবে কাজ করার জন্য নকশাকৃত নয়, কেবলমাত্র উপ pom.xML এ সংস্করণগুলি রেখে দেওয়া stick ম্যাভেন রিলিজ প্লাগইন যেভাবেই হোক না কেন সেখানে সংস্করণগুলি সম্পর্কে সত্যিই চিন্তা করে।
শেঞ্জজি

7
3.0.5 এর জন্য ঠিক আছে। যদিও আপনাকে অবশ্যই শীর্ষে রাখা উচিত p
ses

7
এটি 3.2.3 এ কাজ করে। <poperties> এর অবস্থানটি কোনও ব্যাপার নয়। আপনি যদিও একটি সতর্কতা পাবেন:'version' contains an expression but should be a constant.
কেপেক্স

4
দয়া করে, এই সম্পর্কে সতর্কতা অবলম্বন করুন। আপনার প্রকল্পটি যখন অন্য কোনও প্রকল্পের দ্বারা রেফারেন্স করা হয় তখন এটি কাজ করে না। সম্পত্তিটির সমাধান হবে না এবং আক্ষরিকভাবে চিকিত্সা করা হবে (যেমন $ {my.version})। নির্ভরতাগুলি সমাধান করার সময় এটি ব্যর্থতার দিকে পরিচালিত করবে।
স্পেকড্রাম

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

80

আইএমও সংস্করণ আপডেট করার সহজ উপায়:

$ mvn versions:set -DgenerateBackupPoms=false

(আপনার মূল / প্যারেন্ট পম ফোল্ডারে এটি করুন)।

আপনার পিওএমগুলি পার্স করা হয়েছে এবং আপনাকে কোন সংস্করণটি সেট করতে বলা হবে।


17
ইন্টারঅ্যাকটিভভাবে প্রবেশ এড়াতে আপনি -DnewVersion = {versionToBeUpdated add যুক্ত করতে পারেন।
মুকেশ

1
আমি মনে করি এটি সেরা উত্তর, এটি সাবপ্রজেক্টগুলি না ভেঙে সংস্করণে পরিবর্তনগুলি স্বয়ংক্রিয় করে তোলে (যা আপনি প্যারেন্ট পোম ছাড়াই উল্লেখ করতে সক্ষম হবেন না)।
তারেক

হা! এই উত্তর। 🙌
এএইজেজা

চাইল্ড এবং প্যারেন্ট পম সংস্করণ যদি প্রাথমিকভাবে আলাদা হয় তবে প্রথমে সেগুলি মেলানোর জন্য আপডেট করুন, mvn versions:update-child-modules অন্যথায় সমস্ত চাইল্ড মডিউল পম সংস্করণ বাদ দেওয়া হবে।
গৌতম তাদিগপপুলা

74

ম্যাভেন ৩.০.০ থেকে আপনি তার জন্য ${revision}স্থানধারক ব্যবহার করতে পারেন । ব্যবহারটি এখানে নথিভুক্ত করা হয়েছে: ম্যাভেন সিআই ফ্রেন্ডলি ভার্সন

সংক্ষেপে প্যারেন্ট পম দেখতে দেখতে (অ্যাপাচি ডকুমেন্টেশন থেকে উদ্ধৃত):

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

এবং শিশু পম এই মত

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

আপনাকে ফ্ল্যাটেন মাভেন প্লাগইনও ব্যবহার করতে হবে ডেডিকেটেড সংস্করণ সংখ্যা স্থাপনার জন্য অন্তর্ভুক্ত সঙ্গে পম কাগজপত্র তৈরি করতে। HowTo লিঙ্কযুক্ত ডকুমেন্টেশন নথিভুক্ত করা হয়।

এছাড়াও @khmarbaise এই বৈশিষ্ট্য সম্পর্কে একটি দুর্দান্ত ব্লব পোস্ট লিখেছেন: মাভেন: পিওএম ফাইলগুলিতে এটির কোনও সংস্করণ নেই?


আপনার বিবরণ মতো আমি আমার প্রকল্পটি কনফিগার করেছি, তবে "ফ্ল্যাটেন মাভেন প্লাগইন" ছাড়া এবং এটি প্রত্যাশা অনুযায়ী কাজ করছে বলে মনে হচ্ছে, এটি কি সম্ভব? এছাড়াও maven 3.2.1 এর সাথে আমি একটি ত্রুটি পেয়েছি, তবে maven 3.3.9+ ভাল কাজ করছে বলে মনে হচ্ছে।
সর্বোচ্চ

@ ম্যাক্স এটি নির্ভর করে যা আপনি "প্রত্যাশার মতো কাজ" হিসাবে সংজ্ঞায়িত করেন। আমার ধারণা, বিল্ডটি পাস হয়ে যাবে তবে একটি সংগ্রহস্থলে ইনস্টল / স্থাপন করা সম্ভবত কোনও ভাল ধারণা হবে কারণ চাইল্ড
পামে

আমি ডিফল্ট সম্পত্তি (<প্রপার্টি> <version> 0.1-ডিফল্ট </ রূপান্তর> </ p> / সংস্করণ> I আমি "এমভিএন ক্লিন ইনস্টল -ড্রিভিশন = 0.1. $ amb বাঁশ.বিল্ড নम्बर use" ব্যবহার করি। বিল্টনম্বার) I {ision পুনর্বিবেচনা} </version> So সুতরাং আমার কাছে এটি ঠিক আছে বলে মনে হয়?
সর্বোচ্চ

1
@ ম্যাক্স একটি জারটি সমাধান করার চেষ্টা করুন যেখানে সংস্করণটি ${revision} অন্য প্রকল্পে নির্ভরতা হিসাবে পম (মভেন রিপোজিটরিতে) রয়েছে resolve আমি মনে করি না যে এটি কাজ করবে।
ফ্রভবা

আমি যখন প্রকাশ করি তখন ব্যতীত এটি কার্যকর। ${revision}এটি নতুন সংস্করণ
মাইক ডি

21

ইয়ানফ্লিয়া যেমন উল্লেখ করেছে, এটি ঘুরে দেখার উপায় আছে is

মাভেন ৩.০.০ তে আপনি মূল প্রকল্প থেকে সংস্করণটি স্থানান্তর করার জন্য নিম্নলিখিত পদ্ধতি ব্যবহার করতে পারেন:

প্যারেন্ট POM.xML

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mydomain</groupId>
    <artifactId>myprojectparent</artifactId>
    <packaging>pom</packaging>
    <version>${myversion}</version>
    <name>MyProjectParent</name>

    <properties>
        <myversion>0.1-SNAPSHOT</myversion>
    </properties>

    <modules>
        <module>modulefolder</module>
    </modules>
    ...
</project>

মডিউল POM.xML

<project ...>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mydomain</groupId>
        <artifactId>myprojectmodule</artifactId>
        <version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent -->
    </parent>

    <groupId>se.car_o_liner</groupId>
    <artifactId>vinno</artifactId>
    <packaging>war</packaging>
    <name>Vinno</name>
    <!-- Note that there's no version specified; it's inherited from parent -->
    ...
</project>

আপনি যেটি myversionচান তা পরিবর্তন করতে পারেন যা কোনও সংরক্ষিত সম্পত্তি নয়।


3
অন্য প্রকল্প থেকে কোনও মডিউল উল্লেখ করার সময়, মাভেন সম্পত্তিটি সমাধান করেন না। এটা কি স্বাভাবিক?
লিওলোজেস

আমি বিশ্বাস করি যে প্রশ্নটি তার নিজস্ব প্রবেশের উপযুক্ত হতে পারে এবং এটির মতো কোনও মন্তব্যে নাও থাকতে পারে। আপনার কোড না দেখে আমি কেবল বুনো অনুমান করতে পারি।
eFox

@ লিওলোজেস আপনি কি নিজের সমস্যার সমাধান করেছেন (অন্য প্রকল্প থেকে রেফারেন্স মডিউল)?
মরতেজা মালভান্দি

@ মোর্তেজা মালভান্দি হ্যাঁ! আমার উত্তরটি নীচে রয়েছে :)
লিওলোজেস

2
ম্যাভেন 3.6.0 এই কনফিগারেশনের জন্য সতর্কতা দেয়: "আপনার সমস্যাগুলির স্থায়িত্ব হুমকিস্বরূপ এই সমস্যাগুলি সমাধান করার পক্ষে এটি সুপারিশ করা হয়।" "এই কারণে, ভবিষ্যতের ম্যাভেন সংস্করণগুলি আর এই জাতীয় ত্রুটিযুক্ত প্রকল্পগুলি নির্মাণে সমর্থন করবে না।"
d2k2

17

আপনি এটি ব্যবহার করতে পারেন:

$ mvn release:update-versions -DdevelopmentVersion={version}

আপনার POMs এ সংস্করণ নম্বর আপডেট করতে।


10

eFox এর উত্তরটি একটি একক প্রকল্পের জন্য কাজ করেছিল, তবে যখন আমি অন্য একটির থেকে কোনও মডিউল উল্লেখ করছিলাম না (pom.xML এখনও আমার মধ্যে সঞ্চিত ছিল).m2 সংস্করণটির পরিবর্তে সম্পত্তিতে )।

যাইহোক, আপনি এটির সাথে একত্রিত হলে এটি কাজ করে flatten-maven-plugin, যেহেতু এটি সম্পত্তিটি নয়, সঠিক সংস্করণ দিয়ে পোমস উত্পাদন করে।

আমি প্লাগ-ইন সংজ্ঞায় পরিবর্তিত একমাত্র বিকল্পটি হ'ল এটি outputDirectoryডিফল্টরূপে খালি, তবে আমি এটিতে পছন্দ করি targetযা আমার .gitignoreকনফিগারেশনে সেট করা আছে :

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>flatten-maven-plugin</artifactId>
   <version>1.0.1</version>
   <configuration>
      <updatePomFile>true</updatePomFile>
      <outputDirectory>target</outputDirectory>
   </configuration>
   <executions>
      <execution>
         <id>flatten</id>
         <phase>process-resources</phase>
         <goals>
            <goal>flatten</goal>
         </goals>
      </execution>
   </executions>
</plugin>

প্লাগ-ইন কনফিগারেশন প্যারেন্ট pom.xML এ যায়



0
<parent>
    <groupId>com.dummy.bla</groupId>
    <artifactId>parent</artifactId>
    <version>0.1-SNAPSHOT</version>     
 </parent>

 <groupId>com.dummy.bla.sub</groupId>
 <artifactId>kid</artifactId>

আপনার অর্থ আপনি বি এর পম এর প্যারেন্ট ব্লক থেকে সংস্করণটি সরাতে চান, আমি মনে করি আপনি এটি করতে পারবেন না, গ্রুপআইডি, আর্টিফ্যাক্টআইডি এবং সংস্করণটি পিতামাতার পোম স্থানাঙ্কের নির্দিষ্ট করেছে, আপনি যা বাদ দিতে পারেন তা সন্তানের সংস্করণ।

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