java - كيف يمكنني إخبار Maven باستخدام أحدث إصدار من التبعية؟




dependencies maven-2 (8)

في Maven ، عادة ما يتم إعداد التبعيات على النحو التالي:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

الآن ، إذا كنت تعمل مع المكتبات التي تحتوي على إصدارات متكررة ، فإن تحديث العلامة <version> باستمرار يمكن أن يكون مزعجًا بعض الشيء. هل هناك أي طريقة لإخبار Maven دائمًا باستخدام أحدث إصدار متاح (من المستودع)؟


إذا كنت تريد أن يستخدم Maven أحدث إصدار من التبعية ، فيمكنك استخدام maven-versions-plugin وكيفية استخدام هذا المكون الإضافي ، فقد أعطى تيم إجابة جيدة بالفعل ، اتبع answer .

ولكن كمطور ، لن أنصح بهذا النوع من الممارسات. لماذا ا؟

الإجابة على سبب إعطاء باسكال ثيفينت في تعليق السؤال

أنا حقا لا أوصي هذه الممارسة (ولا تستخدم إصدارات النطاقات) من أجل بناء استنساخه. بناء الذي يبدأ فجأة فشل لسبب غير معروف هو وسيلة مزعج أكثر من تحديث رقم الإصدار يدويا.

سأوصي بهذا النوع من الممارسة:

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

يسهل صيانته وتصحيحه. يمكنك تحديث POM الخاص بك في أي وقت من الأوقات.


الآن أعلم أن هذا الموضوع قديم ، ولكن عند قراءة السؤال وإجابة OP المقدمة ، يبدو أن برنامج maven-versions-plugin ربما كان بالفعل أفضل إجابة لسؤاله:

على وجه الخصوص يمكن أن تكون الأهداف التالية مفيدة:

  • الإصدارات: تستخدم أحدث الإصدارات إصدارات pom لجميع الإصدارات التي كانت إصدارًا أحدث وتستبدلها بأحدث إصدار.
  • الإصدارات: تستخدم أحدث الإصدارات عمليات البحث عن جميع الإصدارات غير التابعة لـ SNAPSHOT والتي تم إصدارها حديثًا وتحل محلها بأحدث إصدار.
  • الإصدارات: تحديث خصائص الخصائص المحددة في مشروع بحيث تتوافق مع أحدث إصدار متاح من التبعيات المحددة. يمكن أن يكون هذا مفيدًا إذا كانت مجموعة من التبعيات مقفلة بإصدار واحد.

يتم توفير الأهداف الأخرى التالية أيضًا:

  • الإصدارات: تحديثات التبعية للعرض تقوم بفحص تبعيات المشروع وتصدر تقريرًا عن تلك التبعيات التي تتوفر بها إصدارات أحدث.
  • الإصدارات: تعرض تحديثات المكونات الإضافية للمكونات الإضافية للمكونات وينتج عنها تقرير عن هذه المكونات الإضافية التي تتوفر بها إصدارات أحدث.
  • إصدارات: التحديث - تحديث الأصل القسم الأصل من مشروع بحيث تشير أحدث إصدار متوفر. على سبيل المثال ، إذا كنت تستخدم POM جذر الشركة ، يمكن أن يكون هذا الهدف مفيدًا إذا كنت بحاجة إلى التأكد من أنك تستخدم أحدث إصدار من جذر POM للشركة.
  • إصدارات: تحديث الوحدات النمطية التابعة بتحديث القسم الأصل من الوحدات النمطية التابعة للمشروع بحيث يطابق الإصدار إصدار المشروع الحالي. على سبيل المثال ، إذا كان لديك مجمّع pom هو أيضًا الأصل للمشروعات التي يتم تجميعها وإخراج إصدارات الأطفال والوالدين من المزامنة ، فيمكن أن يساعد هذا mojo في إصلاح إصدارات الوحدات النمطية الفرعية. (ملاحظة قد تحتاج إلى استدعاء Maven مع خيار -N لتشغيل هذا الهدف إذا كان المشروع الخاص بك مقطوعة بشدة بحيث لا يمكن إنشاء بسبب mis-match النسخة).
  • الإصدارات: لقطات القفل يبحث في بوم لجميع الإصدارات -SNAPSHOT ويستبدلها مع نسخة الطابع الزمني الحالية من ذلك -SNAPSHOT ، على سبيل المثال -20090327.172306-4
  • الإصدارات: تفتح اللقطات-اللقطات pom بحثًا عن جميع إصدارات لقطة المقفلة المؤقتة وتستبدلها بـ -SNAPSHOT.
  • الإصدارات: تقوم نطاقات العزم بالبحث عن تبعيات باستخدام نطاقات الإصدار وتحل النطاق إلى إصدار محدد يتم استخدامه.
  • الإصدارات: تستخدم إصدارات الاستخدام pom للإصدارات all -SNAPSHOT التي تم إصدارها واستبدالها بنسخة الإصدار المقابلة.
  • الإصدارات: استخدام الإصدارات التالية يبحث في pom عن جميع الإصدارات غير SNAPSHOT التي تم إصدار أحدث واستبدالها مع الإصدار التالي من الإصدار.
  • الإصدارات: تستخدم الإصدارات التالية استخدام pom لجميع الإصدارات التي كانت إصدارًا أحدث وتستبدلها بالإصدار التالي.
  • الإصدارات: الالتزام بإزالة ملفات pom.xml.versionsBackup. يشكل نصف واحد من المدمج في "SCM بور مان مان".
  • الإصدارات: استعادة استعادة ملفات pom.xml من ملفات pom.xml.versionsBackup. يشكل نصف واحد من المدمج في "SCM بور مان مان".

