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




dependencies maven-2 maven-metadata (10)

في بعض الأحيان ، لا ترغب في استخدام نطاقات الإصدارات ، لأنه يبدو أنها بطيئة في حل تبعياتك ، خاصة عندما يكون هناك تسليم مستمر في المكان ، وهناك إصدارات كثيرة - خاصة أثناء التطوير الثقيل.

سيكون أحد الحلول لاستخدام maven-versions-plugin . على سبيل المثال ، يمكنك الإعلان عن خاصية:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

وإضافة إصدارات maven-plugin إلى ملف pom الخاص بك:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

ثم ، من أجل تحديث التبعية ، يجب عليك تنفيذ الأهداف:

mvn versions:update-properties validate

إذا كان هناك إصدار أحدث من 1.1.1 ، فسوف يخبرك:

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

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

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

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


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


إذا كنت تريد أن يستخدم 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 بور مان مان".

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


يرجى إلقاء نظرة على هذه الصفحة (قسم "نطاقات إصدار التبعية"). ما قد ترغب في القيام به هو شيء من هذا القبيل

<version>[1.2.3,)</version>

يتم تنفيذ هذه النطاقات الإصدار في Maven2.


ملحوظة:

تنطبق هذه الإجابة على 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 .


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

بدلاً من زيادة إصدار إصدارات التطوير ، يمكنك فقط استخدام إصدار لقطة تستبدل عند الضرورة ، مما يعني أنك لن تحتاج إلى تغيير علامة الإصدار على كل تغيير طفيف. شيء مثل 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>


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

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

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

-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

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

-Djaxp.debug=1

إلى سطر الأوامر.





java maven dependencies maven-2 maven-metadata