Maven2: एंटरप्राइज प्रोजेक्ट (EAR फ़ाइल) के लिए सर्वश्रेष्ठ अभ्यास


100

मैं अभी एंट से मावेन पर स्विच कर रहा हूं और एक ईएआर फ़ाइल आधारित एंटरप्राइज परियोजना स्थापित करने के लिए सबसे अच्छा अभ्यास करने की कोशिश कर रहा हूं?

मान लीजिए कि मैं EJBs के लिए एक जार फ़ाइल के साथ एक सुंदर मानक परियोजना बनाना चाहता हूं, जो वेब टियर के लिए एक WAR फ़ाइल और संबंधित तैनाती डिस्क्रिप्टर के साथ EAR फ़ाइल को एन्क्रिप्ट करता है।

मैं इसके बारे में कैसे जाऊंगा? archetypeArtifactId=maven-archetype-webappयुद्ध फ़ाइल के साथ प्रोजेक्ट बनाएं , और वहां से विस्तार करें? इसके लिए सबसे अच्छी परियोजना संरचना (और POM फ़ाइल उदाहरण) क्या है? आप कान फ़ाइल से संबंधित तैनाती वर्णनकर्ताओं, आदि को कहां चिपकाते हैं?

किसी भी मदद के लिए धन्यवाद।

जवाबों:


96

आप एक नया प्रोजेक्ट बनाएं। नई परियोजना आपकी ईएआर विधानसभा परियोजना है जिसमें आपकी ईजेबी परियोजना और आपके डब्ल्यूएआर परियोजना के लिए आपकी दो निर्भरताएं हैं।

तो आपके पास वास्तव में यहां तीन मावेन परियोजनाएं हैं। एक ईजेबी। एक वार। एक ईएआर जो दो हिस्सों को एक साथ खींचता है और कान बनाता है।

तैनाती विवरणकों को मावेन द्वारा उत्पन्न किया जा सकता है, या ईएआर परियोजना संरचना में संसाधन निर्देशिका के अंदर रखा जा सकता है।

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

तो एक उदाहरण के रूप में आप कुछ इस तरह से कर सकते हैं:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>myEar</artifactId>
  <packaging>ear</packaging>
  <name>My EAR</name>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <configuration>
          <version>1.4</version>
          <modules>
            <webModule>
              <groupId>com.mycompany</groupId>
              <artifactId>myWar</artifactId>
              <bundleFileName>myWarNameInTheEar.war</bundleFileName>
              <contextRoot>/myWarConext</contextRoot>
            </webModule>
            <ejbModule>
              <groupId>com.mycompany</groupId>
              <artifactId>myEjb</artifactId>
              <bundleFileName>myEjbNameInTheEar.jar</bundleFileName>
            </ejbModule>
          </modules>
          <displayName>My Ear Name displayed in the App Server</displayName>
          <!-- If I want maven to generate the application.xml, set this to true -->
          <generateApplicationXml>true</generateApplicationXml>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
    <finalName>myEarName</finalName>
  </build>

  <!-- Define the versions of your ear components here -->
  <dependencies>
    <dependency>
      <groupId>com.mycompany</groupId>
      <artifactId>myWar</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>war</type>
    </dependency>
    <dependency>
      <groupId>com.mycompany</groupId>
      <artifactId>myEjb</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>ejb</type>
    </dependency>
  </dependencies>
</project>

98
मुझे अपना जवाब एक साल बाद मिला जब मेरा वही सवाल था। अच्छी नौकरी स्व!
माइक कॉर्नेल

1
मेरे लिए यह तब काम आया जब मैंने सेट typeकियाejb <type>ejb</type>
gammay

पोम कुछ चेतावनियों को फेंकता है: 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missingऔर 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing, इसलिए आप अपने अन्यथा शानदार जवाब को अपडेट करना चाहते हैं
डिएगोअल्फोन्सो

46

