একক নির্ভরতার সমস্ত ট্রানজিটিভ নির্ভরতা বাদ দিন


220

মাভেন 2 এ, একটি একক ট্রানসটিভ নির্ভরতা বাদ দিতে, আমাকে এরকম কিছু করতে হবে:

<dependency>
  <groupId>sample.group</groupId>
  <artifactId>sample-artifactB</artifactId>
  <version>1</version>
   <exclusions>
     <exclusion>
       <groupId>sample.group</groupId>
       <artifactId>sample-artifactAB</artifactId>
     </exclusion>
   </exclusions>
</dependency>

এই পদ্ধতির সাথে সমস্যাটি হ'ল আমাকে প্রদত্ত প্রতিটি ট্রানজিটিভ নির্ভরতার জন্য এটি করতে হবে sample-artifactB

সমস্ত ট্রানজিটিভ নির্ভরতা এক-একের পরিবর্তে একবারে বাদ দেওয়ার জন্য কি কোনও ধরণের ওয়াইল্ডকার্ড ব্যবহার করার উপায় আছে?


মাঝে মাঝে লাইব্রেরির সর্বশেষতম সংস্করণটি স্প্রিং ২..6. say বলতে হবে তবে কিছু অন্যান্য নির্ভরতার মধ্যে পুরানো সংস্করণ যেমন স্ট্রুটস ২-স্প্রিং-প্লাগইন (২.১..6) এর মধ্যে রয়েছে স্প্রিং ২.৩.৩। এই জাতীয় দৃশ্যে সংস্করণটিকে বাদ দেওয়া বা ওভাররাইড করার প্রয়োজন রয়েছে।
বিনোদ সিং

1
আইভি ব্যবহার করুন। শুধু মজা করছি.
জ্যাক টরন্টো

উত্তর:


54

ম্যাভেন 2 এর জন্য আপনি যা বর্ণনা করেছেন তা করার কোনও উপায় নেই। ম্যাভেন 3 এর জন্য রয়েছে। যদি আপনি ম্যাভেন 3 ব্যবহার করছেন তবে দয়া করে এই প্রশ্নের জন্য আরও একটি উত্তর দেখুন

মেভেন 2 এর জন্য আমি আপনার <এক্সক্লুশানস> নির্ভরতার জন্য আপনার নিজস্ব কাস্টম পম তৈরি করার পরামর্শ দিচ্ছি। যে নির্ভরতাগুলি ব্যবহার করতে হবে এমন প্রকল্পগুলির জন্য, আদর্শ শিল্পকর্মের পরিবর্তে আপনার কাস্টম পমের উপর নির্ভরতা সেট করুন। যদিও এটি আপনাকে অবিচ্ছিন্নভাবে একটি একক <এক্সক্লিকশন> দিয়ে সমস্ত ট্রানজিটিভ নির্ভরতা বাদ দিতে দেয় না, এটি আপনাকে কেবল একবার নির্ভরতা লিখতে দেয় এবং আপনার সমস্ত প্রকল্পের অপ্রয়োজনীয় এবং দীর্ঘ বর্জনীয় তালিকাগুলি বজায় রাখার প্রয়োজন হয় না।


12
আমি আপনার নিজস্ব পোমকে বাদ দেওয়ার জন্য কাজ করার বিরুদ্ধে সুপারিশ করব। এটি আপনার বিল্ডকে অনেক কম পোর্টেবল করে তোলে এবং বোধগম্যতা হ্রাস করে।
ব্রায়ান ফক্স

1
যদি আপনি গৃহীত এ্যান্সারটিকে অতীতটি না দেখেন: jira.codehaus.org/browse/MNG-3832
জাকুব বোচেনস্কি

@ জাকুবচেনস্কি আমার দেওয়া উত্তরটি ম্যাভেন 2-এর সাথে নির্দিষ্ট, যা এই প্রশ্নটির সাথে ট্যাগ করা হয়েছে (এই সময়ে আমি এই মন্তব্যটি লিখেছিলাম)। আপনার লিঙ্কটি কেবলমাত্র maven 3 এর জন্য প্রাসঙ্গিক Reg যাইহোক, আমি আমার উত্তর সম্পাদনা করেছি আরও উচ্চ উত্তরের উত্তরের সাথে লিঙ্ক করার জন্য।
তিমি

305

আমার জন্য যা কাজ করেছে (ম্যাভেনের একটি নতুন বৈশিষ্ট্য হতে পারে) কেবল তা বাদ দেওয়ার উপাদানটিতে ওয়াইল্ডকার্ড করছে।

