في Maven2، ما هي أبسط طريقة لبناء حرب والأذن لاحتواء تلك الحرب في بوم واحد؟

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

سؤال

الوضع واضح جدا. لدي Java WebApp أن أقوم بنيت مع Maven. في الوقت الحاضر، تم بناء التطبيق مع النمل في ملف حرب واحد، ثم يتم تجميعها في أذن مع تطبيق بسيط جدا.

maven-war-plugin و maven-ear-plugin كلاهما يبدو واضحا جدا بالنسبة لي، ويبدو أنهم يضعوني من أجبرهم على النظر أعلاه بمثابة مشروعين متميزين، مع مشروع الحرب باعتباره تبعية مشروع الأذن. يبدو أن هذا غير مريح، خاصة لأن إعداد ملف تعريف مشروع الحرب سيتغير لكل بيئة، مما يبدو أنه سيجبرني على تكرار أن يبني التغيير والتبديل في كل مرة حاولت بناء الأذن أيضا.

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

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

المحلول

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

اجابة قصيرة: رقم, ، لا توجد طريقة بسيطة من الأرجوحة للقيام بذلك لأن هذا سيذهب ضد قاعدة مافن التي هي "قطعة أثرية واحدة لكل مشروع" (فهم إخراج واحد لكل مشروع صحيح في 99٪ من الحالات).

وفي الواقع، أود أن أوصي بشدة ليس اذهب إلى طريقة الاختراق وننسى استخدام التجميعات لإنشاء أذن. بدلا من ذلك، قم بإنشاء وحدتين، واحدا مع عبوة من النوع war, والآخر مع التعبئة والتغليف من النوع ear اعتمادا على قطعة أثرية الحرب وتعلنها كوحدات من أحد الوالدين pom.xml. وبعد مثله:

my-project
|-- pom.xml       // packaging of type pom and my-war and my-ear as modules
|-- my-war
|   `-- pom.xml   // packaging of type war
`-- my-ear
    `-- pom.xml   // packaging of type ear

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

نصائح أخرى

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

أولا، قم بإنشاء حرب قياسية Pom.xml لتوليد ملف الحرب الذي تريد تضمينه في الأذن. اترك العبوة كحرب.

ثم اكتب Applical.xml الخاص بك (في SRC / الرئيسية / التطبيق أو أينما) باستخدام عنصر نائب لاسم ملف الحرب:

<application xmlns="http://java.sun.com/xml/ns/javaee" ... >
  <module>
    <web>
      <web-uri>${project.build.finalName}.war</web-uri>
      <context-root>myapp</context-root>
    </web>
  </module>
</application>

وتشمل أي ملفات XML الخاصة بخادم (Weblogic-Application.xml وما إلى ذلك) في نفس الموقع.

بعد ذلك، أضف قسم موارد لاستبدال العنصر النائب باسم ملف الحرب:

<resources>
  <resource>
    <directory>src/main/application</directory>
    <filtering>true</filtering>
    <includes>
      <include>META-INF/*.xml</include>
    </includes>
  </resource>
</resources>

أخيرا، أضف مهمة الأذن نملة لإنشاء الأذن:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <ear destfile="${project.build.directory}/${project.build.finalName}.ear"
               appxml="${project.build.outputDirectory}/META-INF/application.xml">
            <fileset dir="${project.build.outputDirectory}" includes="META-INF/*.xml"/>
            <fileset dir="${project.build.directory}" includes="${project.build.finalName}.war"/>
          </ear>
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

وهذا كل شيء.

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

هذه مقتطفات من ريتشفيس أمثلة بوم.

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <executions>
          <execution>
            <id>jee5</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-jee5</webappDirectory>
              <classifier>jee5</classifier>
              <packagingExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
          <execution>
            <id>tomcat6</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-tomcat6</webappDirectory>
              <classifier>tomcat6</classifier>
              <packagingExcludes>WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <webResources>
            <resource>
              <directory>${basedir}/src/main/java</directory>
              <targetPath>/WEB-INF/src</targetPath>
            </resource>
          </webResources>
        </configuration>
      </plugin>

في أذنك، استخدم ملفات تعريف POM لاستيراد التبعية المطلوبة مع المصنف المناسب.

<profile>
  <id>jee5</id>
  <dependencies>
     <dependency>
       <groupId>org.richfaces.samples</groupId>
       <artifactId>richfaces-demo</artifactId>
       <version>${richfaces-version}</version>
       <classifier>jee5</classifier>
       <type>war</type>
       <scope>runtime</scope>
     </dependency>
  </dependencies>
</profile>   
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top