मावेन आर्किटेक को चलाने में मुझे बहुत मदद मिली: लक्ष्य बनाएं और एक से एक आर्कषक का चयन करें, जिनमें से कुछ नियमित रूप से अपडेट किए गए प्रतीत होते हैं (विशेष रूप से JBoss को अच्छी तरह से बनाए रखा जाता है)।

mvn archetype:generate

सैंकड़ों की संख्या में आर्किटेप्स एक सूची में दिखाई दिए जिसमें से चयन करना है (अब के रूप में 519!)। लक्ष्य, अभी भी चल रहा है, मुझे एक संख्या दर्ज करके या एक खोज स्ट्रिंग दर्ज करके चयन करने के लिए प्रेरित किया जैसे:

513: remote -> org.xwiki.commons:xwiki-commons-component-archetype
514: remote -> org.xwiki.rendering:xwiki-rendering-archetype-macro
515: remote -> org.zkoss:zk-archetype-component
516: remote -> org.zkoss:zk-archetype-webapp
517: remote -> ru.circumflex:circumflex-archetype (-)
518: remote -> se.vgregion.javg.maven.archetypes:javg-minimal-archetype (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains):

मैंने खोज स्ट्रिंग "कान" में प्रवेश किया, जिसने सूची को केवल 8 वस्तुओं तक घटा दिया (आज के अनुसार):

Choose archetype:
1: remote -> org.codehaus.mojo.archetypes:ear-j2ee14 (-)
2: remote -> org.codehaus.mojo.archetypes:ear-javaee6 (-)
3: remote -> org.codehaus.mojo.archetypes:ear-jee5 (-)
4: remote -> org.hibernate:hibernate-search-quickstart (-)
5: remote -> org.jboss.spec.archetypes:jboss-javaee6-ear-webapp 
6: remote -> org.jboss.spec.archetypes:jboss-javaee6-webapp-ear-archetype
7: remote -> org.jboss.spec.archetypes:jboss-javaee6-webapp-ear-archetype-blank
8: remote -> org.ow2.weblab.tools.maven:weblab-archetype-searcher

मैंने "org.jboss.spec.archetypes: jboss-javaee6-ear-webapp" (इस उदाहरण में चयन "5" दर्ज करके) का चयन किया।

अगला, लक्ष्य ने मुझे GroupId, विरूपण साक्ष्य, पैकेज के नाम, आदि दर्ज करने के लिए कहा, और इसके बाद निम्न अच्छी तरह से प्रलेखित उदाहरण एप्लिकेशन उत्पन्न किया:

[pgarner@localhost Foo]$ tree
.
|-- Foo-ear
|   `-- pom.xml
|-- Foo-ejb
|   |-- pom.xml
|   `-- src
|       |-- main
|       |   |-- java
|       |   |   `-- com
|       |   |       `-- foo
|       |   |           |-- controller
|       |   |           |   `-- MemberRegistration.java
|       |   |           |-- data
|       |   |           |   `-- MemberListProducer.java
|       |   |           |-- model
|       |   |           |   `-- Member.java
|       |   |           `-- util
|       |   |               `-- Resources.java
|       |   `-- resources
|       |       |-- import.sql
|       |       `-- META-INF
|       |           |-- beans.xml
|       |           `-- persistence.xml
|       `-- test
|           |-- java
|           |   `-- com
|           |       `-- foo
|           |           `-- test
|           |               `-- MemberRegistrationTest.java
|           `-- resources
|-- Foo-web
|   |-- pom.xml
|   `-- src
|       `-- main
|           |-- java
|           |   `-- com
|           |       `-- foo
|           |           `-- rest
|           |               |-- JaxRsActivator.java
|           |               `-- MemberResourceRESTService.java
|           `-- webapp
|               |-- index.html
|               |-- index.xhtml
|               |-- resources
|               |   |-- css
|               |   |   `-- screen.css
|               |   `-- gfx
|               |       |-- banner.png
|               |       `-- logo.png
|               `-- WEB-INF
|                   |-- beans.xml
|                   |-- faces-config.xml
|                   `-- templates
|                       `-- default.xhtml
|-- pom.xml
`-- README.md

