वहाँ वैसे भी एक माता पिता POM से विरासत में मिली कलाकृतियों को बाहर करने के लिए है?


119

आश्रितों से कलाकृतियों को एक <exclusions>अंदर एक तत्व घोषित करके बाहर रखा जा सकता है, <dependency>लेकिन इस मामले में मूल परियोजना से विरासत में मिली एक कलाकृति को बाहर करने की आवश्यकता होती है। चर्चा के तहत पोम का एक अंश इस प्रकार है:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>jruby</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
    </parent>

    <dependencies>      
        <dependency>
            <groupId>com.liferay.portal</groupId>
            <artifactId>ALL-DEPS</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</project>

baseकलाकृति, निर्भर करता है javax.mail:mail-1.4.jar, और ALL-DEPSउसी पुस्तकालय के एक और संस्करण पर निर्भर करता है। तथ्य के कारण है कि mail.jarसे ALL-DEPSनिष्पादन पर्यावरण पर मौजूद हैं, हालांकि निर्यात नहीं किया, के साथ टकराता है mail.jarकि माता-पिता, जो के रूप दायरे वाला पर मौजूद है compile

एक समाधान मूल POM से mail.jar से छुटकारा पाने के लिए हो सकता है, लेकिन अधिकांश परियोजनाएं जो आधार का उत्तराधिकार प्राप्त करती हैं, उन्हें इसकी आवश्यकता होती है (जैसा कि log4j के लिए एक ट्रान्सटेसिव निर्भरता है)। तो मैं क्या करना चाहते हैं बस करने के लिए है माता-पिता के पुस्तकालय को बाल परियोजना से बाहर , क्योंकि यह baseएक आश्रित होने पर किया जा सकता है और माता-पिता के लिए नहीं:

...
    <dependency>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
        <type>pom<type>
        <exclusions>
          <exclusion>
             <groupId>javax.mail</groupId>
             <artifactId>mail</artifactId>
          </exclusion>
        </exclusions>
    </dependency>
...

जवाबों:


49

कुछ विचार:

  1. हो सकता है कि आप बस उस मामले में माता-पिता से विरासत में नहीं मिले (और baseबहिष्कार के साथ निर्भरता की घोषणा करें )। अगर आपके पास पैरेंट पोम में बहुत सारा सामान है तो आसान नहीं है।

  2. अभिसरण के लिए बाध्य करने के लिए मूल पोम के तहत mailआवश्यक संस्करण के साथ विरूपण साक्ष्य को घोषित करने के लिए परीक्षण करने के लिए एक और बात होगी (हालांकि मुझे यकीन नहीं है कि यह स्कूपिंग समस्या को हल करेगा)।ALL-DEPSdependencyManagement

<dependencyManagement>
  <dependencies>
    <dependency>    
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>???</version><!-- put the "right" version here -->
    </dependency>
  </dependencies>
</dependencyManagement>
  1. या mailयदि आप उस पर निर्भर सुविधाओं का उपयोग नहीं कर रहे हैं (और यह वही है जो मैं करूंगा)
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.15</version>
  <scope>provided</scope>
  <exclusions>
    <exclusion>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
    </exclusion>
    <exclusion>
      <groupId>javax.jms</groupId>
      <artifactId>jms</artifactId>
    </exclusion>
    <exclusion>
      <groupId>com.sun.jdmk</groupId>
      <artifactId>jmxtools</artifactId>
    </exclusion>
    <exclusion>
      <groupId>com.sun.jmx</groupId>
      <artifactId>jmxri</artifactId>
    </exclusion>
  </exclusions>
</dependency>
  1. या आप विधर्मी 1.2.15 संस्करण के बजाय log4j के संस्करण 1.2.14 पर वापस लौट सकते हैं (उन्होंने वैकल्पिक के रूप में उपरोक्त निर्भरता को चिह्नित क्यों नहीं किया !)।

