মাভেন: কোনও গ্রন্থাগারের দ্বারা যুক্ত নির্ভরতা কীভাবে ওভাররাইড করা যায়


116

আমার জেনেরিক সমস্যাটি এখানে:

আমার প্রজেক্ট পি এর উপর নির্ভর করে যা বি এর উপর নির্ভর করে যা সি এর উপর নির্ভর করে যা ডি এর ১.০.১ সংস্করণের উপর নির্ভর করে

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

গুরুত্বপূর্ণ: এক্ষেত্রে কেবল সংস্করণটিই পরিবর্তন করা হবে না, তবে গ্রুপ ও আর্টিক্যাক্টও রয়েছে। সুতরাং এটি নির্ভরতার সংস্করণটিকে ওভাররাইড করার বিষয় নয়, বরং একটি মডিউল বাদ দিয়ে অন্য একটিটি অন্তর্ভুক্ত করার বিষয়।

কংক্রিটের ক্ষেত্রে, ডি স্ট্যাক্স যার 1.0.1 এর মধ্যে একটি বাগ রয়েছে । বাগের নোট অনুসারে, "স্ট্যাকস-এপি -১.০.১ (ম্যাভেন গ্রুপআইডি = স্ট্যাক্স) স্ট্যাক্স-এপি-১.০-২ (মাভেন গ্রুপআইডি = জাভ্যাক্স.এক্সএমএল.স্ট্রিম) দ্বারা প্রতিস্থাপন করে সমস্যার সমাধান করা হয়েছিল" তাই আমি আমি ঠিক চেষ্টা করছি।

সুতরাং, ডি = স্ট্যাক্স: স্ট্যাক্স-এপিআই: জার: 1.0.1 এবং সি = org.apache.xmlbean: xmlbeans: জার: 2.3.0

আমি ম্যাভেন ২.০.৯ ব্যবহার করছি যদি এটি গুরুত্বপূর্ণ হয়।

এমভিএন নির্ভরতার আউটপুট: ট্রি "

mvn dependency:tree
[..snip..]
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
[INFO] |  +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] |  |  +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] |  |  |  \- stax:stax-api:jar:1.0.1:compile

আমার প্রকল্পের পিওমে আমার "এ" এর উপর নিম্নলিখিত নির্ভরতা রয়েছে:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.6</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.6</version>
</dependency>

আগাম ধন্যবাদ.

উত্তর:


100

কেবলমাত্র আপনার বর্তমান পোমের সংস্করণটি নির্দিষ্ট করুন। এখানে বর্ণিত সংস্করণটি অন্যগুলিকে ওভাররাইড করবে।

একটি সংস্করণ জোর করা একটি সংস্করণ
সর্বদা সম্মানিত হবে যদি এটি বর্তমান POM এ নির্দিষ্ট সংস্করণ হিসাবে ঘোষণা করা হয় - তবে, এটি লক্ষ করা উচিত যে এটি অন্যান্য পোমগুলিকেও প্রবাহকে প্রভাবিত করবে যদি এটি নিজেই ট্রানজিটিভ নির্ভরতা ব্যবহারের উপর নির্ভর করে।


সংস্থানসমূহ:


5
এটি স্পষ্ট নয় যে আমি কীভাবে সংস্করণটি নির্দিষ্ট করতে পারি যেহেতু আমি ডি এর উপর নির্ভরশীলতা ঘোষণা করি না, এছাড়াও আপনার প্রথম লিঙ্কটি দেওয়া আছে "এই নথিতে ম্যাভেন ২.০ এর জন্য এখনও নির্ভরযোগ্যতা পরিচালনার বাকি প্রয়োজনীয়তাগুলি বর্ণনা করা হয়নি, বিশেষত ট্রানজিটিভ নির্ভরতা সম্পর্কিত "। উপরে.
wishihadabettername

@ বিশিহাদেবাটর্নাম, যেমন অন্য নথিতে বলা হয়েছে: "আপনি ডি 2.0 ব্যবহারের জন্য বাধ্যতামূলকভাবে A তে D 2.0 এর উপর নির্ভরশীলতা যুক্ত করতে পারেন"
কলিন হেবার্ট