32 directories, 23 files

चार पोम फ़ाइलों को पढ़ने के बाद, जो अच्छी तरह से टिप्पणी की गईं, मुझे बहुत सारी जानकारी थी जो मुझे चाहिए थी।

./pom.xml
./Foo-ear/pom.xml
./Foo-ejb/pom.xml
./Foo-web/pom.xml

3
यह काम करता है, लेकिन यह आपकी परियोजना में jboss- विशिष्ट निर्भरता का एक समूह डालता है, जिसे आप इस तथ्य के बाद साफ करना चाहते हैं या नहीं कर सकते हैं।
इयान मैक्लेयर

24

मैंने एक github रिपॉजिटरी को दिखाने के लिए बनाया है जो मुझे लगता है कि एक अच्छा (या सर्वोत्तम अभ्यास) स्टार्टअप प्रोजेक्ट संरचना है ...

https://github.com/StefanHeimberg/stackoverflow-1134894

कुछ कीवर्ड:

  • मावेन ३
  • बीओएम (स्वयं निर्भरता का निर्भरता प्रबंधन)
  • सभी परियोजनाओं के लिए जनक (बाहरी निर्भरता से निर्भरता प्रबंधन और वैश्विक परियोजना विन्यास के लिए प्लगइन)
  • JUnit / मॉकिटो / DBUnit
  • WEB-INF / lib के बिना स्वच्छ युद्ध परियोजना क्योंकि निर्भरता EAR / lib फ़ोल्डर में हैं।
  • स्वच्छ कान परियोजना।
  • जावा ईई 7 के लिए न्यूनतम तैनाती विवरणक
  • कोई भी स्थानीय EJB इंटरफ़ेस नहीं क्योंकि @LocalBean पर्याप्त है।
  • मावेन उपयोगकर्ता गुणों के माध्यम से न्यूनतम मावेन कॉन्फ़िगरेशन
  • सर्वलेट 3.1 / EJB 3.2 / JPA 2.1 के लिए वास्तविक तैनाती डिस्क्रिप्टर्स
  • आर्किटेक्चर नियमों की जांच के लिए मैकेर-मावेन-प्लगइन का उपयोग
  • एकीकरण टेस्ट सक्षम, लेकिन छोड़ दिया। (SkipITs = false) सीआई बिल्ड सर्वर पर सक्षम करने के लिए उपयोगी है

मावेन आउटपुट:

Reactor Summary:

MyProject - BOM .................................... SUCCESS [  0.494 s]
MyProject - Parent ................................. SUCCESS [  0.330 s]
MyProject - Common ................................. SUCCESS [  3.498 s]
MyProject - Persistence ............................ SUCCESS [  1.045 s]
MyProject - Business ............................... SUCCESS [  1.233 s]
MyProject - Web .................................... SUCCESS [  1.330 s]
MyProject - Application ............................ SUCCESS [  0.679 s]
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 8.817 s
Finished at: 2015-01-27T00:51:59+01:00
Final Memory: 24M/207M
------------------------------------------------------------------------

2
मुझे वास्तव में आपकी पैकेजिंग और वास्तुशिल्प दृष्टिकोण पसंद है। आपको अपनी परियोजना को मावे के रूप में पैकेजिंग के बारे में सोचना चाहिए।
जार्ज

2
बहुत अच्छा समाधान! हालांकि मेरा एक सवाल है: BOM सामान को पैरेंट प्रोजेक्ट में क्यों नहीं पैक किया जाता? अतिरिक्त परत क्यों?
sschober

