ম্যাভেন প্যারেন্ট পম বনাম মডিউল পম


284

মাল্টিপ্রজেক্ট বিল্ডে প্যারেন্ট পমগুলি গঠনের বিভিন্ন উপায় রয়েছে বলে মনে হয় এবং আমি ভাবছি যে প্রতিটি উপায়ে কীভাবে সুবিধা / ত্রুটি রয়েছে সে সম্পর্কে কারও কোনও ধারণা ছিল কিনা।

প্যারেন্ট পম থাকার সহজ পদ্ধতি হ'ল এটি কোনও প্রকল্পের মূলের মধ্যে রাখা

myproject/
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml

যেখানে pom.xML হ'ল উভয়ই মূল প্রকল্প এবং সেই সাথে--কোটির -পি এবং-অ্যাপ মডিউলগুলি বর্ণনা করে

পরবর্তী পদ্ধতিটি হ'ল পিতামাতাকে তার নিজস্ব উপ-ডিরেক্টরিতে আলাদা হিসাবে আলাদা করা

myproject/
  mypoject-parent/
    pom.xml
  myproject-core/
  myproject-api/
  myproject-app/

যেখানে প্যারেন্ট পমটিতে এখনও মডিউল রয়েছে তবে সেগুলি আপেক্ষিক, যেমন .. / মাইপ্রোজেক্ট- কোর

শেষ অবধি, সেখানে বিকল্প রয়েছে যেখানে মডিউল সংজ্ঞা এবং পিতামাতাকে আলাদা হিসাবে পৃথক করা হয়েছে

myproject/
  mypoject-parent/
    pom.xml
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml

যেখানে প্যারেন্ট পমটিতে কোনও "ভাগ করা" কনফিগারেশন রয়েছে (depend dependantagement, Properties ইত্যাদি) এবং মাইপ্রজেক্ট / pom.xML এ মডিউলগুলির তালিকা রয়েছে।

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

কয়েকটি বোনাস প্রশ্ন:

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

সম্পাদনা করুন: উপ প্রকল্পগুলির প্রত্যেকটির নিজস্ব pom.xML রয়েছে, এটি ছড়িয়ে দেওয়ার জন্য আমি এটি রেখে দিয়েছি।


মডিউলগুলিরও কি নিজস্ব পম রয়েছে? আমার প্রকল্পের একটি প্যারেন্ট পম রয়েছে, তবে মডিউলগুলির প্রতিটিটিরও একটি পম রয়েছে। (আপনি যা বর্ণনা করেছেন তার চতুর্থ উপায়)
হার্শওয়্যার

আহ, হ্যাঁ, আমি সম্পাদনা করব এবং আপডেট করব। প্রতিটি সাবমডিউলগুলির নিজস্ব পোমও রয়েছে।
জেমি ম্যাকক্রিন্ডল

3
একটি আপডেট হিসাবে, আমি দ্বিতীয় বিকল্পের একটি সুবিধা দেখতে পাচ্ছি এটি হল যে Eclipse এ পরিচালনা করা আরও সহজ যেখানে প্রথম এবং তৃতীয় উদাহরণে রুট pom.xML অন্তর্ভুক্ত করা কঠিন হবে যদি উপগ্রন্থগুলি Eclipse এ পৃথক প্রকল্প হয়।
জেমি ম্যাকক্রিন্ডল

উত্তর:


166

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

যদি উত্তর হ্যাঁ হয় (এবং এটি বেশিরভাগ প্রকল্পগুলির ক্ষেত্রে যা প্রশ্নে বা মন্তব্যে উল্লিখিত হয়েছে), তবে প্যারেন্ট পমকে একটি ভিসিএস এবং ম্যাভেন দৃষ্টিকোণ থেকে তার নিজস্ব মডিউল প্রয়োজন এবং আপনি শেষ করবেন ভিসিএস স্তরে এরকম কিছু সহ:

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
`-- projectA
    |-- branches
    |-- tags
    `-- trunk
        |-- module1
        |   `-- pom.xml
        |-- moduleN
        |   `-- pom.xml
        `-- pom.xml

এটি চেকআউটটিকে কিছুটা বেদনাদায়ক করে তোলে এবং এটি ব্যবহারের জন্য সাধারণ উপায় svn:externals। উদাহরণস্বরূপ, একটি trunksডিরেক্টরি যুক্ত করুন:

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
|-- projectA
|   |-- branches
|   |-- tags
|   `-- trunk
|       |-- module1
|       |   `-- pom.xml
|       |-- moduleN
|       |   `-- pom.xml
|       `-- pom.xml
`-- trunks