आपके जवाब के लिए धन्यवाद। इसमें कई सारे उपयोगी जानकारी शामिल हैं। 1 के बारे में) जैसा कि आपने देखा है कि इष्टतम नहीं होगा क्योंकि माता-पिता पोम में केवल निर्भरताएं नहीं होती हैं जो कि आधार पर निर्भरता के रूप में चिह्नित की गई थीं, लेकिन कंपनी में हर परियोजना के बीच पुन: उपयोग किए जाने वाले सामान्य रिपोर्टिंग, स्रोत प्रबंधन, और अन्य सामानों के रूप में स्थानांतरित हो जाएगी। 2 के संबंध में) मैंने इसे आजमाया, लेकिन जैसा कि प्रदान किया गया है, कलाकृतियों के दायरे को भी निर्दिष्ट करता है, और यह काम किया :)। सबसे पहले, मैंने सोचा था कि जैसा कि संकलन प्रदान किया गया है, यह काम नहीं करेगा, लेकिन सौभाग्य से मैं गलत था (बच्चा पोम माता-पिता के विन्यास को ओवरराइड करता है)
मिगुएल

29

आप pomSonatypes द्वारा सर्वोत्तम प्रथाओं के अनुसार पैकेजिंग के साथ एक अलग परियोजना के भीतर अपनी निर्भरता को समूहित कर सकते हैं :

<project>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>base-dependencies</artifactId>
    <groupId>es.uniovi.innova</groupId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <dependencies>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>
    </dependencies>
</project>

और अपने माता-पिता से उन्हें संदर्भित करें (निर्भरता देखें <type>pom</type>):

<project>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>base</artifactId>
    <groupId>es.uniovi.innova</groupId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <dependencies>
        <dependency>
            <artifactId>base-dependencies</artifactId>
            <groupId>es.uniovi.innova</groupId>
            <version>1.0.0</version>
            <type>pom</type>
        </dependency>
    </dependencies>
</project>

आपका चाइल्ड-प्रोजेक्ट इस पैरेंट-पोम को पहले की तरह विरासत में मिला है। लेकिन अब, dependencyManagementब्लॉक के भीतर बाल-परियोजना में मेल निर्भरता को बाहर रखा जा सकता है :

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>jruby</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <artifactId>base-dependencies</artifactId>
                <groupId>es.uniovi.innova</groupId>
                <version>1.0.0</version>
                <exclusions>
                    <exclusion>
                        <groupId>javax.mail</groupId>
                        <artifactId>mail</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

4
इसके लिए +1, हालाँकि चाइल्ड पोम <निर्भरताप्रबंधन> के बजाय <निर्भरता> सेक्शन का उपयोग करना चाहिए क्योंकि बाद वाला पेरेंट पोम के भीतर से निर्भरता के संस्करणों के प्रबंधन के लिए है ।
मैथ्यू वाइज

1
इसे BOM के रूप में भी जाना जाता है, उर्फ ​​बिल ऑफ मटेरियल :-)
पिम हेज़ब्रोक

क्या यह केवल सकर्मक निर्भरताओं के साथ काम करता है? मेरे पैरेंट पोम में log4j शामिल है और यह मेरे पोम के लॉगबैक को ठीक से काम करने से रोक रहा है।
श्रीधर सरनोबत

10

माता-पिता पोम का उपयोग न करें

यह चरम लग सकता है, लेकिन उसी तरह "विरासत नरक" एक कारण है कि कुछ लोग ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (या विरासत पर रचना पसंद करते हैं ) पर अपनी बारी देते हैं , समस्याग्रस्त <parent>ब्लॉक को हटा दें और आपको जो कुछ भी ज़रूरत हो उसे कॉपी और पेस्ट<dependencies> करें यह स्वतंत्रता)।

"पुन: उपयोग" और "पुनर्मूल्यांकन से बचने" के लिए एक माता-पिता और बच्चे में पोम्स को विभाजित करने की धारणा को नजरअंदाज किया जाना चाहिए और आपको पहले अपनी तत्काल आवश्यकताओं की सेवा करनी चाहिए (इलाज बीमारी से भी बदतर है)। इसके अलावा, अतिरेक के अपने फायदे हैं - अर्थात् बाहरी परिवर्तनों की स्वतंत्रता (यानी स्थिरता)।

