2009-12-08 29 views
8

स्थिति बहुत सरल है। मेरे पास जावा वेबपैप है जिसे मैं मैवेन के साथ बनाया जा रहा हूं। वर्तमान में, ऐप को एंट के साथ एक ही WAR फ़ाइल में बनाया गया है, जिसे तब एक बहुत ही सरल एप्लिकेशन.एक्सएमएल के साथ एक ईएआर में बंडल किया जाता है।मेवेन 2 में, एक ही पीओएम में डब्ल्यूएआर रखने के लिए एक युद्ध और ईएआर बनाने का सबसे आसान तरीका क्या है?

maven-war-plugin और maven-ear-plugin दोनों मेरे लिए बहुत सरल दिखते हैं, और ऐसा प्रतीत होता है कि वे ऊपर की ओर दो अलग-अलग परियोजनाओं के रूप में विचार करने के लिए मजबूर हो रहे हैं, युद्ध परियोजना के साथ ईएआर परियोजना की निर्भरता के रूप में। ऐसा लगता है कि यह एक असुविधाजनक है, विशेष रूप से क्योंकि प्रत्येक माहौल के लिए डब्ल्यूएआर प्रोजेक्ट की प्रोफाइल सेटिंग बदल जाएगी, ऐसा लगता है कि इससे मुझे हर बार ट्विकिंग करने के लिए मजबूर किया जाएगा जब भी मैंने ईएआर बनाने का प्रयास किया था।

यह सब कहना है: क्या युद्ध को बनाने और पैकेज को इस सरल-सरल ईएआर में पैकेज करने का एक सीधा तरीका है? मैं इन्हें दो अलग-अलग परियोजनाओं के रूप में बनाए रखने से बचना चाहता हूं, लेकिन ऐसा करने के लिए असेंबली का उपयोग करके एक अत्यधिक गन्दा हैक का सहारा लेना पसंद नहीं करेंगे।

उत्तर

17

यह सब कहने के लिए: क्या युद्ध को बनाने और पैकेज को इस सरल-सरल ईएआर में पैकेज करने का एक सीधा तरीका है? मैं इन्हें दो अलग-अलग परियोजनाओं के रूप में बनाए रखने से बचना चाहता हूं, लेकिन ऐसा करने के लिए असेंबली का उपयोग करके एक अत्यधिक गन्दा हैक का सहारा लेना पसंद नहीं करेंगे।

लघु जवाब: कोई, उस के रूप में यह एक Maven नियम जो "परियोजना प्रति एक विरूपण साक्ष्य" है के खिलाफ जाना होगा (परियोजना प्रति एक उत्पादन समझ में नहीं सरल Maven तरह से करने के लिए जो 99 में सत्य है मामलों का%)।

और वास्तव में, मैं दृढ़ता से हैकी रास्ते पर जाता हूं और ईएआर बनाने के लिए असेंबली का उपयोग करना भूल जाता हूं। इसके बजाए, युद्ध के आर्टिफैक्ट के आधार पर 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 

यदि आप मेवेन के लिए जाते हैं, तो मैवेन दर्शन को अपनाते हैं, इसके खिलाफ मत लड़ो, इससे आपको बहुत दर्द मिलेगा। गंभीरता से, मैवेन-कान-प्लगइन जो पहले से ही कर रहा है, करने के लिए असेंबली हैकिंग सिर्फ डीआरवाई विरोधी है। आप उस मामले में चींटी से बेहतर चिपके रहेंगे।

+1

+1 - मेवेन से लड़ें –

+0

इसके लायक होने के लिए, मैं एक हैकी दृष्टिकोण/मैवेन से लड़ने की वकालत नहीं कर रहा था, मुझे बस लगा कि कई परियोजनाओं/मॉड्यूल बनाने से कोई अन्य आउटलेट कम नहीं था। मैंने केवल यह पुष्टि करने के लिए एसओ पर सवाल उठाया कि वास्तव में एक परियोजना के भीतर इसे पूरा करने का कोई साफ तरीका नहीं था। इस प्रकार, मैं ऊपर उल्लिखित लेआउट के साथ जाने की योजना बनाउंगा। –

2

मेवेन में प्रत्येक एकल परियोजना एक aritifact उत्पन्न करती है। आपकी स्थिति में मैं सुझाव देता हूं कि युद्ध के लिए दो परियोजनाएं और कान के लिए एक परियोजना बनाएं। यदि आपको अपनी परियोजनाओं के विचलित संस्करणों की आवश्यकता है तो आप क्लासिफायर और प्रोफाइल का उपयोग कर प्राप्त कर सकते हैं।

यह समृद्ध उदाहरण उदाहरण पोम का अंश है।

<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> 

अपने कान पोम उपयोग प्रोफाइल में उचित वर्गीकारक साथ आवश्यक निर्भरता आयात करने के लिए।

<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> 
2

मुझे पता है कि यह अब 5 साल का है, लेकिन यह अभी भी पहला जवाब था जब मैंने खोज की थी। इसके अलावा, जबकि "यह मैवेन रास्ता नहीं है" कुछ लोगों के लिए एक बिल्कुल उचित उत्तर है, अन्य अभी भी ओपी के रूप में एक ही पोम का उपयोग करना पसंद कर सकते हैं, और यह वास्तव में जटिल नहीं है।

सबसे पहले, युद्ध फ़ाइल को उत्पन्न करने के लिए एक मानक युद्ध pom.xml बनाएं जिसे आप कान में शामिल करना चाहते हैं। पैकेजिंग को युद्ध के रूप में छोड़ दें।

फिर अपने खुद के application.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> 

और किसी अन्य सर्वर विशेष एक्सएमएल फ़ाइलें (weblogic-आवेदन शामिल हैं .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> 

और बस हो गया।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^