1
আপনি আসলে নিজের পোমে খুব একই <নির্ভরতা> এন্ট্রিটির সদৃশ। আপনার নির্ভরতাতে, আপনি চান এমন একটি <version> নির্দিষ্ট করুন। এটি "গভীর" নির্ভরতা দ্বারা ব্যবহৃত কোনও সংস্করণ ওভাররাইড করবে।
কিথ টাইলার

27

বিকল্পভাবে, আপনি যে নির্ভরতাটি চান না তা কেবল বাদ দিতে পারেন। স্ট্যাকস জেডিকে ১.6 এ অন্তর্ভুক্ত রয়েছে, সুতরাং আপনি যদি ১.6 ব্যবহার করছেন তবে আপনি এটি পুরোপুরি বাদ দিতে পারেন।

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

<dependency>
  <groupId>a.group</groupId>
  <artifactId>a.artifact</artifactId>
  <version>a.version</version>
  <exclusions>
    <!--  STAX comes with Java 1.6 -->
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>javax.xml.stream</groupId>
    </exclusion>
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>stax</groupId>
    </exclusion>
  </exclusions>
<dependency>

1
এটি লক্ষণীয় যে এই ট্রানজিটিভ নির্ভরতা ব্যবহার করা যেতে পারে এবং যদি প্রয়োজন হয় তবে বর্জন কোনও বিল্ড ব্যর্থতার কারণ হতে পারে।
বার্নহার্ড কলবি

আপনি যদি কোনও আধুনিক জেডিকে ব্যবহার করছেন (অর্থাত্ 1.6+) এবং আপনার একটি ট্রানসিটিভ নির্ভরতার মাধ্যমে অন্তর্ভুক্ত স্ট্যাক্সের অনেক পুরানো সংস্করণ প্রয়োজন, আপনি সম্ভবত সব ধরণের ভয়াবহ রানটাইম ক্লাস লোডার ইস্যুতে চলে যেতে চলেছেন। আমার পরামর্শ: জেডিকে একটি ব্যবহার করুন। যদি আপনি "বিল্ড ব্যর্থতা" পান তবে আপনি কিছু ফর্মের একটি প্রাচীন এপিআইয়ের উপর নির্ভর করছেন যা আপগ্রেড করা উচিত। অথবা: আপনার জেডিকে 1.5 তে রোল করুন। সেই সাথে শুভকামনা।
স্কট

10

তৃতীয় পক্ষের লাইব্রেরিতে নির্ভরতা ওভাররুলিং করতে আমারও সমস্যা হয়েছিল। আমি বাদ দিয়ে স্কট এর পদ্ধতির ব্যবহার করেছি তবে আমি পোমের নতুন সংস্করণে নির্ভরতাও যুক্ত করেছি। (আমি ম্যাভেন ৩.৩.৩ ব্যবহার করেছি)

সুতরাং স্থির উদাহরণের জন্য এটি দেখতে এই রকম হবে:

<dependency>
  <groupId>a.group</groupId>
  <artifactId>a.artifact</artifactId>
  <version>a.version</version>
  <exclusions>
    <!--  STAX comes with Java 1.6 -->
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>javax.xml.stream</groupId>
    </exclusion>
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>stax</groupId>
    </exclusion>
  </exclusions>
<dependency>

<dependency>
    <groupId>javax.xml.stream</groupId>
    <artifactId>stax-api</artifactId>
    <version>1.0-2</version>
</dependency>

10

আপনি </dependencies>রুট পমের ট্যাগের মধ্যে যা রেখেছেন তা মূল পমের সমস্ত চাইল্ড মডিউল অন্তর্ভুক্ত করবে। আপনার সমস্ত মডিউল যদি সেই নির্ভরতা ব্যবহার করে তবে এটি যাওয়ার উপায়।

