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

StackOverflow https://stackoverflow.com/questions/30571

سؤال

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

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

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

هل كانت مفيدة؟

المحلول

ملحوظة:

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


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

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

انظر قسم بناء جملة 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>

قم بتعريف الإصدار على أنه الأحدث (سيتم تحويله إلى 2.0.0) (تمت إزالته من maven 3.x)

<version>LATEST</version>

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

<version>RELEASE</version>

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


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

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

نصائح أخرى

أعلم الآن أن هذا الموضوع قديم، لكن قراءة السؤال والإجابة المقدمة من OP يبدو أنه البرنامج المساعد لإصدارات Maven ربما كان في الواقع إجابة أفضل لسؤاله:

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

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

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

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

اعتقدت أنني سأدرجه لأي مرجع مستقبلي.

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

<version>[1.2.3,)</version>

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

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

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

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

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

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

        <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.يعد هذا أمرًا مزعجًا إلى حد ما لأننا غالبًا ما نقوم بتنظيف الإصدارات القديمة لأسباب تتعلق بمساحة القرص.

أنت حقًا بحاجة إلى أداة منفصلة عن maven لضبط الإصدارات (حتى لا تعتمد على ملف pom لتعمل بشكل صحيح).لقد كتبت مثل هذه الأداة باللغة المتواضعة وهي لغة Bash.سيقوم البرنامج النصي بتحديث الإصدارات مثل البرنامج المساعد للإصدار والتحقق من pom مرة أخرى في التحكم بالمصدر.كما أنه يعمل بسرعة أكبر بمقدار 100 مرة من البرنامج الإضافي لإصدارات mvn.لسوء الحظ، لم تتم كتابته بطريقة مناسبة للاستخدام العام، ولكن إذا كان الأشخاص مهتمين، فيمكنني القيام بذلك ووضعه في جوهر أو جيثب.

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

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

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

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

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

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

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

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

في حالتك، يمكنك أن تفعل شيئا من هذا القبيل <version>[1.2.3,)</version>

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

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

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

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

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

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

الحقيقة هي أنه حتى في الإصدار 3.x فإنه لا يزال يعمل، ومن المدهش أن المشاريع يتم إنشاؤها ونشرها.لكن الكلمة الأساسية LATEST/RELEASE التي تسبب مشاكل في m2e وEclipse في كل مكان، تعتمد المشاريع أيضًا على التبعية التي تم نشرها من خلال LATEST/RELEASE تفشل في التعرف على الإصدار.

سيؤدي ذلك أيضًا إلى حدوث مشكلة إذا كنت تحاول تحديد الإصدار كخاصية والإشارة إليه في مكان آخر.

وبالتالي فإن الاستنتاج هو استخدام الإصدارات-maven-plugin إذا استطعت.

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

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

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

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

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

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

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

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

<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 الخاص بك في أي وقت من الأوقات.

الحل الخاص بي في maven 3.5.4، استخدم nexus، في Eclipse:

<dependency>
    <groupId>yilin.sheng</groupId>
    <artifactId>webspherecore</artifactId>
    <version>LATEST</version> 
</dependency>

ثم في الخسوف: atl + F5, ، واختر force update of snapshots/release

إنه يعمل بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top