মাল্টি-মডিউল মাভেন প্রকল্প তৈরি করতে একটি বড় প্রকল্প বিভক্ত করা


23

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

বর্তমানে, আমরা ROOT.warআমাদের সার্ভারে অ্যাপাচি টমক্যাটের মতো একটি একক ওয়ার ফাইলটি স্থাপন করছি । প্রকল্পটি বড় হওয়ায় বিজ্ঞপ্তি এবং ইমেল, তৃতীয় পক্ষের পরিষেবা, পুশ (কমডেট), আরইএসটি এপিআই ইত্যাদির মতো ওয়েব অ্যাপে অংশ রয়েছে are বর্তমানে এগুলি সমস্তই ক্লাবযুক্ত এবং একে অপরের উপর নির্ভরশীল। উদাহরণস্বরূপ, Notificationঅবজেক্টগুলি বস্তুর উপরও নির্ভর করে Person, কারণ বিজ্ঞপ্তিগুলি ব্যবহারকারীদের জন্য উপযুক্ত tail

বড় প্রকল্পটি বিভক্ত করার মূল উদ্দেশ্যটি হ'ল পৃথক মডিউলগুলিতে কাজ করা, বাগ ফিক্সগুলি, বৈশিষ্ট্য যোগ করা, পরীক্ষা করা ইত্যাদি And এবং সন্তুষ্ট হলে কেবলমাত্র এই মডিউলটিকে পুরো অ্যাপ্লিকেশনটির পরিবর্তে সার্ভারে প্রতিস্থাপন করা যেতে পারে। এটা কি সম্ভব?

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

যেমনটি আমি বলেছি, অভিপ্রায়টি হ'ল পৃথক মডিউলগুলিতে কাজ করা এবং সেগুলি স্থাপন করতে সক্ষম (পছন্দসই গরম)। বর্তমানে আমাদের কাছে কেবলমাত্র একটি ওয়ার্ল্ড ফাইল রয়েছে ROOT.war। বিভাজন একাধিক যুদ্ধ ফাইল তৈরি করবে, যা তখন ইউআরএল দ্বারা উল্লেখ করা হয় domain-name.com/module_name/some_mapping?

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

বর্তমানে আমি বসন্ত থেকে প্যারেন্ট POM ব্যবহার করছি:

<parent>
    <groupId>io.spring.platform</groupId>
    <artifactId>platform-bom</artifactId>
    <version>1.1.3.RELEASE</version>
    <relativePath />
</parent>

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

উত্তর:


20

এটা কি সম্ভব ?

হ্যাঁ, অবশ্যই. আমার অতীতের কাঠামোয় এর মতো কয়েকটি প্রকল্প রয়েছে, এখানে কিছু বিট আশা করি আপনি শুরু করবেন।

মাভেনের দুটি প্রধান বৈশিষ্ট্য রয়েছে যা আপনি একসাথে জিনিসগুলি বুনতে ব্যবহার করবেন:

ভাগ এবং বিজয়

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

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

ভাল সরঞ্জাম

এখানে চেয়ে:

না-এত সুন্দর সরঞ্জাম

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

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

আপনার অ্যাপ্লিকেশনের মূল অংশগুলি, একবার প্রকল্পগুলিতে বিভক্ত হয়ে মডিউল হিসাবে একত্রে রাখা যেতে পারে। সাধারণত আপনি এগুলিকে আপনার অ্যাপ্লিকেশনের মূল উত্স ফোল্ডারের সাব-ফোল্ডার হিসাবে স্থাপন করবেন।

এছাড়াও আপনার অ্যাপ্লিকেশনের জন্য আপনার প্যারেন্ট পম-এ মডিউল ঘোষণা থাকবে। আপনি সেখানে আপনার অ্যাপের সমস্ত সাধারণ নির্ভরতা স্থাপনের পাশাপাশি বেশিরভাগ বিল্ড প্লাগইন এবং তাদের কনফিগারেশন ঘোষণা করতে পারবেন। এখানে আমি দৃly়রূপে প্রত্যাহার করছি আপনি অ্যাপ্লিকেশনটির সংস্করণ হিসাবে মডিউলগুলিতে পুনরায় ব্যবহার করতে পারেন এমন জিনিসের জন্য বৈশিষ্ট্যের একটি গ্রুপ রাখুন place যখন সমস্ত কিছুতে একই সংস্করণ থাকে এবং সংস্করণটি এক জায়গায় করা কেবল এটি কাজ করে তখন পরিচালনা করা অনেক সহজ।

সাধনী দ্বারা প্রয়োগকরণ