ظننت أنني سأدرجها في أي إشارة مستقبلية.


على عكس الآخرين ، أعتقد أن هناك العديد من الأسباب التي قد تجعلك دائمًا ترغب في الحصول على أحدث إصدار. خاصة إذا كنت تقوم بالانتشار المستمر (في بعض الأحيان يكون لدينا 5 إصدارات في يوم واحد) ولا ترغب في القيام بمشروع متعدد الوحدات.

ما أقوم به هو جعل Hudson / Jenkins يقوم بما يلي لكل بناء:

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true

هذا هو استخدام البرنامج المساعد الإصدارات والإضافات SCM لتحديث التبعيات ومن ثم التحقق من ذلك إلى التحكم في المصدر. نعم لقد تركت CI القيام SCM checkins (التي يجب عليك القيام به على أي حال للمكون الإصدار الإفراج مخضرم).

ستحتاج إلى إعداد المكون الإضافي للإصدارات لتحديث ما تريده فقط:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>1.2</version>
            <configuration>
                <includesList>com.snaphop</includesList>
                <generateBackupPoms>false</generateBackupPoms>
                <allowSnapshots>true</allowSnapshots>
            </configuration>
        </plugin>

أستخدم المكوّن الإضافي للإصدار للقيام بالإصدار الذي يعتني بـ -SNAPSHOT ويتحقق من وجود نسخة إصدار -SNAPSHOT (وهو أمر مهم).

إذا فعلت ما أفعله ، فستحصل على أحدث إصدار لجميع إصدارات لقطة وأحدث إصدار إصدار لبنى الإصدار. سوف تكون بنياتك أيضًا قابلة للتكرار.

تحديث

لاحظت بعض التعليقات تطلب بعض التفاصيل من سير العمل هذا. سأقول أننا لا نستخدم هذه الطريقة بعد الآن ، والسبب الكبير وراء أن المكوِّن الإضافي للمافينات هو عربات التي تجرها الدواب ، وبوجه عام يعاني من خلل في الأصل.

انها معيبة بسبب تشغيل البرنامج المساعد للنسخ لضبط النسخ تحتاج كل الإصدارات الموجودة إلى أن تكون موجودة لتعمل بشكل صحيح. هذا لا يمكن تحديث إصدارات البرنامج الإضافي إلى أحدث إصدار من أي شيء إذا لم يتمكن من العثور على الإصدار المشار إليه في ملف pom. هذا هو في الواقع مزعج إلى حد ما في كثير من الأحيان تنظيف الإصدارات القديمة لأسباب مساحة القرص.

حقا تحتاج إلى أداة منفصلة من مخضرم لضبط الإصدارات (حتى لا تعتمد على ملف pom لتشغيله بشكل صحيح). لقد كتبت مثل هذه الأداة في اللغة المنخفضة التي هي باش. سيقوم البرنامج النصي بتحديث الإصدارات مثل المكون الإضافي للإصدار وتحقق من pom مرة أخرى إلى عنصر تحكم المصدر. كما أنه يعمل مثل 100x أسرع من المكوِّن الإضافي mvn. للأسف لم يكتب بطريقة للاستخدام العام ولكن إذا كان الناس مهتمين يمكنني أن أجعل ذلك ووضعه في gistub أو github.

