কোনও মাভেন চুল্লি বিল্ড থেকে কোনও মডিউল কীভাবে বাদ দেবেন?


100

আমাদের একটি মেভেন 2 প্রকল্প রয়েছে এতে প্রচুর মডিউল রয়েছে। উদাহরণ:

<modules>
  <module>common</module>
  <module>foo</module>
  <module>data</module>
  <module>bar</module>
  ... more ...
</module>

আসুন ধরা যাক "ডেটা" মডিউলটি নির্মাণে সময় সাপেক্ষ এবং আমরা যখন সিআই সার্ভার দ্বারা প্রকল্পটি তৈরি করা হয় তখন আমরা এটিকে বাদ দিতে চাই। বর্তমানে আমরা এটি অর্জন করতে দুটি pom.xML ফাইল ব্যবহার করি। এর একটিতে সমস্ত মডিউল রয়েছে এবং অন্যটির সিআইয়ের জন্য বাদ দেওয়া যেতে পারে এমনগুলি ব্যতীত সমস্ত মডিউল রয়েছে। তবে এটি বেশ বিরক্তিকর কারণ কখনও কখনও আমরা উভয় ফাইলে একটি নতুন মডিউল রাখতে ভুলে যাই ।

এমন কোনও সমাধান আছে যার জন্য দুটি পৃথক মডিউল তালিকার প্রয়োজন নেই?

উত্তর:


73

সবচেয়ে সহজ হতে পারে এটি ব্যবহার করা profiles:

<project>
  ...
  <modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  <modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

এরপরে আপনি প্রোফাইলগুলি সক্রিয় করতে পারেন এমন উপায়গুলি আপনার পরীক্ষা করা উচিত


আপনার যদি তথ্য দরকার হয় তবে সাধারণ হওয়ার আগে আপনি কী করবেন? এই ক্ষেত্রে প্রোফাইল মডিউলগুলি চুল্লি ক্রমে ডিফল্ট মডিউলগুলির পরে স্থাপন করা হবে। অর্ডার জোর করার জন্য কি কোনও প্যাটার্ন আছে?
পিটার কাহন

9
মডিউলটির ক্রমটি ক্রম নয় যাতে তারা চুল্লিটিতে উপস্থিত হবে। অর্ডারকে প্রভাবিত করার একমাত্র উপায় হ'ল মডিউলগুলির মধ্যে নির্ভরতা তৈরি করা, অর্থাৎ <নির্ভরতা> ট্যাগ ব্যবহার করা। আপনি এটির জন্য ঘোষণার আদেশের উপর নির্ভর করতে পারবেন না।
এসএম

7
@ স্যাম প্রকৃতপক্ষে, ম্যাভেন 3.0.০.৫ এর হিসাবে চুল্লিটি 'মডিউলগুলিতে' অর্ডারটি বিবেচনা করবে , যদিও নির্ভরতা দ্বারা নির্ধারিত আদেশটি উচ্চ অগ্রাধিকারের হয়।
Hellodanylo

এটি এমন কিছু অন্যান্য প্লাগইনগুলিকে ভেঙে দেবে যারা প্রোফাইলটিতে মডিউলটি সনাক্ত করতে ব্যর্থ হয় এমনকি প্রোফাইল সক্ষম থাকে
ট্রিপব্লয়েড

146

ম্যাভেন ৩.২.১ এর সাহায্যে আপনি এখন ব্যবহার করতে পারবেন -pl !<module_name>,!<module_name> চুল্লি বিল্ড থেকে কিছু মডিউল বাদ দিতে ।

এই বৈশিষ্ট্যটির অনুরোধটি দেখুন: https://issues.apache.org/jira/browse/MNG-5230


এটি 3.0.3 থেকে 3.2.1 থেকে স্যুইচ করা নিরাপদ নাকি আরও বড় পরিবর্তন রয়েছে?
জান

আমি কোনও সমস্যা ছাড়াই 3.1 থেকে 3.2.1 এ চলে এসেছি। তবে সত্যি কথা বলতে, এটি বের করার জন্য আপনাকে একটি বিল্ড করতে হবে।
যোগেশ_ডি

31
শেল কমান্ড লাইনের বিস্ময়কর চিহ্নটি এড়াতে ভুলবেন না। এটির একটি বিশেষ অর্থ রয়েছে, উদাহরণস্বরূপ দেখুন unix.stackexchange.com/questions/3747/…
পাভেল

4
দুর্ভাগ্যক্রমে জেনকিনস মেভেন-প্রজেক্ট প্লাগইনে বর্তমানে একটি ওপেন ইস্যু রয়েছে যা চুল্লী মডিউল বর্জনকে সমর্থন করে না: ইস্যু.জেনকিনস-ci.org/ ব্রাউজ
নিক