আমার কাছে একটি মাল্টি-মডিউল প্রকল্প রয়েছে যাতে একটি "অ্যাপ" মডিউল থাকে যা দুটি ওয়ার-প্যাকেজযুক্ত মডিউলগুলিতে উল্লেখ করা হয়। ওয়ার-প্যাকেজযুক্ত মডিউলগুলির মধ্যে একটিতে কেবলমাত্র ডোমেন ক্লাসগুলির প্রয়োজন (এবং আমি এগুলি এখনও অ্যাপ্লিকেশন মডিউল থেকে আলাদা করি নি)। আমি এটি কাজ করতে পেলাম:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

গ্রুপআইডি এবং আর্টিফ্যাক্ট উভয়ই ওয়াইল্ডকার্ড সমস্ত নির্ভরতা বাদ দেয় যা সাধারণত এই নির্ভরতা ব্যবহার করে মডিউলটিতে প্রচার করে।


9
গ্রুপ এবং আর্টিক্যাল ফ্যাক্টের জন্য * ওয়াইল্ডকার্ড মনে হচ্ছে 3
nkr1pt

22
আমি জানি না আপনি কীভাবে এই কাজটি সন্ধান করতে পেরেছিলেন, যেহেতু ম্যাভেন 3 নক্ষত্রের ব্যবহার সম্পর্কে স্পষ্টভাবে সতর্ক করে দিয়েছে: "সতর্কতা] 'depend depend.d dependency.exclusions.exc સમાવેશ.groupId' জন্য <artifcat_id> মান" * "নয় একটি বৈধ আইডি প্যাটার্ন মেলে। [সতর্কতা] এই সমস্যাগুলি সমাধানের জন্য এটি অত্যন্ত সুপারিশ করা হয় কারণ এগুলি আপনার বিল্ডের স্থায়িত্বকে হুমকী দেয়। [সতর্কতা] এই কারণে, ভবিষ্যতের ম্যাভেন সংস্করণগুলি আর এ জাতীয় দূষিত প্রকল্পগুলি নির্মাণে আর সমর্থন করতে পারে না আপনি কি এমন কোনও প্রমাণ দেওয়ার জন্য আপত্তি করবেন যা এটি সমর্থিত এবং ব্যবহার করা যেতে পারে? অন্যথায় আমি আপনার মন্তব্যটিকে অত্যন্ত বিভ্রান্তিমূলক হিসাবে বিবেচনা করব।
ㄴ ㄱ

7
ম্যাভেন 3.0.০.৪ নিয়ে সুন্দর করে কাজ করেছেন। অনেক অনেক ধন্যবাদ !
ইভজেনি গোল্ডিন

1
ম্যাভেন 3.0.4 -> এটি আমার পক্ষে ভাল কাজ করে নি। যখন আমি অ্যাসিড্রিক্স ব্যবহার করি বা যখন আমি স্পষ্টভাবে সমস্ত প্রত্যক্ষ নির্ভরতা বাদ দিয়ে থাকি তখন ফলিত জারটি খুব আলাদা হয়। এটি একটি চর্বিযুক্ত জার তৈরি করার জন্য মাভেন-অ্যাসেম্বলি-প্লাগইন ব্যবহার করছি এমনটি হতে পারে। এই ক্ষেত্রে, প্রস্তাবিত গন্ধ কাজ করে না!
গিলাদ হচ

31
এই পদ্ধতিটি বৈধ। তারা এই সতর্কবার্তাটি স্থির করেছে যে অন্যরা মেভেন ৩.২.১ তে
রায়ান

32

একটি জিনিস আমি দরকারী খুঁজে পেয়েছি:

আপনি যদি আপনার প্রকল্পের প্যারেন্ট পিওএম এর নির্ভরতা পরিচালন বিভাগে বা কোনও আমদানিযোগ্য নির্ভরতা পরিচালন পিওএম-র ক্ষেত্রে ব্যতিক্রমের সাথে নির্ভরতা রাখেন, তবে আপনাকে বাদ দেওয়ার (বা সংস্করণ) পুনরাবৃত্তি করার দরকার নেই।

উদাহরণস্বরূপ, যদি আপনার প্যারেন্ট পুম POM থাকে:

<dependencyManagement>
    <dependencies>
    ...         
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     ....
  </dependencies>
</dependencyManagement>

তারপরে আপনার প্রকল্পের মডিউলগুলি কেবল নির্ভরতা হিসাবে ঘোষণা করতে পারে:

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