নিম্নলিখিত বাহ্যিক সংজ্ঞা সহ:

parent-pom http://host/svn/parent-pom/trunk
projectA http://host/svn/projectA/trunk

এর পরে একটি চেকআউট trunksনিম্নলিখিত স্থানীয় কাঠামোতে ফলাফল করবে (প্যাটার্ন # 2):

root/
  parent-pom/
    pom.xml
  projectA/

বৈকল্পিকভাবে, আপনি এমনকি একটি যোগ করতে পারেন pom.xmlমধ্যে trunksডিরেক্টরি:

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
|-- projectA
|   |-- branches
|   |-- tags
|   `-- trunk
|       |-- module1
|       |   `-- pom.xml
|       |-- moduleN
|       |   `-- pom.xml
|       `-- pom.xml
`-- trunks
    `-- pom.xml

এটি pom.xmlএকধরনের "নকল" পোম: এটি কখনই প্রকাশ হয় না, এতে কোনও আসল সংস্করণ থাকে না কারণ এই ফাইলটি কখনও প্রকাশ হয় না, এটিতে কেবল মডিউলগুলির একটি তালিকা রয়েছে। এই ফাইলটির সাথে একটি চেকআউট এই কাঠামোর ফলাফল করবে (প্যাটার্ন # 3):

root/
  parent-pom/
    pom.xml
  projectA/
  pom.xml

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

যদি উত্তর হয় না হয় (প্রাথমিক প্রশ্নের কাছে ফিরে যান) তবে আমি মনে করি আপনি প্যাটার্ন # 1 দিয়ে বেঁচে থাকতে পারবেন (সবচেয়ে সহজ কাজটি সম্ভবত কাজ করতে পারে)।

এখন, বোনাস প্রশ্ন সম্পর্কে:

  • উত্স নিয়ন্ত্রণ, স্থাপনা ডিরেক্টরি, সাধারণ প্লাগইন ইত্যাদির মতো বিভিন্ন ভাগ করা কনফিগারেশন সংজ্ঞায়নের সেরা স্থানটি কোথায় (আমি পিতা-মাতাকে ধরে নিচ্ছি তবে প্রায়শই আমি এটি কামড়েছি এবং তারা প্রতিটি প্রকল্পের পরিবর্তে শেষ হয়েছে) একটি সাধারণ)।

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

  • আপনি কীভাবে আপনার মাল্টি-প্রজেক্টগুলি সেট আপ করেন (কীভাবে একটি বিশাল প্রশ্ন, কোনও মাল্টি-প্রজেক্ট বিল্ডটি কীভাবে স্থাপন করা হয়েছে তখন যখন কেউ ধরা পড়েছে তখন এটি আরও বেশি) কীভাবে মেভেন-রিলিজ প্লাগইন, হাডসন এবং নেক্সাস ডিল করবে?

আমি যে সেটআপটি ব্যবহার করি তা ভাল কাজ করে, উল্লেখ করার মতো বিশেষ কিছুই নেই।

প্রকৃতপক্ষে, আমি আশ্চর্য হয়েছি কীভাবে মেভেন-রিলিজ-প্লাগইন # 1 প্যাটার্নটির সাথে আচরণ করে (বিশেষত <parent>বিভাগটির সাথে যেহেতু আপনার মুক্তির সময় SNAPSHOT নির্ভরতা থাকতে পারে না)। এটি মুরগির বা ডিমের সমস্যার মতো মনে হয় তবে আমি এটি মনে করতে পারি না এটি কাজ করে কিনা এবং এটি পরীক্ষা করতে খুব অলস ছিল।


এটি দেখতে খুব ভাল কারণ এটি কীভাবে স্কেল করে। এসভিএন: বহিরাগতরা এর উদ্বেগজনক হওয়ার বিষয়ে আমার উদ্বেগের জবাব দেয়।
জেমি ম্যাকক্রিন্ডল

@ জ্যামি খুশী আপনি এটি সহায়ক মনে করেন।
পাস্কাল থিভেন্ট

1
"হ্যাক" কে কীভাবে কাজ করবেন তা আপনি বিশদভাবে বলতে পারেন? আমি ট্রাঙ্কস প্রকল্প পেয়েছি এবং অনুমান করেছি যে আপনি "একটি চুল্লি তৈরির প্রবর্তন" দিয়ে -pl বিকল্পটি লক্ষ্যবস্তু করেছেন তবে কাঠামোতে একটি রিলিজ করার সময় এটি সমস্যা হিসাবে দেখাবে কারণ এই বিকল্পটি মূল স্তরের কোনও বিল্ড থেকে পাস হয় না neither আমি কী এটিকে রিলিজ-প্লাগইনের <টি আর্গুমেন্ট /> বিকল্পে রাখতে পারি। সুতরাং মুক্তি: ত্রুটিগুলি সম্পাদন করুন কারণ এটি মূল-স্তরের পম-এ কাজ করার চেষ্টা করে ...
জানুয়ারী

এসএনএন: এক্সটার্নালস হ্যাক হ'ল বেশিরভাগ দরকারী এসএনএন হ্যাক যা আমি দীর্ঘ সময় দেখেছি। একই ভাণ্ডারগুলির মধ্যে প্রতি-প্রকল্পের শাখা প্রশস্তকরণগুলির জন্য খুব সহায়ক।
ওমরকুদাত

1
হাই পাস্কাল, মডিউল বিভাগে উল্লিখিত প্রকল্পগুলি, প্যারেন্ট-পমটিকে তার <পিতামাত্ত> হিসাবে ব্যবহার না করে কিছু-অন্যান্য-প্রকল্প-পিতামাতো-পম হিসাবে ব্যবহার করবে যদি আপনি সংস্করণ # কীভাবে পরিচালনা করবেন? এই জাতীয় প্রকল্পগুলির একটি আর্টিফ্যাক্টের জন্য # সংস্করণগুলি কী কী হবে (সেই প্রকল্পগুলির <পিতামাতার> বিভাগে শৈল্পীর # সংস্করণ # বা প্রকল্পের সংস্করণ # যা এই প্রকল্পগুলিকে মডিউল হিসাবে তালিকাভুক্ত করে)? stackoverflow.com/questions/25918593/…
একেএস

34

আমার অভিজ্ঞতা এবং মাভেনের সেরা অনুশীলনগুলি থেকে দুই ধরণের "প্যারেন্ট পমস" রয়েছে

  • "সংস্থার" প্যারেন্ট পম - এই পমটিতে আপনার সংস্থার নির্দিষ্ট তথ্য এবং কনফিগারেশন রয়েছে যা প্রতিটি পোমকে উত্তরাধিকারী করে এবং অনুলিপি করার প্রয়োজন হয় না। এই তথ্যগুলি হ'ল:

    • ভান্ডার
    • বিতরণ ব্যবস্থাপনা বিভাগ
    • সাধারণ প্লাগইন কনফিগারেশন (যেমন maven- সংকলক-প্লাগইন উত্স এবং লক্ষ্য সংস্করণ)
    • সংস্থা, বিকাশকারী, ইত্যাদি

    এই প্যারেন্ট পমটি প্রস্তুত করা সতর্কতার সাথে করা দরকার, কারণ আপনার সমস্ত সংস্থার পোমগুলি এখান থেকে উত্তরাধিকারী হবে, সুতরাং এই পমটি পরিপক্ক এবং স্থিতিশীল হতে হবে (প্যারেন্ট পমের একটি সংস্করণ প্রকাশ করা আপনার সমস্ত কোম্পানির প্রকল্পগুলি মুক্তি দেওয়ার জন্য প্রভাব ফেলবে না!)

  • দ্বিতীয় ধরণের প্যারেন্ট পম একটি মাল্টিমিডুল প্যারেন্ট। আমি আপনার প্রথম সমাধানটি পছন্দ করি - এটি মাল্টি মডিউল প্রকল্পগুলির জন্য একটি ডিফল্ট মাভেন কনভেনশন, খুব প্রায়ই ভিসিএস কোড কাঠামো উপস্থাপন করে

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

মাল্টিপ্রজেক্টগুলিতে গাছগুলির কাঠামো রয়েছে - তাই আপনি প্যারেন্ট পমের এক স্তরে এসেছেন না। আপনার প্রয়োজনের জন্য একটি উপযুক্ত প্রকল্পের পদক্ষেপ নেওয়ার চেষ্টা করুন - একটি ক্লাসিক এক্সম্যাম্পল হল কীভাবে মিউমিটোডুল প্রকল্পগুলিকে বন্টন করা যায়

distibution/
documentation/
myproject/
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml
pom.xml

কয়েকটি বোনাস প্রশ্ন:

  • উত্স নিয়ন্ত্রণ, স্থাপনা ডিরেক্টরি, সাধারণ প্লাগইন ইত্যাদির মতো বিভিন্ন ভাগ করা কনফিগারেশন সংজ্ঞায়নের সেরা স্থানটি কোথায় (আমি পিতা-মাতাকে ধরে নিচ্ছি তবে প্রায়শই আমি এটি কামড়েছি এবং তারা প্রতিটি প্রকল্পের পরিবর্তে শেষ হয়েছে) একটি সাধারণ)।