4
@ পাভেল: বা কেবল -পরিবর্তে ব্যবহার করুন !, যেমন-pl -<module_name>
এমএসএ

45

নির্মাণের প্রকল্পগুলি এমভিএন কমান্ড লাইনেও নির্দিষ্ট করা যেতে পারে। এটি পৃথক পোমের প্রয়োজনীয়তা সরিয়ে ফেলবে, পরিবর্তে প্রতিবার নতুন মডিউল উপস্থিত থাকলে আপনাকে সিআই কনফিগারেশন পরিবর্তন করতে হবে।

-pl,--projects <arg>                Comma-delimited list of specified
                                    reactor projects to build instead
                                    of all projects. A project can be
                                    specified by [groupId]:artifactId
                                    or by its relative path.

হতে পারে এই পতাকাটির সংমিশ্রণ এবং --also-make-dependentsবা --also-makeএই রক্ষণাবেক্ষণের ভারটি আবার হ্রাস করতে পারে।

-am,--also-make                     If project list is specified, also
                                    build projects required by the
                                    list
-amd,--also-make-dependents         If project list is specified, also
                                    build projects that depend on
                                    projects on the list

এটি দুটি পৃথক পোম ব্যবহার করার মতোই সমস্যা রয়েছে। আমাদের এমন জায়গাগুলি রাখতে হবে যেখানে আমরা মডিউলগুলি সংজ্ঞায়িত করি। এটাই আমি এড়াতে চাইছি।
কায়াহর

এটি একটি ভাল সমাধান। পোম আপডেট করতে হবে না। mvn clean install -pl mysubproject
নিকোলাস-এফ

22

আমি ধরে নিয়েছি আপনি গতি নির্বিশেষে ডিফল্ট বিল্ড সর্বদা সবকিছু তৈরি করতে চান, যাতে নতুন বিকাশকারীরা পিওএম সম্পর্কে অনেক কিছু না বুঝে দ্রুত শুরু করতে পারে। আপনি এই জাতীয় প্রোফাইল ব্যবহার করতে পারেন:

<modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  </modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

expensive-modules-to-buildএটির সাথে সমস্যাটি হ'ল যদি কোনও বিকাশকারী কমান্ড লাইনে অন্য কোনও প্রোফাইল নির্দিষ্ট করে তবে তা অন্তর্ভুক্ত থাকে না (যদি না বিকাশকারী এটি নির্দিষ্ট না করে)। কোন প্রোফাইল অন্তর্ভুক্ত করা প্রয়োজন তা মনে রাখা জটিল করে তোলে।

এখানে প্রায় একটি হ্যাকি উপায়। উভয় প্রোফাইলই সর্বদা অন্তর্ভুক্ত থাকে, কারণ pom.xML ফাইলটি সর্বদা উপস্থিত থাকে। সুতরাং ব্যয়বহুল মডিউলগুলি বাদ দিতে, আপনি -P!full-buildকমান্ড লাইনে ব্যবহার করতে পারেন ।

<profiles>
    <profile>
        <id>full-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
            <module>data</module>
        </modules>
    </profile>
    <profile>
        <id>short-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
           <module>common</module>
           <module>foo</module>
           <module>bar</module>
        </modules>
    </profile>
</profiles>

চমৎকার উত্তর. তবে ২ য় কোড উদাহরণে আপনার কি সত্যই দুটি প্রোফাইল দরকার? পরিবর্তিত অ্যাক্টিভেশন উপাদানটির সাথে প্রথম কোড উদাহরণ থেকে একক প্রোফাইলটি কি কাজ করবে না?
আরেন্দ বনাম রেইনসর্ডফ

4
@ আরেন্দেভি.রাইনার্সডর্ফ হ্যাঁ এটি হ'ল, তবে এই উত্তরটি সেই বিল্ডে থাকা অন্য প্রোফাইলগুলির সাথেও কাজ করে যা আপনি ডিফল্টরূপে অন্তর্ভুক্ত করতে চাইতে পারেন। সামগ্রিকভাবে যদিও, আমি মনে করি এর সাথে অন্য উত্তরগুলি -pl !<module_name>,!<module_name>এই
পুরানোটির

4
অ্যাক্টিভেশন ট্রিক। এটি আমাকে <activeByDefault> এর সাথে সমস্যাগুলি সমাধান করেছে যা সর্বদা সক্রিয় নয়!
গ্যাব

7

আরেকটি ধারণা: চুল্লী মডিউলগুলি নেস্ট করা যেতে পারে, সুতরাং আপনার দ্রুত এবং ধীর-বিল্ডিং মডিউলগুলি পৃথক পোমগুলিতে গোষ্ঠীভুক্ত করা এবং তারপরে মডিউল হিসাবে এই দুটি যুক্ত আরও একটি অ্যাগ্রিগেটর পম যুক্ত করা উচিত। আপনার সিআই সার্ভার তখন কেবলমাত্র দ্রুত বিল্ডিং মডিউলগুলি সহ পম রেফারেন্স করতে পারে।

