سؤال

انا اعلم انه mauvais ton. أن أسأل مرتين في يوم واحد ولكن هنا هو لوز مافن آخر:

لدي POM الوالد الذي يحدد 5 وحدات (5 من المشاريع الفرعية). نظرا لأن كل وحدة يتم تنفيذها بنفس الطريقة التي أسحبها بالضبط <profile><build> قسم في الوالد بوم للتخلص من التعليمات البرمجية المكررة. الآن - إذا قمت بتنفيذ البناء بشكل فردي من كل وحدة نمطية، إلا أنه إذا كنت ترغب في بناء جميع الوحدات النمطية في وقت واحد والانتقال إلى الدليل الأصلي، فقد حدث خطأ منذ أول ما يحاوله Maven Execute هو المشروع الأصل نفسه:

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects

بعد ذلك فشل البناء لأن Exec Plugin يحاول تنفيذ شيء ليس هناك. بالنظر إلى الإخراج، من الواضح أن البرنامج المساعد مفاعل يقود المبنى ولكن كيف يمكنني تكوين المفاعل لتخطي الوالد؟

ملاحظة: لمنع الارتباك - أحاول قمع تنفيذ ملف التعريف على الوالد وتمكينه على الطفل أثناء same يبني

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

المحلول

ما هو الخطأ من خلال بناء الوالد؟

في الواقع، في Maven، هناك نوعان من المفاهيم المختلفة (التي تستخدم عموما في نفس الوقت):

  • الوالد بوم.
  • تجميع الوحدات

أول واحد هو تعريف لكل ما هو شائع مع جميع الأطفال. يمكنك تحديد الوالد كشروع تعبئته بوم، ويمكنك تثبيته في مستودعك.

عندما تقوم ببناء طفل من هذا الوالد، ستعود Maven2 إلى استرداد هذا الوالدي لدمج بوم الأصل مع الطفل بوم. يمكنك إلقاء نظرة على Pom.xml بأكملها عن طريق تشغيل الأمر mvn help:effective-pom.

في هذه الحالة، لن يتم بناء POM الوالدين، سيتم استردادها للتو من المستودع.

الحالة الثانية هي مشروع يحتوي على modules قائمة المشاريع الفرعية. المبدأ هو أن كل أمر يعمل فيه على هذا المشروع سيعمل أيضا على جميع الوحدات الفرعية. سيتم تعريف ترتيب الوحدات النمطية من قبل المفاعل، والتي ستبحث في تبعيات المشتركة بين الوحدات النمطية للعثور على الوحدة النمطية التي يجب بناؤها قبل الآخرين. إذا لم تكن هناك تبعيات، فسوف يستغرق الأمر قائمة الوحدات النمطية حيث يتم تعريفها في الوالد Pom.xml.

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


تحرير، بفضل تعليق الأشياء

يمكن العثور على شرح كامل للفروق بين الوحدات متعددة الوحدات (مشروع التجميع) والميراث (المشروع الأصل) في كتاب مافن، هنا.

نصائح أخرى

لا يمكنك تخطي بناء الوالد، ولكن يمكنك تكوين الملف الشخصي لعدم تنشيطه بقليل من الاختراق. هذه الإجابة يوضح كيفية التحكم في تنشيط ملف تعريف من خلال وجود أو عدم وجود ملف <activation> عنصر. بهذه الطريقة يمكنك تحديد ملف التعريف الموجود في الوالد، لكن هل قمت بإلغاء تنشيطها في هذا المشروع بسبب وجود ملف علامة في الوالد. لم يكن لدى مشاريع الأطفال ملف علامة في مصدرها، لذلك سيتم تنشيط ملف التعريف لهذه المشاريع.

تحديث لتوضيح: في مشروع الاختبار الخاص بي، هذا التكوين يعني إلغاء تنشيط ملف التعريف في المشروع الأصل (الذي يحتوي على الملف في SRC / الرئيسية / الموارد)، ولكن يتم تنشيطه في جميع مشاريع الأطفال التي لا تملك الملف في أدلة الموارد الخاصة بهم.

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>

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

لم أتمكن من تنفيذ حل الملفات "المفقودة" على النحو المنصوص عليه من قبل البائع ريك أعلاه. يبدو أنه لن يتم تغيير ما بمجرد تعيين حالة ملف التعريف النشطة / غير النشطة حتى ملف العلامة مفقود من الوحدة النمطية. ولكن هنا الحل الدقيق لمشكلتي. تحذير: هذا متاح فقط بدءا من Maven 2.1+

إذا كان لدي POM الوالدين مع وحدات 2 محددة: FOO و BOO ثم في ظروف منتظمة أمر التنفيذ سيكون:

  1. الأبوين
  2. فور
  3. باو

كل ما أريد القيام به لتخطي بناء الوالدين هو إضافة مفتاح سطر الأوامر هذا

mvn install –rf foo

بدلا من ذلك يمكنك استخدام --resume-from ما سيفعله هو تخطي الوالد والمتابعة من وحدة فو إلى أسفل. الآن - أنا التحقيق في حالة تحقيق ذلك عن طريق تكوين البرنامج المساعد المفاعل (PS - لا لا يمكن) ولكن حتى مع التبديل، فإن السيناريو أعلاه يعمل بشكل جيد بالنسبة لي

هذا هو ضمني إجابة @ Romaintaz على نفس السؤال، Maven - Skip Partmer Project Build

ولكن فقط لجعل هذا الصريح، في PORT POM من الضروري أن تحدد عنصر التعبئة والتغليف كسلطة بوم (وليس جرة أو حرب).
مثال:

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