আপনি যদি 1 এর চেয়ে বড় একটি দল হন তবে আমি দৃ strongly়রূপে পুনরুদ্ধার করব যে আপনি আপনার মাভেন নির্ভরতার জন্য একটি সংগ্রহস্থল ইনস্টল করেছেন। এ Artifactory , নেক্সাস বা Archiva । আপনি সরাসরি এগুলিতে ইনস্টল করার জন্য পিওএম ফাইলটি কনফিগার করতে পারেন যাতে এটি চালানো একবার ওভারহেডের বেশি হওয়া উচিত নয় তবে সঠিকভাবে সঠিক জারের সাথে নির্ভরতাগুলি সমাধান করতে আপনার দলকে অনেক সময় সাশ্রয় করবে।

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

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

উদাহরণ

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

উদাহরণস্বরূপ জেনকিনস নিন :

আপনি দেখতে পারেন তাদের পিতামাতাদের পিওএম বেশ বিস্তৃত।

আপনি এই বিভাগে দেখতে পারেন তারা মডিউল ব্যবহার করে:

<modules>
    <module>core</module>
    <module>war</module>
    <module>test</module>
    <module>cli</module>
</modules>

এবং প্রতিটি মডিউল একই নামের সাথে একটি সাব-ফোল্ডারটি সম্পর্কিত যা একটি পিওএমও ধারণ করে। আপনি এটির মতো যতগুলি বাসা বাঁধতে পারেন, তবে এটি বিষ্ঠা স্তরের মধ্যে রাখুন;)।

ছোট শুরু করুন

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

ম্যাভেন একটি দুর্দান্ত সরঞ্জাম তবে এটি ঘাড়েও প্রচন্ড ব্যথা হতে পারে বিশেষত যখন জিনিসগুলি আপনার পথে চলে না। আপনার প্রথম যেতে যেতে পুরো ঘৃণার সাথে শুরু করা বিপর্যয়ের একটি রেসিপি (আমার জন্য ছিল!)।

যদি বিষয়গুলি কিছুটা অদ্ভুত হয় তবে আপনি সর্বদা mvn help:effective-pomকমান্ডটি মাভেন কী বুঝতে পেরেছেন তা দেখতে ব্যবহার করতে পারেন।

প্লাগ-ইন

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

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

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

মডিউল এবং নির্ভরতার মধ্যে মূল পার্থক্য হ'ল:

  • মডিউলগুলি মূল অ্যাপ্লিকেশন হিসাবে একই উত্স গাছটিতে উপ-ফোল্ডার হিসাবে আদর্শভাবে বাস করবে।
  • নির্ভরতা যে কোনও জায়গায় হতে পারে।

আপনি বাইবেল জানতে পারেন এখানে

ভাগ্য ভালো, এই সাহায্য আশা করি.


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

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

আমি মনে করি আমরা মাভেন নির্ভরতা হিসাবে সরাসরি আমাদের প্রকল্পের অংশগুলি যুক্ত করতে যাব। এইভাবে, আমরা সরাসরি প্রকল্পের অংশগুলিতে কাজ করতে পারি। আমার কেবল একটি প্রশ্ন ছিল, যদি আমরা POM.xML এর নির্ভরতা হিসাবে সাব-প্রজেক্টগুলির মধ্যে একটি যোগ করি, সংস্করণটি 2.0.0 বলি, এবং তারপরে কিছু পরিবর্তনগুলি সহ আমরা মডিউলটির একটি 2.0.1 সোনটাইপকে ধাক্কা দিই, আমরা কীভাবে পারি? 2.0-তে যাওয়ার জন্য মূল-মডিউলটিকে সরাসরি বলুন, কেবলমাত্র ROOT.war এর মধ্যে POM.xML পরিবর্তন করা হবে এবং ROOT ডিরেক্টরি মুছে ফেলা যথেষ্ট। মূল উদ্দেশ্য সার্ভারটি বন্ধ করা নয়। ধন্যবাদ.
আমরা

পোম.এক্সএমএল একবার যুদ্ধ তৈরি হওয়ার পরে কোনও ফল দেয় না, তা টমক্যাট (বা আপনি যে কোনও ধারক ব্যবহার করেন) এই ফাইলটি ব্যবহার করে না। ফাইলটি ম্যাভেন দ্বারা একটি নতুন যুদ্ধ ফাইল তৈরি করতে ব্যবহৃত হয়, যার ফলস্বরূপ আপনাকে সার্ভারে স্থাপন করতে হবে। সুতরাং চক্রটি কোডে কাজ করছে, একটি জার ফাইল তৈরি করবে, যুদ্ধের পিওএম-এ সংস্করণ আপডেট করবে, একটি যুদ্ধ ফাইল তৈরি করবে, নতুন যুদ্ধের ফাইলের সাথে সার্ভার আপডেট করবে। কিছু সার্ভার হট রি-মোতায়েনকে সমর্থন করবে যদিও সাধারণত এটি কয়েক সেকেন্ডের জন্য অ্যাপ্লিকেশনটি বন্ধ করে দেয়।
নিউটোপিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.