এই কনফিগারেশনটি বিজ্ঞতার সাথে একটি "সংস্থা" প্যারেন্ট পম এবং প্রকল্পের প্যারেন্ট পম (গুলি) এ বিভক্ত করতে হবে। আপনার প্রকল্পের সমস্ত সম্পর্কিত বিষয়গুলি "কোম্পানী" পিতামাতার কাছে যায় এবং এটি বর্তমান প্রকল্পের সাথে সম্পর্কিত একটির প্রকল্পে যায়।

  • আপনি কীভাবে আপনার মাল্টি-প্রজেক্টগুলি সেট আপ করেন (কীভাবে একটি বিশাল প্রশ্ন, কোনও মাল্টি-প্রজেক্ট বিল্ডটি কীভাবে স্থাপন করা হয়েছে তখন যখন কেউ ধরা পড়েছে তখন এটি আরও বেশি) কীভাবে মেভেন-রিলিজ প্লাগইন, হাডসন এবং নেক্সাস ডিল করবে?

কোম্পানির প্যারেন্ট পমকে প্রথমে মুক্তি দিতে হবে। বহু প্রকল্পের জন্য মানক বিধি প্রযোজ্য। প্রকল্পটি সঠিকভাবে তৈরি করতে সিআই সার্ভারের সমস্ত জানা দরকার।