<artifactId>fast</artifactId>
<modules>
    <module>fast-a</module>
    <module>fast-b</module>
    <module>fast-c</module>
</module>

<artifactId>all</artifactId>
<modules>
    <module>fast</module>
    <module>slow</module>
</module>

1

আপনি maven প্রোফাইল ব্যবহার করতে পারেন । আমাদের বিল্ড এনভায়রনমেন্টে, আমরা এমন একটি প্রোফাইল তৈরি করেছি quickযা অনেকগুলি প্লাগইন এবং পরীক্ষার কার্যকারিতা অক্ষম করে।

এটি দ্বারা করা হয়

    <profile>
        <id>quick</id>
        <properties>
            <skipTests>true</skipTests>
            <!-- others... -->
        </properties>   
        <build>
            <plugins>
                 <!-- configuration... -->
            </plugins>
        </build>
    </profile>

এবং তারপরে আমরা মাভেনকে নিম্নলিখিত পদ্ধতিতে অনুরোধ করব

mvn groupId:artifactId:goal -P quick

এটির গতি বাড়ানোর জন্য আপনি আপনার মডিউলটির পম সংকলন এবং অন্যান্য স্ট্যান্ডার্ড প্লাগইন অক্ষম করতে পারেন।


4
হ্যাঁ, পরীক্ষাগুলি অক্ষম করার জন্য এটি দুর্দান্ত কাজ করে। তবে পোমে দুটি পৃথক মডিউল তালিকা থাকা ছাড়া আমি কীভাবে মডিউলগুলি বাদ দিতে প্রোফাইল ব্যবহার করতে পারি? আমি যতদূর জানি আমার সম্পূর্ণ মডিউল তালিকাটি একটি প্রোফাইল বিভাগে এবং দ্রুত-বিল্ড মডিউল তালিকাকে অন্য প্রোফাইল বিভাগে রাখতে হবে। সুতরাং এটি দুটি পৃথক পোম ব্যবহার করার মতো একই সমস্যা: আমার বজায় রাখতে দুটি মডিউল তালিকা রয়েছে।
কায়াহর

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

ম্যাভেনের সমস্যাটি হ'ল 'জিনিসগুলি যেভাবে করা হয়' প্রায়শই 'বাস্তব বিশ্বে জিনিসগুলি যেভাবে করা হয়' এর সাথে প্রায়শই সারিবদ্ধ হয় না, এই আকর্ষণের অভিজ্ঞতা দরিদ্র ও বেদনাদায়ক করে তোলে। বিকাশকারীরা ইউএক্স প্রশিক্ষণের একটি ডোজ নেওয়া ভাল করবে।
এড র্যান্ডাল

0

এই লোকেরা ঠিক যে উত্তরটি চেয়েছিল তা নয়। আমার পরিস্থিতি ছিল আমি কেবল প্যারেন্ট পম মোতায়েন করতে চেয়েছিলাম। আমি spring-boot-thin-layoutএকটি শিশু মডিউল ব্যবহার করছি । এর জন্য প্যারেন্ট মডিউলটি কারুকার্যে স্থাপন করা দরকার। আমি আমার প্রকল্পে নিম্নলিখিতগুলি যুক্ত করেছি। এটি installএবং / বা এড়িয়ে যাওয়া সক্ষম করেdeploy পর্ব ।

আমার প্যারেন্ট পমে:

<properties>
    <disable.install>true</disable.install>
    <disable.deploy>true</disable.deploy>
    <enable.deployAtEnd>true</enable.deployAtEnd>
</properties>

<profiles>
    <profile>
        <id>deploy-parent</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <disable.install>true</disable.install>
            <disable.deploy>true</disable.deploy>
            <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
        </properties>
        <build>
            <finalName>${project.version}</finalName>
        </build>
    </profile>
</profiles>

এবং আমার চাইল্ড পম (গুলি) বা কোনও মডিউল যা আপনি পিতামাতার সাথে স্থাপন করতে চান না:

<properties>
    <maven.install.skip>${disable.install}</maven.install.skip>
    <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
    <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>

সুতরাং কার্যকরভাবে যখন আমি mvn deployপ্যারেন্ট পমটিতে চলেছি তখন এটি সমস্ত মডিউলগুলি সংকলন করবে, কোনও কিছুর উপর ইনস্টল চালাবে না এবং তারপরে শেষে কোনও <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>বৈশিষ্ট্য নেই যার মডিউল স্থাপন করবে। সুতরাং আমার ক্ষেত্রে কেবল পিতামাতাকে মোতায়েন করা।

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