آشنایی با Maven Central و JCenter

مخازن بستههای نرمافزاری، محلی برای بهاشتراکگذاری کتابخانههای جاوا هستند. وقتی برای مدیریت وابستگیهای یک پروژۀ جاوا از ابزارهایی مانند Maven و Gradle استفاده میکنیم، فایلهای مورد نیاز، از این مخازن دریافت میشوند. در این نوشته با دو مخزن بزرگ جاوا یعنی Maven Central و JCenter آشنا خواهیم شد.
نیازی به اختراع دوبارۀ چرخ نیست. بازنویسی کدهایی که قبلا نوشته، تست و منتشر شده و در دسترس همگان قرار گرفته، جز برای اهداف آموزشی، کار معقولی نیست. در نتیجه امروزه هر برنامهنویسی بخش عمدهای از وقت خود را به آشنایی با کتابخانههای آماده و روش استفاده از آنها در پروژههای خود اختصاص میدهد.
در اکوسیستم جاوا، کدهای آماده به شکل فایلهای jar عرضه میشوند. مقدماتیترین روش استفاده از این بستهها به این شکل است: فایل را دانلود کرده و در محل مناسبی از حافظۀ سیستم ذخیره میکنیم. سپس، هنگام کامپایل و اجرای کدها Classpath را طوری تنظیم میکنیم که دستورهای javac و java قادر به پیدا کردن آنها باشند.
آنچه شرح داده شد «مدیریت وابستگیهای پروژه» یا dependency management است. طبیعتا ابزارهایی وجود دارد که در این زمینه به برنامهنویسان کمک کند. Maven ،Ant و Gradle چند ابزارند که میتوانند مدیریت وابستگی را نیز انجام دهند. هر چند مدیریت وابستگی تنها بخشی از تواناییهای آنهاست.
جیسون ون زیل[1] توسعهدهندۀ Maven تاریخچۀ ساخت این نرمافزار را به این شکل توضیح میدهد:
حدود سال 2002 بود که درگیر پروژۀ Turbine بودیم. کار اصلی در این پروژه جدا کردن سه لایۀ داده، سرویس و وب بود. در نتیجه برای هر کدام از این ماژولها روال Build جداگانهای باید طی میشد و یک کار تکراری و مشابه برای همۀ پروژهها به کرات انجام میگرفت. آن روزها راهی برای این که Buildهای Ant را در یک قالب تکراری بیندازیم وجود نداشت و هر بلید Ant کاملا متفاوت به نظر میآمد و این روال بی ثمر و زجرآور شده بود. همینجا بود که مقدمات ساخت Maven چیده شد. این نرمافزار یک چینش استاندارد برای فایلهای پروژه پیشنهاد میکند و روال پیشفرضی برای Build یک پروژه دارد، هر چند تکتک این تنظیمات قابل تغییر و شخصیسازی است. با پذیرش پیشنهادهای Maven، بسیاری از تنظیمات به صورت خودکار اعمال میشوند (convention over configuration) و با تشابه ساختار پروژه به دیگر پروژههای Maven، برنامهنویسان جدید میتوانند بهسادگی پروژه را شناخته و شروع به تعامل با آن کنند.
چیز دیگری که توجه مرا جلب کرد، Jarهایی بودند که پروژه به آنها وابسته بود. این فایلها بر روی CVS ذخیره شده بودند. به عنوان مثال چندین کپی از Xerces در جاهای مختلف ذخیره کرده بودیم و کاری که میکردیم واقعا اتلاف حجم بود. علاوه بر این، هر بار که نسخه جدیدی از Xerces عرضه میشد، باید نسخۀ جدید را برای تمام پروژهها جداگانه بارگذاری میکردیم. ایدهای به ذهنمان رسید: هر پروژه وابستگیهای خود را اعلام و به شکل استانداردی لیست کند. همچنین شروع به ساخت یک مخزن، حاوی بستههای مورد نیاز در طول Build کردیم. ابتدا ایده را با Apache مطرح کردیم و به این نتیجه رسیدیم امکان هاستینگ بستههایی که سازگار با روال Apache نیست، توسط آنها وجود ندارد. سپس با ibiblio مرتبط شدیم و کار را به کمک آنها آغاز کردیم. ماحصل کار تولید maven و مخزن Maven Central بود.
Maven Central، به صورت خلاصه، یک پایگاه دادۀ عظیم است که تولیدکنندگان بستههای نرمافزاری جاوا میتوانند ماحصل کار خود را به شکل استانداردی آماده کرده و در آن قرار دهند. به این صورت، بسته در اختیار افراد مشتاق به استفاده قرار میگیرد.
artifactهای ارائهشده در این مخزن، باید با ارائۀ gorupID و artifactID و همچنین مشخص کردن نسخۀ بسته، به صورت منحصربهفردی نامگذاری شوند. همچنین یک سری اطلاعات جانبی در قالب فایل pom.xml باید ارائه شود.
اما آیا تولید کتابخانههای آماده و انتشار آنها تنها بین کاربران جاوا اتفاق میافتد؟ پاسخ منفی است.
نرمافزارهای مدیریت بسته در دنیای لینوکس مانند rpm ،yum و… به طرز مشابهی از مخازنی مثل RPMFusion ،EPEL و … استفاده میکنند.
برنامهنویسان جاوا اسکریپت با استفاده از npm و از مرکزی به نام npmjs بستههای نرمافزاری مطلوبشان را دریافت میکنند.
همچنین، Nuget یک نرمافزار مدیریت بستههای نرمافزاری متنباز و رایگان است که اولین بار به عنوان افزونهای برای Visual Studio ارائه شد. این نرمافزار بستههای Net Framework. و ++C را مدیریت میکند.
برای کسی که میخواهد از بستههای تولیدشده استفاده کند، جامعیت، سرعت بالا و سادگی تعامل با مخزن شاید کافی به نظر برسد. حال بیایید از دید افرادی که بستهها را تولید و منتشر میکنند نگاه کنیم. چه امکاناتی میتواند برای آنها مفید باشد؟
امروزه تولیدکنندگان، با استفاده از مشیهای نوین مهندسی نرمافزار، مانند Continuous Delivery تلاش میکنند ساخت، تست و انتشار محصول را خودکار کرده به بیشترین سرعت و بازدهی دست یابند. سازگاری مخازن با ابزارهای نرمافزاری و روالهای مهندسی مذکور بسیار کارا خواهد بود.
میتوان مخازن خصوصی تولید کرده و به سازندگان بستهها اجازه داد دسترسی کاربران به دانلود، آپلود و مشاهدۀ محتویات مخازن را مدیریت کنند. همچنین اگر بتوان دسترسی کاربران را با استفاده از معیارهایی مثل IP و منطقۀ جغرافیایی آنها کنترل کرد، فرصتهای جدیدی در اختیار عرضهکنندگان قرار گرفته است. ایجاد امکان دانلود پس از پذیرش توافقنامه (EULA) و احراز هویت متقاضیان نیز بسیار راهگشا خواهد بود.
JFrog Bintray یک سیستم توزیع یکپارچه است که تمام اکوسیستمهای نرمافزاری رایج را پشتیبانی میکند. این سیستم علاوه بر پشتیبانی از تمام امکاناتی که در سطرهای فوق به آنها اشاره کردیم، با داشتن امکاناتی مانند CDN (شبکۀ توزیع محتوا) خدمات بیمثالی در اختار تولیدکنندگان بستههای نرمافزاری قرار میدهد.
Bintray دارای دو مخزن مرکزی با نامها JCenter و Canon-Center است. مخازن مرکزی، مخازنی هستند که توسط تیم Bintray مدیریت شده و بستههایی توسط عرضهکنندگانی از سراسر جهان در آنها آپلود میشود. استفاده از این مخازن چند مزیت دارد:
- بستۀ نرمافزاری در اختیار گروه بزرگتری از جامعۀ توسعهدهندگان قرار میگیرد.
- حتی پس از عرضۀ نرمافزار در این مخازن نیز حق مالکیت کامل در اختیار تولیدکنندگان است.
- این مخازن به خوبی مدیریت شده و انتشار در آنها میتواند بر حسن شهرت بسته بیفزاید.
JCenter یک مخزن Mavenای عالی است که توسط گروه Bintray مدیریت میشود و تمام محتویات آن برای کاربران Bintray قابل دستیابی است.
اما آیا JCenter مزیتی نسبت به Maven Central دارد؟ JFrog مدعی است دلایل قابل قبولی برای ترجیح JCenter بر Maven Central وجود دارد:
- JCenter محتوای مورد تقاضا را در یک CDN منتشر میکند؛ در نتیجه میتواند سرعت بالاتری عرضه کرده و موجب تسریع در فرایندهای CI و CD شود.
- JCenter بزرگترین مخزن جاواست. هر چیزی که در مخازن Maven Central وجود دارد، در داخل JCenter هم قابل دستیابی است.
- کار با JCenter بسیار ساده است. هنگام بارگذاری بستهها هیچ نیازی به کارهای پیچیدهای مانند امضای فایل که هنگام بارگذاری فایل به Maven Central با آنها درگیر میشویم، نیست.
- واسط گرافیکی آن بسیار کاربرپسند است.
- اگر بستهای را در مخزن JCenter منتشر کرده و بخواهید در مخزن Maven Central نیز موجود باشد، به سادگی و تنها با یک کلیک، Bintray این کار را برای شما انجام خواهد داد.
شاید به همین دلیل است که ابزار Build جدیدی همچون Gradle، هنگام ساخت یک پروژۀ جاوا با تنظیمات اولیه، JCenter را به عنوان مخزن پیشفرضِ دانلود وابستگیها در نظر میگیرد.
مخزن Maven Central از این آدرس، و مخزن JCenter از این آدرس بستهها را بازیابی میکنند. همچنین Maven Central از این لینک و JCenter از این لینک برای پیمایش و جستجو با استفاده از واسط گرافیکی کاربرپسند در دسترس است.
منابع
History of Maven
Introduction to Repositories – Maven documentation
JFrog.com
Bintray.com
yum Repositories
Repositories in Gradle-Gradle documentation
[1] Jason van Zyl
سلام و خسته نباشید
خیلی عالی بود
فقط کاش با توجه به اینکه jCenter فیلتر هست یه راه حلی هم برای این مشکل مینوشتید