অভিভাবক POM এ থাকা সংস্করণ এবং ব্যতিক্রম উভয়ই নির্দিষ্ট করে। আমি আমাদের প্রায় সব প্রকল্পের জন্য এই কৌশলটি ব্যবহার করি এবং এটি প্রচুর পুনরাবৃত্তি দূর করে।


23

তিন বছর আগে আমি সংস্করণ 99 ব্যবহারের প্রস্তাব নেই, তবে এখন আমি আরও ভাল উপায় বের করেছি, বিশেষত যেহেতু সংস্করণ 99 অফলাইন রয়েছে:

আপনার প্রকল্পের প্যারেন্ট পিএমএমে, অবাঞ্ছিত নির্ভরতা যদি বিল্ডটিতে সরে যায় তবে বিল্ডটি ব্যর্থ করতে মাভেন-এনফোর্সার-প্লাগইন ব্যবহার করুন । এটি প্লাগইনের নিষিদ্ধ নির্ভরতা নিয়ম ব্যবহার করে করা যেতে পারে :

<plugin>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>only-junit-dep-is-used</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <excludes>
                            <exclude>junit:junit</exclude>
                        </excludes>
                    </bannedDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

তারপরে যখন এটি আপনাকে অবাঞ্ছিত নির্ভরতা সম্পর্কে সতর্ক করে, তা পিতামাতার POM <dependencyManagement>বিভাগে বাদ দিন :

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-test</artifactId>
    <version>2.1.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

এইভাবে অবাঞ্ছিত নির্ভরতা দুর্ঘটনাক্রমে প্রদর্শিত হবে না (কেবল একটি <exclusion>ভুলতে সহজ যা এর বিপরীতে ), এটি সংকলনের সময় এমনকি ( providedসুযোগের বিপরীতে ) উপলব্ধ হবে না , কোনও বোগাস নির্ভরতা নেই (সংস্করণ 99 এর বিপরীতে) এবং এটি ' কাস্টম সংগ্রহস্থল ব্যতীত কাজ করব (সংস্করণ 99 এর বিপরীতে)। এই পদ্ধতির এমনকি শৈল্পিক সংস্করণ, শ্রেণিবদ্ধ, স্কোপ বা একটি সম্পূর্ণ গ্রুপআইডির ভিত্তিতেও কাজ করবে - বিশদগুলির জন্য ডকুমেন্টেশন দেখুন।


নোট করুন যে কমপক্ষে ম্যাভেন ৩.১ এর অধীনে, <configuration>কমান্ড-লাইন থেকে লক্ষ্যটি সম্পাদন করার সময় এটিকে উপেক্ষা করা হবে এবং অবশ্যই সরাসরি এর অধীনে চলে যেতে হবে <plugin>
ডেভিড হার্কনেস

আমি ঠিক খুঁজে পেয়েছি যা দেখতে একটি বাজে মাভেন বাগের মতো দেখাচ্ছে - সংস্করণ 3.5.2 .2 আমার সাবমডিউলগুলি নিয়ে একটি প্রকল্প আছে যেখানে আমি পিতামাতার <dependencyManagement>বিভাগে নির্ভরতা বাদ দিই না । mvn dependency:treeনির্দিষ্ট প্রকল্পে একটি চালানো মোটেই বাদ যায় না all কিন্তু যে নির্ভরতা আমদানি করে এমন সমস্ত প্রকল্প <exclusions>অন্য প্রকল্পের প্যারেন্ট পম থেকে সম্মান জানায় না - বাদ দেওয়াগুলি ক্রপ হবে !!! আমাকে <exclusions>সরাসরি প্রতিটি মডিউল পামে যেতে হয়েছিল।
সিবল্ডান

11

আমি নিম্নলিখিত কাজের মতো ব্যবহার করছি: সমস্ত উপযুক্ত নির্ভরতাগুলিতে শিল্পকলাটি বাদ দেওয়ার চেষ্টা করার পরিবর্তে আমি শীর্ষ স্তরে "সরবরাহিত" হিসাবে নির্ভরতা আঁকছি। উদাহরণস্বরূপ, xML-apis "যে কোনও সংস্করণই" শিপিং এড়ানোর জন্য:

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>

9

বর্তমানে, একসাথে একাধিক ট্রান্সজিটিভ নির্ভরতা বাদ দেওয়ার কোনও উপায় নেই তবে মাভেন জিরা সাইটে এটির জন্য একটি বৈশিষ্ট্য অনুরোধ রয়েছে:

https://issues.apache.org/jira/browse/MNG-2315


6

এটির জন্য একটি কর্মসূচী রয়েছে, আপনি রানটাইমের উপর নির্ভরশীলতার সুযোগটি সেট করে দিলে ট্রানসিটিভ নির্ভরতা বাদ দেওয়া হবে। যদিও সচেতন থাকুন এর অর্থ আপনি যদি রানটাইম নির্ভরতা প্যাকেজ করতে চান তবে আপনাকে অতিরিক্ত প্রসেসিংয়ে যুক্ত করতে হবে।

যে কোনও প্যাকেজিংয়ে রানটাইম নির্ভরতা অন্তর্ভুক্ত করার জন্য, আপনি নির্দিষ্ট আর্টিক্টের জন্য ম্যাভেন-নির্ভরতা-প্লাগইনের অনুলিপি লক্ষ্য ব্যবহার করতে পারেন ।


1
এটি আমাকে অ্যান্ড্রয়েড ডালভিক সংকলক নিয়ে ইস্যুগুলি নিয়ে কাজ করতে সহায়তা করেছে যা দ্বি-স্তরের ট্রানজিটিভ অন্তর্ভুক্তির কিছু পরিচালনা করতে পারে না --- তবে এর <scope>provided</scope>পরিবর্তে আমাকে ব্যবহার করতে হয়েছিল <scope>runtime</scope>
গ্যারেট উইলসন

6

আপনি যদি কোনও সমাবেশে অন্তর্ভুক্ত করতে চলেছেন এমন নির্ভরশীলতা শিল্প থেকে সমস্ত ট্রানজিটি নির্ভর নির্ভরতা বাদ দিতে হয়, তবে আপনি এটিকে সমাবেশ-প্লাগইনটির জন্য বিবরণীতে উল্লেখ করতে পারেন:

<assembly>
    <id>myApp</id>
    <formats>
        <format>zip</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <useTransitiveDependencies>false</useTransitiveDependencies>
            <includes><include>*:struts2-spring-plugin:jar:2.1.6</include></includes>
        </dependencySet>
    </dependencySets>
</assembly>

3

আপনি যদি Eclipse এর অধীনে বিকাশ করেন তবে আপনি POM সম্পাদক (উন্নত ট্যাব সক্ষম) আপনি নির্ভর করতে পারেন যে নির্ভরতা গ্রাফ আপনার প্রকল্পটি বাদ দিতে চান এবং তারপরে:

এটিতে ডান ক্লিক করুন -> "ম্যাভেন আর্টিফ্যাক্ট বাদ দিন ..." এবং গ্রহণটি কোন নির্ভরশীলতার উপর নির্ভরশীল তা নির্ভর করে তা খুঁজে বের করার প্রয়োজন ছাড়াই আপনার জন্য বাদ পড়বে।


নোট করুন যে আপনি কেবল এম 2 স্লিপস প্লাগইন ব্যবহার করে থাকলে এটি কাজ করে
নিকোলাস

2

সমস্ত ট্রানজিটিভ নির্ভরতা বাদ দেওয়ার জন্য আপনার কারণ কী?

যদি কোনও নির্দিষ্ট শৈল্পিক (যেমন কমন্স-লগিং) থাকে যা আপনাকে প্রতিটি নির্ভরতা থেকে বাদ দিতে হয়, তবে সংস্করণ 99 অস্তিত্বমানের পদ্ধতির সাহায্য করতে পারে।


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


1

একটি সিমুলার ইস্যুতে আমার সুযোগের সাথে কাঙ্ক্ষিত নির্ভরতা ঘোষিত হয়েছিল। এই পদ্ধতির সাহায্যে অস্থায়ী নির্ভরতা এনেছে তবে প্যাকেজ পর্বে অন্তর্ভুক্ত করা হয়নি, যা আপনি চান। রক্ষণাবেক্ষণের ক্ষেত্রেও আমি এই সমাধানটি পছন্দ করি কারণ তিমির দ্রবণের মতো কোনও পোম বা কাস্টম পম নেই, যা বজায় রাখতে প্রয়োজন; আপনার কেবলমাত্র ধারকটিতে নির্দিষ্ট নির্ভরতা সরবরাহ করতে হবে এবং সম্পন্ন করতে হবে


-2

আপনার ক্লাসপথে সর্বশেষতম মেভেন ব্যবহার করুন .. এটি সদৃশ নিদর্শনগুলি সরিয়ে দেবে এবং সর্বশেষতম মাভেন শিল্পকে রাখবে ..

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