1
चिंताओं के अलगाव का कारण। बम को अन्य परियोजनाओं द्वारा आयात किया जा सकता था। उन्हें आपके आश्रितों के केवल निर्भरता प्रबंधन की आवश्यकता है न कि आपके द्वारा उपयोग की जा रही निर्भरताओं के निर्भरता प्रबंधन की। ठीक है। आप कह सकते हैं कि अगर कोई भी आपके प्रोजेक्ट का उपयोग नहीं कर रहा है तो यह अतिरिक्त परत नहीं है। लेकिन मुझे लगता है कि यह भी समझ में आता है ... पठनीयता। मूल परियोजना का निर्भरता प्रबंधन आपकी निर्भरता के साथ मिश्रित नहीं होता है ...> 50 आंतरिक maven परियोजनाओं के साथ एक बड़ी परियोजना में मूल परियोजना के अंदर निर्भरता प्रबंधन गड़बड़ हो सकता है ..
स्टीफनहेमबर्ग

2
एक और कारण यह है कि यह एक ही संरचना है जिसे maven.apache.org/guides/introduction/… पर प्रलेखित किया गया है । यह एक टीम में काम करने में मदद करता है जहां टीम के सदस्य अक्सर बदलते रहते हैं क्योंकि यह "डिफ़ॉल्ट" प्रलेखित तरीका है।
स्टेफेनहेमबर्ग

2
Btw। मैंने एक बार एक GitHub प्रोजेक्ट बनाया है जिसमें दिखाया गया है कि एक मल्टी प्रोजेक्ट सेटअप कैसे किया जा सकता है: github.com/StefanHeimberg/maven3-multiapplication-setup (कंपनी की आंतरिक चर्चा के लिए)
स्टीफनहाइमबर्ग

7

नेटबीन्स आईडीई स्वचालित रूप से उस संरचना को परिभाषित करता है जो पैट्रिक गार्नर द्वारा सुझाए गए एक के समान है। NetBeans उपयोगकर्ताओं के लिए

फ़ाइल -> नई परियोजना -> बाईं ओर में मावेन का चयन करें और दाएं पक्ष में मावेन एंटरप्राइज एप्लिकेशन का चयन करें और अगला -> युद्ध, ईजेबी और सेटिंग्स दोनों के लिए प्रोजेक्ट नामों के लिए दबाएं ।

आईडीई स्वचालित रूप से आपके लिए संरचना तैयार करेगा।


मैं आपसे विशेष रूप से सहमत हूँ, विशेष रूप से JEE6 विनिर्देशों का पालन करते हुए
Sym-Sym

3

यह मावेन-कान-प्लगइन भाग का एक अच्छा उदाहरण है

आप एक उदाहरण के रूप में उपलब्ध मावेन आर्कटाइप्स की भी जांच कर सकते हैं। यदि आप सिर्फ mvan archetype चलाते हैं: तो आपको उपलब्ध archetypes की सूची मिल जाएगी। उनमें से एक है

maven-archetype-j2ee-simple

10
maven-archetype-j2ee-simpleसंरचना में अनावश्यक रूप से जटिल लगता है - विशेष रूप से मॉड्यूल के अंदर मॉड्यूल के साथ, और लॉगिंग जैसी चीजों के लिए अलग मॉड्यूल। मैं इस संरचना के पीछे के तर्क को नहीं समझता था
विहंग

2

मैं एक संपूर्ण मावेन-आधारित कान-पैक एप्लिकेशन के एंड-टू-एंड उदाहरण के लिए उच्च और निम्न खोज रहा हूं और अंत में इस पर ठोकर खाई । निर्देश CLI के माध्यम से चलने पर विकल्प 2 का चयन करने के लिए कहते हैं लेकिन आपके उद्देश्यों के लिए, विकल्प 1 का उपयोग करें।


लिंक एक अनधिकृत त्रुटि फेंकता है। और यही कारण है कि लिंक पर भरोसा करने के बजाय पूर्ण समाधान लिखने का।
पाको अबातो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.