Maven 3 में एक मॉड्यूल के संस्करण के रूप में project.parent.version का उपयोग करने पर चेतावनी


80

मावेन मल्टी-मॉड्यूल प्रोजेक्ट्स में, जहां मैं चाहता हूं कि प्रत्येक मॉड्यूल हमेशा माता-पिता के समान संस्करण रखें, मैंने आमतौर पर मॉड्यूल के pom.xml में निम्नलिखित की तरह कुछ किया है:

  <parent>
    <groupId>com.groupId</groupId>
    <artifactId>parentArtifactId</artifactId>
    <version>1.1-SNAPSHOT</version>
  </parent>

  <groupId>com.groupId</groupId>
  <artifactId>artifactId</artifactId>
  <packaging>jar</packaging>
  <version>${project.parent.version}</version>
  <name>name</name>

जब से मैंने मावेन 3.0-अल्फा -5 का उपयोग करना शुरू किया है, मुझे ऐसा करने के लिए निम्नलिखित चेतावनी मिलती है।

[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.groupid.artifactId:name:jar:1.1-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ com.groupid.artifactId:name::${project.parent.version}, /Users/whaley/path/to/project/child/pom.xml
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

मैं यह जानने के लिए उत्सुक हूं कि मूल संस्करण के मॉड्यूल संस्करण को बांधने में वास्तविक समस्या क्या है, यदि कोई हो? या यह एक सामान्य चेतावनी का मामला है जब किसी भी अभिव्यक्ति की परवाह किए बिना कि क्या यह प्रोजेक्ट है ।parent.version, संस्करण तत्व के लिए उपयोग किया जाता है।

जवाबों:


91

मैं यह जानने के लिए उत्सुक हूं कि मूल संस्करण के मॉड्यूल संस्करण को बांधने में वास्तविक समस्या क्या है, यदि कोई हो? या यह एक सामान्य चेतावनी का मामला है, जब किसी भी अभिव्यक्ति, चाहे वह प्रोजेक्ट.परेंट.वर्सन है, का उपयोग संस्करण तत्व के लिए किया जाता है।

खैर, यह परीक्षण करना आसान होगा। क्योंकि मैं जिज्ञासु था, मैंने सिर्फ आपके लिए निम्नलिखित पोम का उपयोग किया था:

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>parent</artifactId>
    <groupId>com.mycompany</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>com.mycompany</groupId>
  <artifactId>module</artifactId>
  <version>${myversion}</version>
  <name>module</name>
  <url>http://maven.apache.org</url>
  <properties>
    <myversion>1.0-SNAPSHOT</myversion>
  </properties>
  ...
</project>

और मावेन वास्तव में शिकायत कर रहा है:

[WARNING] 'version' contains an expression but should be a constant. @ com.mycompany:module:${myversion}, /home/pascal/Projects/maven-maven3-testcase/module/pom.xml

सच कहूं तो, मुझे लगता है कि मावेन यहीं है, इसके लिए एक संपत्ति का उपयोग करने का कोई मतलब नहीं है <version> तत्व के (कम से कम प्रोजेक्ट के लिए नहीं। विसर्जन) और मावेन को इसके बारे में शिकायत करना अच्छा है।

और अगर आप उप-मॉड्यूल में पैरेंट पोम संस्करण का उपयोग करना चाहते हैं, तो चाइल्ड पॉम से टैग हटा दें<version> , वे पैरेंट से संस्करण को इनहेरिट करेंगे। वर्तमान में आप जो कर रहे हैं वह अनावश्यक है।


2
बस अपने बोल्ड किए गए उत्तर को यहां देखें: maven.apache.org/guides/introduction/… । मावेन: द डेफिनिटिव गाइड में इस तरह से इसका उल्लेख किया गया था, लेकिन उस समय मैंने इसे पढ़ा था। सुधारों के लिए धन्यवाद।
व्हेल

13
Jira.codehaus.org/browse/MNG-4715 में दिए गए उदाहरणों में <संस्करण> तत्व के लिए एक संपत्ति का उपयोग करने के कुछ वैध कारण प्रतीत होते हैं, इसलिए मैं आश्वस्त नहीं हूं कि इसके लिए कोई उपयोग नहीं है, लेकिन हमें याद दिलाने के लिए +1 यदि आप सबमॉडल्स को पेरेंट पोम संस्करण का उपयोग करना चाहते हैं, तो केवल टैग हटा दें और विरासत का काम करने दें।
मेटाटम

7
यह बेवकूफी है :-( मैं संस्करण में buildnumber-maven-plugin से $ {buildNumber} का उपयोग कैसे करूं?
Nux

6
नहीं! मावेन संस्करण 3.2.1 में चाइल्ड पोम्स से वर्जन टैग को हटा दें, जिसके परिणामस्वरूप 'प्रोजेक्ट बिल्ड एरर: पेरेंट। विसर्जन गायब है'
लियू

6
@ शनयांगकु। बस यहां स्पष्ट होना है। आप यह कहने के लिए सही हैं कि आप चाइल्ड पोम के मूल अनुभाग से संस्करण को नहीं निकाल सकते । उस अभिभावक को निर्दिष्ट करने की आवश्यकता है जिसे आप विरासत में प्राप्त कर रहे हैं। लेकिन आप बच्चे के संस्करण को खुद ही छोड़ सकते हैं । यह पैरेंट के लिए डिफ़ॉल्ट होगा। विसर्जन (पैरेंट सेक्शन में संस्करण)।
ड्रोब

2

मुझे इस पर चर्चा करने में देर हो सकती है। मुझे इसके लिए एक सरल समाधान मिला WARNING

सबसे पहले, यदि आप चाहते हैं कि सभी बाल मॉड्यूल माता-पिता के समान संस्करण लेंगे, तो आप <version>बच्चे POM से टैग हटा दें और जैसे ही आप शामिल हों<parent> बच्चे POM में होना चाहिए।

<version>बच्चे POM की अनुपस्थिति में , यह स्वचालित रूप से पेरेंट POM लेगाversion

अब यदि आप propertyमूल POM संस्करण में उपयोग करना चाहते हैं और सभी चाइल्ड-मॉड्यूल में समान प्राप्त करना चाहते हैं, तो आप अनुसरण के रूप में देख सकते हैं।

<version>माता-पिता या बच्चे पोम के हिस्से में संपत्ति का उपयोग करने पर कोई सीमा नहीं है । लेकिन अगर आप निर्दिष्ट करने के लिए अपने स्वयं के xml टैग का उपयोग करते हैं या आप अपनी स्वयं की संपत्ति का उपयोग करते हैं, तोWARNING आता है, (हालांकि यह सिर्फ चेतावनी है, सब कुछ अपेक्षित रूप से काम करता है)।

लेकिन अगर आप इससे छुटकारा पाना चाहते हैं WARNING, तो आप इन चरणों का पालन कर सकते हैं:

  1. <properties>नीचे POM.xml के रूप में बनाएँ

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
    
  2. में <version>pom.xml की, इस प्रकार डाल

    <version>${revision}</version>
    

नमूना कोड स्निपेट (मल्टी-मॉड्यूल प्रोजेक्ट के लिए):

<groupId>abc.xyz</groupId>
<artifactId>pqr</artifactId>
<!-- <version>1.0.0</version> -->
<version>${revision}</version>
<packaging>pom</packaging>
<description>Parent POM</description>

<properties>
    <revision>1.0.0</revision>
</properties>

नोट : इसके बजाय <revision>, यदि आप किसी अन्य नाम (उदाहरण के लिए <my.version>) का उपयोग करते हैं, तो आप उस का सामना करेंगेWARNING

अब यदि आप के दौरान संस्करण पास करना चाहते हैं mvn deploy, तो आप उपयोग कर सकते हैं mvn deploy "-Drevision=1.0.0-SNAPSHOT"और इसी तरह के लिए mvn installभी।

अब यदि कॉन्फ़िगरेशन से ऊपर है, तो आप पेरेंट पोम के रूप में उपयोग करना चाहते हैं, और आप versionसभी चाइल्ड मॉड्यूल में समान उपयोग करना चाहते हैं , यह भी किया जा सकता है। प्रत्येक में child module POM, नीचे का उपयोग करें

<parent>
    <groupId>abc.xyz</groupId>
    <artifactId>Parent</artifactId>
    <!-- <version>1.0.0</version> -->
    <version>${revision}</version>
</parent>

<groupId>abc.xyz</groupId>
<artifactId>Child</artifactId>
<!-- <version>1.0.0</version> -->     <!-- Automatically inherit parent POM version -->
<name>Demo</name>

संदर्भ के लिए, आप मावेन मल्टी मॉड्यूल सेटअप के माध्यम से जा सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.