यदि आप प्रभावी पोम उत्पन्न करते हैं तो यह लगता है की तुलना में यह आसान है (ग्रहण इसे प्रदान करता है लेकिन आप इसे कमांड लाइन से उत्पन्न कर सकते हैं mvn help:effective)।

उदाहरण

मैं logbackअपने slf4j बाइंडिंग के रूप में उपयोग करना चाहता हूं, लेकिन मेरे मूल पोम पर log4jनिर्भरता शामिल है । मुझे नहीं जाना है और अन्य बच्चों की निर्भरता को log4j पर धकेलने के लिए अपनी खुद की pom.xmlफाइलों में धकेलना है, ताकि मेरा कोई अवरोध न हो।


1
दस्तावेज़ (और आपके द्वारा अनुसरण की जाने वाली प्रक्रिया) बहुत सावधानी से क्योंकि भविष्य के रखवालों को इसे फिर से बनाने की आवश्यकता है यदि माता-पिता पोम के एक अद्यतन संस्करण का उपयोग करने की आवश्यकता है।
थोरबजोरन रावन एंडरसन

निश्चित रूप से आपका मतलब है कि माता-पिता पोम में निर्भरता का उपयोग नहीं करते हैं? निर्भरता संस्करणों और सामान्य प्लगइन्स को प्रबंधित करने के लिए पेरेंट पोम अभी भी बहुत उपयोगी है। बस निर्भरता को इंजेक्ट करने के लिए इसका उपयोग कर सकते हैं बैकफ़ायर - हम इसे केवल निर्भरता के लिए उपयोग करते हैं (जैसे कि माइक्रोसेवा के लिए माता-पिता के लिए आवश्यक स्प्रिंग बूट शुरुआत का एक सेट)
अमित गोल्डस्टीन

नहीं, मैं यह नहीं कह रहा हूं कि हल्के पैरेंट पोम का इस्तेमाल करें। आपकी टीम के अन्य लोग आपको पैरेंट पोम ट्रिम करने की अनुमति नहीं देंगे, क्योंकि अन्य ऐप्स पेरेंट पोम में रद्दी पर निर्भर करते हैं जो आप नहीं चाहते हैं।
श्रीधर सरनोबत

8

scopeखाली जार की ओर इशारा करते हुए सिस्टम के साथ निर्भरता (बच्चे के पोम में) को फिर से परिभाषित करें :

<dependency>
    <groupId>dependency.coming</groupId>
    <artifactId>from.parent</artifactId>
    <version>0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/empty.jar</systemPath>
</dependency>

जार में केवल एक खाली फ़ाइल हो सकती है:

touch empty.txt
jar cvf empty.txt

अपने जवाब के लिए धन्यवाद, Windows 10 पर मैं चलाने के लिए किया था notepad empty.classतो jar cvf empty.jar empty.classएक खाली जार उत्पन्न करने के लिए।
रोव

1
बुरा अभ्यास जैसा दिखता है
पियोट्र

6

क्या आपने स्पष्ट रूप से mail.jar के संस्करण की घोषणा करने की कोशिश की है? मावेन के निर्भरता समाधान को अन्य सभी संस्करणों पर निर्भरता संकल्प के लिए इसका उपयोग करना चाहिए।

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>jruby</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
    </parent>
    <dependencies>          
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>VERSION-#</version>
            <scope>provided</scope>
        </dependency> 
        <dependency>
            <groupId>com.liferay.portal</groupId>
            <artifactId>ALL-DEPS</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</project>

1
आपका दृष्टिकोण, जैसा कि पास्कल का वर्कअन # 2 भी मान्य है, वास्तव में, आपने यह भी ध्यान में रखा है कि मेल पर निर्भरता प्रदान की जानी चाहिए। धन्यवाद।
मिगेल

प्रदान की गई स्कोप ने मेरे लिए काम नहीं किया। मैंने स्कोप टेस्ट का उपयोग किया, कृपया मेरे उत्तर की जांच करें। stackoverflow.com/a/55970293/4587961
यान खोंस्की

3

सबसे अच्छी शर्त यह है कि आप उन आश्रितों को बनाने के लिए हैं जिन्हें आप हमेशा अट्रैक्टिव नहीं चाहते हैं।

