سؤال

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

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

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

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

المحلول

إذا كنت ترغب في الاحتفاظ بكل مشروع من المشاريع ، فيمكنك إعطاء كل مشروع pom.xml الخاص به. في كل مشروع طفل POM ، أضف تبعية للمشروع الأصل. سيؤدي ذلك إلى قيام البناء بعمل "تراكب" يتم فيه إضافة الملفات من مشروع الطفل إلى (أو الكتابة فوق ملفات الأصل). مثال على الاعتماد على مشروع الطفل:

<dependency>
   <groupId>com.example.app</groupId>
   <artifactId>example</artifactId>
   <version>1.0.0</version>
   <type>war</type>
</dependency>

نصائح أخرى

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

لكن هذا لا يجيب كيفية استخدام موارد الويب كـ "تبعيات" جزء من سؤالك.

لهذا ، كيفية مشاركة الموارد عبر المشاريع في Maven يصف منشور المدونة شيئًا قريبًا جدًا وقد يساعد.

يجب أن تكون الملفات الشخصية مناسبة لهذا. وفقا للمعلومات في مستندات ملف تعريف Maven Build هذا لا ينبغي أن يعمل. على وجه التحديد ، يقولون

build as specified inside of a profile is not a full implementation of the traditional
build POM element. This build is really another class in the model - from which the POM
build is derived - and only allows the plugins and pluginManagement subelements when 
defined here. This sidesteps any issues with secondary validation after the pom.xml is 
parsed in this case.

لكنني اختبرت ذلك للتو وشملت الموارد المناسبة من خلال تضمين عنصر بناء مع تعريف الموارد في الداخل.

في POM الخاص بك ، ستحتاج إلى تضمين ملف تعريف لكل من WebApps. على سبيل المثال ، في اختباري ، فعلت ما يلي:

<profile>
    <id>abc</id>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
    <build>
        <resources>
            <resource>
                <directory>abc</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
        </resources>
    </build>
</profile>
<profile>
    <id>xyz</id>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
    <build>
        <resources>
            <resource>
                <directory>xyz</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
        </resources>
    </build>
</profile>

بعد ذلك ، كان لدي دليل AA ABC يحتوي على ملف ABC.Properties ، و XYZ آخر مع ملف XYZ.Properties المقابل.

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

أخيرًا ، عندما تقوم ببناء ، ستحدد ملف تعريف WebApp الذي ترغب في إنشاءه ، مثل تثبيت MVN -P ABC Clean

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

نعم ، أنا أجيب على هذا السؤال مرتين لأن كل نهج مختلف بشكل كبير.

بدلاً من الحصول على pom.xml واحد يحتوي على ملف تعريف لكل من ملفات الحرب الخاصة بك ، يمكن أن يكون لديك مشروع يحتوي على 11 وحدة. ستكون وحدة Maven التي تحتوي على جميع المصدر المشترك ، وبعد ذلك سيكون كل ملف من ملفات الحرب الخاصة بك أخرى ، وهي وحدة مجاورة لها فقط الملفات الخاصة به. كل هذه الوحدات ستكون تحت جذر واحد.

في POM لكل وحدة من وحدات الحرب الخاصة بك ، يمكنك بعد ذلك إعداد الموارد والإحساس المصدر ضمن تكوين البناء الخاص بك للإشارة إلى ../base-project/src/main/resources و ../base-project/src/main/java على التوالى.

من شأن تكوين Maven-War-Plugin إعداد WebResources للإشارة إلى ../base-project/src/main/webapp وإلى موارد الحرب الخاصة بك في ./src/main/webapp.

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

يمكنك دائمًا استخدام Maven-Remote-Resources-Plugin. ستنشئ إنشاء مواد صغيرة لكل مجموعة من مجموعات الموارد الخاصة بك ، على سبيل المثال إنشاء واحدة تسمى "My-Project-Resources-Customer1.jar. هذه هي تمامًا مثل أي قطعة أثرية أخرى من Maven ويمكن وضعها في إعادة التجهيزات المحلية أو عن بُعد.

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

<plugin>
    <artifactId>maven-remote-resources-plugin</artifactId>
    <executions>
      <execution>
        <phase>validate</phase>
        <goals>
          <goal>process</goal>
        </goals>
        <configuration>
          <resourceBundles>
            <resourceBundle>org.mygroup:my-project-resources-${profilename}:${pom.version}</resourceBundle>
          </resourceBundles>
        </configuration>
      </execution>
    </executions>
  </plugin>

أحد التحذيرات (إنه واحد صغير) هو أن تكون حذراً في كيفية تحديد إصدارات الموارد إذا كنت تستخدم المكون الإضافي لـ Maven. إذا شاركت مواردك وملف الحرب في إصدار مشترك ، فستحتاج إلى استخدام خاصية $ {pom.version} في البرنامج المساعد. ثم عند تحديث المكون الإضافي لإصدارك ، سيعكس المكون الإضافي هذا الإصدار تلقائيًا الإصدار 1.1 من حزمة الموارد. إذا كنت لا تصدر حزم الموارد في Lockstep مع الحرب ، فستكون على ما يرام في تحديد الإصدار بشكل صريح.

HTH

ستيل

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