1
যাতে দুটি ধরণের প্যারেন্ট প্রজেক্ট / পম থাকে। <মডুলস> ঘোষণা ছাড়াই একটি। উত্তরাধিকারের জন্য এটিই ব্যবহৃত হয়। এবং <মাল্টিমিডিউড> ঘোষণার সাথে একটি পিতামাতার প্রকল্প। এটি সাবমডিউলগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় না, এটি হোল্ড প্রকল্পের বিল্ডিং পরিচালনা করার জন্য। আমি কি সঠিক ?
লিসাক

22
  1. স্বতন্ত্র পিতা-মাতার হ'ল কনফিগারেশন এবং অন্যথায় অনিচ্ছাকৃত উপাদানগুলিতে বিকল্পগুলি ভাগ করে নেওয়ার জন্য সেরা অনুশীলন। আইনী নোটিশ এবং কিছু সাধারণ প্যাকেজিং বিকল্পগুলি ভাগ করে নেওয়ার জন্য অ্যাপাচে একটি প্যারেন্ট পম প্রকল্প রয়েছে।

  2. যদি আপনার শীর্ষ-স্তরের প্রকল্পটিতে সত্যিকারের কাজ থাকে যেমন জাভাডোককে একত্রিত করা বা কোনও রিলিজের প্যাকেজিং করা, তবে সেই কাজটি করার জন্য প্রয়োজনীয় সেটিংস এবং পিতামাতার মাধ্যমে আপনি ভাগ করতে চান সেটিংসের মধ্যে আপনার দ্বন্দ্ব থাকবে। কেবলমাত্র পিতা-মাতার প্রকল্প এড়ানো যায়।

  3. একটি সাধারণ প্যাটার্ন (মুহুর্তের জন্য # 1 উপেক্ষা করে) হ'ল প্রকল্পগুলির সাথে কোডগুলি একটি পিতামাতার প্রকল্পটিকে তাদের পিতামাতা হিসাবে ব্যবহার করে এবং এটি পিতামাতার হিসাবে শীর্ষ স্তরের ব্যবহার করে। এটি মূল জিনিসগুলি সবার সাথে ভাগ করে নেওয়ার অনুমতি দেয় তবে # 2 এ বর্ণিত সমস্যা এড়ায়।

  4. অভিভাবকরা ডিরেক্টরি কাঠামোর মতো না হলে সাইট প্লাগইনটি খুব বিভ্রান্ত হবে। আপনি যদি একটি সামগ্রিক সাইট বানাতে চান তবে এটিকে ঘিরে আপনার কিছুটা ফিডিং করতে হবে।

  5. অ্যাপাচি সিএক্সএফ হ'ল # 2 এর একটি নিদর্শন।


2
আমি আইবিলিও দেখেছি এবং অনেকগুলি প্রকল্প "স্বতন্ত্র" প্যারেন্ট পমকে পছন্দ করে। হাইবারনেট, অ্যাক্টিভ কিউ, জেটি, এক্সস্ট্রিম ইত্যাদি যা এটি প্রস্তাব করে যে এটি ডিফাক্টো প্রক্রিয়া।
জ্যামি ম্যাকক্রিন্ডল

2
স্বতন্ত্র পিতা-মাতার আরও খারাপ দিক থেকে মনে হয় যে মভেন রিলিজ প্লাগইনটি প্রকাশিত হওয়ার আগে পিতামাতাকে কোনও সংস্করণে পিন করা উচিত বলে মনে হয়। সম্ভবত কোনও সমস্যা খুব বেশি নয় যেহেতু পিতামাতার খুব বেশি পরিবর্তন করা উচিত নয়।
জেমি ম্যাকক্রিন্ডল

9

তৃতীয় পদ্ধতির সাথে একটি সামান্য ধরা আছে। যেহেতু সমষ্টিগত POMs (মাইপ্রজেক্ট / pom.xML) সাধারণত পিতামাতাই হয় না তাই তারা কনফিগারেশন ভাগ করে না। এর অর্থ এই সমস্ত পোগলগুলিতে কেবলমাত্র ডিফল্ট সংগ্রহস্থল থাকবে have

যদি আপনি কেবলমাত্র সেন্ট্রাল থেকে প্লাগইন ব্যবহার করেন তবে এটি কোনও সমস্যা নয়, তবে আপনি যদি অভ্যন্তরীণ সংগ্রহস্থল থেকে প্লাগইন: লক্ষ্য বিন্যাস ব্যবহার করে প্লাগইন ব্যবহার করেন তবে এটি ব্যর্থ হবে। উদাহরণস্বরূপ, আপনি গোল সরবরাহের foo-maven-pluginগ্রুপআইডির সাথে থাকতে পারেন । আপনি যদি প্রকল্পের মূল থেকে কমান্ড ব্যবহার করে এটি চালানোর চেষ্টা করেন তবে এটি সামগ্রিক মডিউলগুলিতে চালাতে ব্যর্থ হবে ( সামঞ্জস্য নোট দেখুন )।org.examplegenerate-foomvn org.example:foo-maven-plugin:generate-foo

বেশ কয়েকটি সমাধান সম্ভব:

  1. মাভেন সেন্ট্রালটিতে প্লাগইন স্থাপন করুন (সর্বদা সম্ভব নয়)।
  2. আপনার সমস্ত সামগ্রিক পিওএমগুলিতে ডিপোজিটরি বিভাগটি সুনির্দিষ্টভাবে উল্লেখ করুন ( DRY নীতিটি ভঙ্গ করে)।
  3. এই অভ্যন্তরীণ সংগ্রহস্থলটি সেটিংস.এক্সএমএল-এ কনফিগার করা আছে (হয় স্থানীয় সেটিংসগুলিতে settings / .m2 / settings.xML অথবা বৈশ্বিক সেটিংসে /conf/settings.xML এ)। এই সেটিংগুলি ছাড়াই বিল্ডকে ব্যর্থ করে দেবে x
  4. আপনার সামগ্রিক POMs (too
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.