आप इसे प्रदत्त दायरे के साथ मूल पोम में चिह्नित करके कर सकते हैं।

यदि आप अभी भी चाहते हैं कि माता-पिता इन deps के संस्करणों का प्रबंधन करें, तो आप <dependencyManagement>टैग का उपयोग उन संस्करणों को सेटअप करने के लिए कर सकते हैं, जिन्हें आप स्पष्ट रूप से इनहेरिट करना चाहते हैं, या बच्चों के साथ उस विरासत को पास करना चाहते हैं।


1

जब आप पैकेज कहते हैं, लेकिन इसकी कुछ निर्भरता नहीं चाहते हैं तो आप इस तरह से काम कर सकते हैं (इस मामले में मैं नहीं चाहता था कि पुराने log4j को जोड़ा जाए क्योंकि मुझे नए का उपयोग करने की आवश्यकता है):

<dependency>
  <groupId>package</groupId>
  <artifactId>package-pk</artifactId>
  <version>${package-pk.version}</version>

  <exclusions>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<!-- LOG4J -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.5</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.5</version>
</dependency>

यह मेरे लिए काम करता है ... लेकिन मैं जावा / मावेन के लिए बहुत नया हूं इसलिए यह शायद इष्टतम नहीं है।


स्टैक ओवरफ्लो में आपका स्वागत है, और जिन असभ्य लोगों को मैंने लगातार खारिज कर दिया है, उन्हें अपने पोस्टिंग से हतोत्साहित नहीं करने देता।
श्रीधर सरनोबत

1

मुझे वास्तव में इस गंदे काम को करने की ज़रूरत थी ... यहाँ है कैसे

मैंने गुंजाइश के साथ उन निर्भरता को फिर से परिभाषित किया test। स्कोप providedमेरे काम नहीं आया।

फैट जार बनाने के लिए हम स्प्रिंग बूट प्लगइन का उपयोग करते हैं। हमारे पास मॉड्यूल कॉमन है जो सामान्य पुस्तकालयों को परिभाषित करता है, उदाहरण के लिए स्प्रिंगफॉक्स स्वैगर -2। मेरी सुपर-सर्विस के लिए पैरेंट कॉमन होना आवश्यक है (यह ऐसा नहीं करना चाहता है, लेकिन कंपनी नियम लागू करती है!)

इसलिए मेरे माता-पिता या कॉमन को पोम है।

<dependencyManagement>

    <!- I do not need Springfox in one child but in others ->

    <dependencies>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-bean-validators</artifactId>
            <version>${swagger.version}</version>
        </dependency>

       <!- All services need them ->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${apache.poi.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

और मेरी सुपर-सर्विस पोम।

<name>super-service</name>
<parent>
    <groupId>com.company</groupId>
    <artifactId>common</artifactId>
    <version>1</version>
</parent>

<dependencies>

    <!- I don't need them ->

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-bean-validators</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-core</artifactId>
        <version>2.8.0</version>
        <scope>test</scope>
    </dependency>

    <!- Required dependencies ->

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
     <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
    </dependency>
</dependencies>

यह अंतिम वसा विरूपण साक्ष्य का आकार है

82.3 MB (86,351,753 bytes) - redefined dependency with scope test
86.1 MB (90,335,466 bytes) - redefined dependency with scope provided
86.1 MB (90,335,489 bytes) - without exclusion

यह उत्तर भी ध्यान देने योग्य है - मैं ऐसा करना चाहता था, लेकिन मैं आलसी हूं ... https://stackoverflow.com/a/48103554/4587961


0

हम मूल पोम को एक प्रकार की पोम के साथ निर्भरता के रूप में जोड़ सकते हैं और उस पर बहिष्करण कर सकते हैं। क्योंकि किसी भी तरह पैरेंट पोम डाउनलोड किया जाता है। इसने मेरे लिए काम किया

<dependency>
  <groupId>com.abc.boot</groupId>
  <artifactId>abc-boot-starter-parent</artifactId>
  <version>2.1.5.RELEASE</version>
  <type>pom</type>
  <exclusions>
    <exclusion>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
    </exclusion>
  </exclusions>   
</dependency>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.