العودة إلى سير العمل كما سالت بعض التعليقات عن أن هذا ما نفعله:

  1. لدينا 20 مشروعًا أو نحو ذلك في مستودعاتهم الخاصة مع وظائف جنكينز الخاصة بهم
  2. عندما نطلق سراح البرنامج المساعد الإفراج maven يستخدم. يتم تغطية سير العمل في ذلك في وثائق البرنامج المساعد. نوع البرنامج المساعد الافراج عن مخدر من تمتص (وأنا أكون لطفاء) لكنه لا يعمل. في يوم من الأيام نخطط لاستبدال هذه الطريقة بشيء أكثر مثالية.
  3. عندما يحصل أحد المشاريع على jenkins ثم يدير وظيفة خاصة سوف ندعو التحديث كل وظيفة الإصدارات (كيف jenkins يعرف أن إطلاق سراح هو وسيلة معقدة في جزء منه لأن البرنامج المساعد الافراج عن mensen jenkins هو crappy جميلة كذلك).
  4. تحديث جميع وظائف الإصدارات يعرف عن جميع المشاريع العشرين. هو في الواقع pom مجمع أن تكون محددة مع جميع المشاريع في قسم الوحدات في ترتيب التبعية. Jenkins يدير السحر لدينا رائع / bash foo التي ستسحب جميع المشاريع تحديث الإصدارات إلى الأحدث ، ومن ثم التحقق من بومس (مرة أخرى في ترتيب التبعية على أساس قسم الوحدات).
  5. لكل مشروع إذا تغيرت قيمة pom (بسبب تغيير نسخة في بعض التبعية) يتم إيداعها ثم نقوم فوراً بتنفيذ ping jenkins لتشغيل المهمة المقابلة لذلك المشروع (هذا هو الحفاظ على ترتيب تبعية البناء وإلا فإنك تحت رحمة من SCM Poll Scheduler).

عند هذه النقطة أنا من رأي أنه أمر جيد أن يكون الإصدار والإصدار التلقائي أداة منفصلة عن بناء العامة الخاصة بك على أي حال.

الآن قد تعتقد أن نوع muffen من المصات بسبب المشاكل المذكورة أعلاه ولكن هذا في الواقع سيكون من الصعب إلى حد ما مع أداة بناء التي ليس لديها تعريفية سهلة لتحليل بناء الجملة قابلة للتمديد (ويعرف أيضا باسم XML).

في الواقع ، نضيف سمات XML مخصصة من خلال مساحات الأسماء للمساعدة في التلميحات النصية bash / groovy (على سبيل المثال لا تقم بتحديث هذا الإصدار).


في الوقت الذي تم طرح هذا السؤال كان هناك بعض الخلل مع نطاقات الإصدار في maven ، ولكن تم حل هذه في إصدارات أحدث من maven. تلتقط هذه المقالة جيدًا كيفية عمل نطاقات الإصدارات وأفضل الممارسات لفهم كيفية فهم maven بشكل أفضل: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855


من يستخدم أي وقت مضى ، يرجى التأكد من أن لديك -U وإلا لن يتم سحب اللقطة الأخيرة.

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories

هل ربما تعتمد على إصدارات التطوير التي من الواضح أنها تغير الكثير أثناء التطوير؟

بدلاً من زيادة إصدار إصدارات التطوير ، يمكنك فقط استخدام إصدار لقطة تستبدل عند الضرورة ، مما يعني أنك لن تحتاج إلى تغيير علامة الإصدار على كل تغيير طفيف. شيء مثل 1.0-SNAPSHOT ...

ولكن ربما كنت تحاول تحقيق شيء آخر ؛)


يوجد بناء جملة التبعيات في وثائق مواصفات متطلبات إصدار التبعية . هنا هو للاكتمال:

تعريف عنصر version التبعيات متطلبات الإصدار ، وتستخدم لحساب إصدار التبعية الفعالة. متطلبات الإصدار لها الصيغة التالية:

  • 1.0 : متطلبات "Soft" على 1.0 (مجرد توصية ، إذا كان يطابق كافة النطاقات الأخرى للتبعية)
  • [1.0] : متطلبات "صلبة" على 1.0
  • (,1.0] : x <= 1.0
  • [1.2,1.3] : 1.2 <= x <= 1.3
  • [1.0,2.0) : 1.0 <= x <2.0
  • [1.5,) : x> = 1.5
  • (,1.0],[1.2,) : x <= 1.0 أو x> = 1.2؛ مجموعات متعددة مفصولة بفواصل
  • (,1.1),(1.1,) : هذا يستثني 1.1 (على سبيل المثال إذا كان معروفًا أنه لا يعمل مع هذه المكتبة)

في حالتك ، يمكنك فعل شيء مثل <version>[1.2.3,)</version>


ملحوظة:

تنطبق هذه الإجابة على Maven 2 فقط! لقد تم إسقاط التجميعات السابقة و RELEASE المذكورة في Maven 3 "من أجل الإنشاءات القابلة للتكاثر" ، منذ أكثر من 6 سنوات. يرجى الرجوع إلى هذا الحل متوافق مع Maven 3 .

إذا كنت ترغب دائمًا في استخدام الإصدار الأحدث ، فسيكون لدى Maven كلمتين رئيسيتين يمكنك استخدامهما كبديل لنطاقات الإصدارات. يجب عليك استخدام هذه الخيارات بعناية لأنك لم تعد تتحكم في المكونات الإضافية / التبعيات التي تستخدمها.

عندما تعتمد على مكون إضافي أو تبعية ، يمكنك استخدام قيمة إصدار من أحدث أو RELEASE. تشير LATEST إلى أحدث إصدار أو لقطة من قطعة أثرية معينة ، وهي أحدث قطعة تم نشرها في مستودع معين. يشير RELEASE إلى آخر إصدار غير اللقطات في المستودع. بشكل عام ، ليس من أفضل الممارسات تصميم البرامج التي تعتمد على إصدار غير محدد من القطع الأثرية. إذا كنت تقوم بتطوير البرامج ، فقد ترغب في استخدام RELEASE أو LATEST كوسيلة راحة بحيث لا تحتاج إلى تحديث أرقام الإصدارات عند إصدار إصدار جديد من مكتبة الجهة الخارجية. عند إصدار البرنامج ، يجب عليك دائمًا التأكد من أن مشروعك يعتمد على إصدارات محددة لتقليل فرص بناءك أو تأثر مشروعك بإصدار برنامج لا يقع تحت سيطرتك. استخدم أحدث و RELEASE بحذر ، إذا كان على الإطلاق.

راجع قسم POM بناء الجملة من كتاب Maven لمزيد من التفاصيل. أو يمكنك الاطلاع على هذا المستند في نطاقات إصدار التبعية ، حيث:

  • قوس مربع ( [ & ] ) يعني "مغلق" (شامل).
  • أقواس ( ( & ) ) تعني "فتح" (خاص).

إليك مثال يوضح الخيارات المختلفة. في مستودع Maven ، يحتوي com.foo:my-foo على البيانات الوصفية التالية:

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

إذا كان الاعتماد على هذا العنصر ضروريًا ، فلديك الخيارات التالية (يمكن تحديد نطاقات الإصدار الأخرى بالطبع ، فقط إظهار الكلمات ذات الصلة هنا):

قم بالإعلان عن إصدار دقيق (سيتم حلها دائمًا إلى 1.0.1):

<version>[1.0.1]</version>

قم بالإعلان عن إصدار صريح (سيحل دائمًا إلى 1.0.1 ما لم يحدث تصادم ، عندما يحدد Maven إصدارًا مطابقًا):

<version>1.0.1</version>

قم بتعريف نطاق إصدار لكل 1.x (سيتم حلها حاليًا إلى 1.1.1):

<version>[1.0.0,2.0.0)</version>

قم بتعريف نطاق إصدار مفتوح (ستحل إلى 2.0.0):

<version>[1.0.0,)</version>

قم بتعريف الإصدار كـ LATEST (سيتم حل إلى 2.0.0) (إزالة من maven 3.x)

<version>LATEST</version>

إعلان الإصدار كـ RELEASE (سيتم حل 1.1.1) (إزالة من maven 3.x):

<version>RELEASE</version>

لاحظ أن عمليات النشر الخاصة بك ستقوم بتحديث الإدخال "الأحدث" في البيانات الوصفية لـ Maven ، ولكن لتحديث الإدخال "release" ، ستحتاج إلى تنشيط "ملف التعريف" من Maven super POM . يمكنك القيام بذلك باستخدام "-Prelease-profile" أو "-DperformRelease = true"

تجدر الإشارة إلى أن أي نهج يسمح لـ Maven باختيار نسخ التبعية (LATEST ، RELEASE ، ونطاقات الإصدار) يمكن أن يتركك مفتوحًا لبناء مشكلات الوقت ، حيث أن الإصدارات اللاحقة يمكن أن يكون لها سلوك مختلف (على سبيل المثال ، قام المكوِّن الإضافي للتبعية بتبديل افتراضي قيمة من الصواب إلى الكاذب ، مع نتائج مربكة).

ولذلك فمن الأفضل بشكل عام تعريف الإصدارات الدقيقة في الإصدارات. كما يشير جواب تيم ، فإن maven-versions-plugin هو أداة مفيدة لتحديث إصدارات التبعية ، خاصة versions:use-latest-versions versions:use-latest-releases أهداف versions:use-latest-releases .





maven-metadata