প্যারেন্ট পিওএম থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নিদর্শনগুলি কীভাবে বাদ দেওয়া যায়?


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যে পিতা বা মাতা, যা scoped হয় বিদ্যমান compile

একটি সমাধান হতে পারে মেইল.জার কে প্যারেন্ট পিওএম থেকে ছাড়িয়ে দেওয়া, তবে বেশিরভাগ প্রকল্পের ভিত্তি যা উত্তরাধিকার সূত্রে প্রাপ্ত হয়, এটির প্রয়োজন (যেমন লগ 4 জে রূপান্তরকারী নির্ভরতা)। সুতরাং আমি যা করতে চাই তা হল কেবলমাত্র প্রকল্প প্রকল্পের বাইরে পিতামাতার লাইব্রেরি বাদ দেওয়া , যেমন এটি করা যেতে পারে 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হ'ল অভিভাবক pom এর ALL-DEPSঅধীনে সংস্করণটি dependencyManagementজোর করার জন্য প্রয়োজনীয় সংস্করণ সহ নিদর্শনটি ঘোষণা করা হবে (যদিও আমি নিশ্চিত নই যে এটি স্কোপিংয়ের সমস্যাটি সমাধান করবে)।

<dependencyManagement>
  <dependencies>
    <dependency>    
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>???</version><!-- put the "right" version here -->
    </dependency>
  </dependencies>
</dependencyManagement>
  1. অথবা আপনি mailযদি লগ 4j থেকে নির্ভরতা বাদ দিতে পারেন যদি আপনি এর উপর নির্ভর করে থাকা বৈশিষ্ট্যগুলি ব্যবহার না করেন (এবং আমি এটিই করব):
<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. অথবা আপনি কি log4j সংস্করণ 1.2.14 পরিবর্তে পাষণ্ড 1.2.15 সংস্করণে ফিরিয়ে আনুন পারেনি (কেন তারা উপরের হিসাবে নির্ভরতা চিহ্নিত করা হয়নি ঐচ্ছিক ?!)।

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

29

pomসোনাটাইপস সেরা অভ্যাস দ্বারা বর্ণিত প্যাকেজিং সহ আপনি আপনার নির্ভরতাগুলি একটি পৃথক প্রকল্পের মধ্যে দলবদ্ধ করতে পারেন :

<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 এর জন্য, যদিও চাইল্ড পম <d dependency> বিভাগটি <d dependencyManagement> এর পরিবর্তে ব্যবহার করা উচিত কারণ পরেরটি প্যারেন্ট পমের মধ্যে নির্ভরতার সংস্করণগুলি পরিচালনা করার জন্য ।
ম্যাথু ওয়াইজ

1
এটি বিওএম হিসাবে পরিচিত, উপকরণগুলির বিল বিল :-)
পিম হাজেব্রোক

এটি কি কেবল ট্রানজিটিভ নির্ভরতা নিয়ে কাজ করে? আমার প্যারেন্ট পমতে লগ 4j রয়েছে এবং এটি আমার পমের লগব্যাক সঠিকভাবে কাজ করা আটকাচ্ছে।
শ্রীধর সারনোবাত

10

প্যারেন্ট পম ব্যবহার করবেন না

এটি চরম শোনাতে পারে তবে একইভাবে "উত্তরাধিকারের নরক" এমন একটি কারণ যা কিছু লোক অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের দিকে মুখ ফিরিয়ে নেয় (বা উত্তরাধিকারের তুলনায় রচনা পছন্দ করে ), সমস্যাযুক্ত <parent>ব্লকটি সরিয়ে আপনি যা চান তা অনুলিপি করুন এবং পেস্ট করুন<dependencies> (যদি আপনার দল আপনাকে দেয় তবে এই স্বাধীনতা)।

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

এটি কার্যকর শোনার চেয়ে সহজ, যদি আপনি কার্যকর পোম উত্পন্ন করেন (গ্রহনের এটি সরবরাহ করে তবে আপনি এটি কমান্ড লাইন থেকে তৈরি করতে পারবেন mvn help:effective)।

উদাহরণ

আমি logbackআমার slf4j বাইন্ডিং হিসাবে ব্যবহার করতে চাই , তবে আমার প্যারেন্ট পম log4jনির্ভরতা অন্তর্ভুক্ত করে । আমি যেতে চাই না এবং লগ 4 জের উপর অন্যান্য বাচ্চাদের নির্ভরতা তাদের নিজের 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

আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, উইন্ডোজ 10 আমি চালানোর জন্য ছিল notepad empty.classতারপর jar cvf empty.jar empty.classএকটি খালি বয়াম তৈরি করতে।
রোভ

1
খারাপ অনুশীলন দেখে মনে হচ্ছে
পাইওটর Żাক

6

আপনি চান মেইল.জারের সংস্করণটি স্পষ্টভাবে ঘোষণার চেষ্টা করেছেন? মাভেনের নির্ভরতা রেজোলিউশনের অন্যান্য সংস্করণগুলির উপর নির্ভরতা সমাধানের জন্য এটি ব্যবহার করা উচিত।

<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
ইয়ান Khonski

3

সেরা বাজি হ'ল যে নির্ভরতাগুলি আপনি সর্বদা অবিচ্ছিন্নভাবে উত্তরাধিকারী হতে চান না তা করা।

আপনি প্রদত্ত সুযোগ সহ প্যারেন্ট পম এ চিহ্নিত করে এটি করতে পারেন।

আপনি যদি পিতামাতাকে এই ডিপগুলির সংস্করণগুলি পরিচালনা <dependencyManagement>করতে চান তবে আপনি যে সংস্করণগুলি চান তা সেগুলি সুস্পষ্টভাবে উত্তরাধিকারী না করে বা সেই উত্তরাধিকারটি বাচ্চাদের কাছে না দিয়ে সেটআপ করতে আপনি ট্যাগটি ব্যবহার করতে পারেন ।


1

আপনি যখন কোনও প্যাকেজ কল করেন তবে এর কিছু নির্ভরতা না চান আপনি এই জাতীয় কিছু করতে পারেন (এই ক্ষেত্রে আমি পুরানো লগ 4 জে যুক্ত করতে চাইনি কারণ আমার আরও নতুন ব্যবহারের প্রয়োজন ছিল):

<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আমার পক্ষে কাজ করে নি।

ফ্যাট জার তৈরি করতে আমরা স্প্রিং বুট প্লাগইন ব্যবহার করি। আমাদের কাছে মডিউল কমন রয়েছে যা সাধারণ লাইব্রেরি সংজ্ঞায়িত করে, উদাহরণস্বরূপ স্প্রিংফক্স swagger-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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.