তবে, যদি আপনার সন্তানের মডিউলগুলির মধ্যে 10 টির মধ্যে কেবল 3 নির্ভরতা ব্যবহার করে, আপনি চান না যে এই নির্ভরতাটি আপনার সমস্ত শিশু মডিউলগুলিতে অন্তর্ভুক্ত করা হোক। সেক্ষেত্রে আপনি কেবল নির্ভরশীলতাটি ভিতরে রাখতে পারেন </dependencyManagement>। এটি নিশ্চিত করবে যে নির্ভরশীলতার জন্য যে কোনও শিশু মডিউলটিকে তাদের নিজস্ব পোম ফাইলে ঘোষণা করতে হবে, তবে তারা আপনার </dependencyManagement>ট্যাগে উল্লিখিত নির্ভরতার একই সংস্করণটি ব্যবহার করবে ।

</dependencyManagement>ট্রানজিটিভ নির্ভরতাগুলিতে ব্যবহৃত সংস্করণটি পরিবর্তন করতে আপনি এটিও ব্যবহার করতে পারেন , কারণ উপরের সর্বাধিক পম ফাইলটিতে ঘোষিত সংস্করণটি ব্যবহার করা হবে। আপনার প্রকল্প এটিতে একটি বাহ্যিক প্রকল্প বি v1.0 অন্তর্ভুক্ত রয়েছে যাতে আরও একটি বহিরাগত প্রকল্প সি ভি 1.0 অন্তর্ভুক্ত রয়েছে তবে এটি কার্যকর হতে পারে। কখনও কখনও এটি ঘটে যে সি সি v1.0 প্রজেক্টে একটি সুরক্ষা লঙ্ঘন পাওয়া গেছে যা v1.1 এ সংশোধন করা হয়েছে, তবে বি এর বিকাশকারীরা সি এর v1.1 ব্যবহারের জন্য তাদের প্রকল্প আপডেট করতে ধীর হয়ে যায় that সেক্ষেত্রে আপনি কেবল ঘোষণা করতে পারেন আপনার প্রকল্পের মূল পমের মধ্যে সি v1.1 এর উপর নির্ভরতা `এবং সবকিছু ভাল হবে (ধরে নিবেন যে বি ভি 1.0 এখনও সি ভি 1.1 এর সাথে সংকলন করতে সক্ষম হবে)।


1

গৃহীত উত্তরটি সঠিক তবে আমি আমার দুটি সেন্ট যুক্ত করতে চাই। আমি এমন একটি সমস্যায় পড়েছি যেখানে আমার একটি প্রকল্প A ছিল যার নির্ভরতা হিসাবে একটি প্রকল্প বি ছিল। উভয় প্রকল্প slf4j ব্যবহার করে তবে প্রকল্প B লগ 4j ব্যবহার করে যখন প্রকল্প এ লগব্যাক ব্যবহার করে। প্রকল্প বি slf4j 1.6.1 ব্যবহার করে, যখন প্রকল্প এ slf4j 1.7.5 ব্যবহার করে (ইতিমধ্যে অন্তর্ভুক্ত লগব্যাক 1.2.3 নির্ভরতার কারণে)।

সমস্যা: প্রকল্পের একটি গ্রাহকের নির্ভরতা স্তরক্রম ট্যাবটি পরীক্ষা করার পরে, slf4j 1.7.5 এ উপস্থিত একটি ফাংশনটি খুঁজে পেল না আমি জানতে পেরেছিলাম যে এটি নির্মাণের সময় লগব্যাকের slf4j 1.7.5 ব্যবহারের পরিবর্তে প্রকল্প বি থেকে slf4j 1.6.1 ব্যবহার করছে was ।

আমি প্রকল্পের পমের উপর নির্ভরশীলতার ক্রমটি পরিবর্তন করে সমস্যার সমাধান করেছি, যখন আমি লগব্যাক এন্ট্রির নীচে প্রকল্প বি এন্ট্রি স্থানান্তরিত করি তখন maven slf4j 1.7.5 ব্যবহার করে প্রকল্পটি নির্মাণ শুরু করে।

সম্পাদনা: প্রজেক্ট বি নির্ভরতা খুব বেশি কাজ করার আগে slf4j 1.7.5 নির্ভরতা যুক্ত করা।

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