2012-02-11 10 views
15

मैने-मैन-प्लगइन और मैवेन-एजेबी-प्लगइन के साथ मेवेन-कान-प्लगइन का सफलतापूर्वक उपयोग और चलाने के लिए एक एप्लिकेशन को चलाने के लिए मैवेन-कान-प्लगइन का उपयोग किया है जेबॉस एएस 7 के लिए ईएआर।मैवेन-वॉर-प्लगइन में मेनिफेस्ट क्लास-पथ को सही तरीके से कैसे सेट करें

. 
| 
|-- Patrac-ear 
| `-- pom.xml 
|-- Patrac-ejb 
| `-- pom.xml 
|-- Patrac-web 
| `-- pom.xml 
`-- pom.xml 

मैं समझ नहीं है जब मैं आवेदन की तैनाती में कुछ कष्टप्रद चेतावनी संदेश को रोकने के लिए कैसे:

. 
|-- META-INF 
| |-- application.xml 
| |-- MANIFEST.MF 
| `-- maven 
|  `-- com.patrac 
|   `-- Patrac-ear 
|    |-- pom.properties 
|    `-- pom.xml 
|-- Patrac-ejb-1.0-SNAPSHOT.jar 
`-- Patrac-web-1.0-SNAPSHOT.war 

आवेदन स्रोत कोड निर्देशिका में, poms इस प्रकार स्थित हैं

!
12:32:03,958 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-ui-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,970 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-api-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,984 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-core-api-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,989 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-core-impl-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 

Patrac-वेब-1.0-SNAPSHOT.war META-INF/MANIFEST.MF इस तरह दिखता है:

Manifest-Version: 1.0 
Built-By: pgarner 
Build-Jdk: 1.7.0_02 
Class-Path: Patrac-ejb-1.0-SNAPSHOT.jar richfaces-components-ui-4.0.0. 
Final.jar richfaces-components-api-4.0.0.Final.jar richfaces-core-api 
-4.0.0.Final.jar richfaces-core-impl-4.0.0.Final.jar cssparser-0.9.5. 
jar sac-1.3.jar guava-r08.jar 
Created-By: Apache Maven 
Archiver-Version: Plexus Archiver 

ईजेबी क्लास-पथ प्रविष्टि को ईजेबी मॉड्यूल के लिए पोर्टेबिलिटी के लिए उपस्थित होना आवश्यक है, और समृद्ध, सीएसएसपार्सर और अमरूद वर्ग-पथ प्रविष्टियां युद्ध के मैनिफेस्ट में नहीं होनी चाहिए।

समस्या यह है कि मेरा युद्ध सभी जेएआर पर निर्भर करता है, जिनमें से कुछ WEB-INF/lib (रिचफेसेस) में रहते हैं, और एक जेएआर, Patrac-ejb-1.0-SNAPSHOT.jar, जो ईएआर की मूल निर्देशिका में रहता है। प्रत्येक निर्भरता को Patrac-web/pom.xml में दर्ज करने की आवश्यकता है, लेकिन प्रत्येक निर्भरता प्रकट में प्रकट नहीं होनी चाहिए।

मैवेन जार को सही जगहों पर रखता है, लेकिन यह सभी जारों के लिए मेनिफेस्ट में क्लास-पथ प्रविष्टियां रखता है। यह ऐसा नहीं करना चाहिए। इसे केवल Patrac-ejb-1.0-SNAPSHOT.jar के लिए प्रवेश करना चाहिए।

<!-- 
    According to Java EE 6 spec, the application is portable if 
    Patrac-web.war's META-INF/MANIFEST.MF contains a Class-Path entry 
    for Patrac-ejb-1.0-SNAPSHOT.jar. 

    <optional>true</optional> is the flag that maven-war-plugin uses 
    to put the entry in MANIFEST.MF without copying Patrac-ejb-1.0-SNAPSHOT.jar 
    into WEB-INF/lib. This is what I want. 

    <scope>provided</scope> would cause maven-war-plugin to NEITHER 
    put the entry in MANIFEST.MF nor copy Patrac-ejb.jar into WEB-INF/lib, 
    which would not be good. 

    No tag at all would cause maven-war-plugin to BOTH put the entry in 
    MANIFEST.MF and copy Patrac-ejb.jar into WEB-INF/lib, which would 
    also not be good. 
    --> 
    <dependency> 
    <groupId>com.patrac</groupId> 
    <artifactId>Patrac-ejb</artifactId> 
    <type>ejb</type> 
    <optional>true</optional> 
    </dependency> 

    <!-- 
    These two dependencies are used to copy 
    the other JAR files into WEB-INF/lib and there 
    should not be any class-path entries for such 
    JARs in MANIFEST.MF, in order to avoid the 
    error messages. 
    --> 
    <dependency> 
     <groupId>org.richfaces.ui</groupId> 
     <artifactId>richfaces-components-ui</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.richfaces.core</groupId> 
     <artifactId>richfaces-core-impl</artifactId> 
    </dependency> 

मैं सबसे हालिया मेवेन-युद्ध-प्लगइन संस्करण 2.2 का उपयोग कर रहा हूं। मैं MANIFEST.MF में क्लास-पथ प्रविष्टियों को न डालने के दौरान "गैर-ईजेबी" जेएआर को वेब-आईएनएफ/lib में डालने के लिए मेवेन-वॉर-प्लगइन कैसे कहूं?

आपके पास कोई भी सलाह या पॉइंटर्स की सराहना की जाती है।

संदर्भ:

उत्तर

19

Maven archiver, Maven WAR plugin द्वारा उपयोग किया गया, WAR के मैनिफेस्ट में क्लास-पथ प्रविष्टियों को उत्पन्न करने का माध्यम प्रदान करता है लेकिन दुर्भाग्य से संग्रहकर्ता एक सब कुछ या कुछ भी नहीं लेता है। एक बार जब आप addClassPath=true को संग्रह कॉन्फ़िगरेशन में पास कर लेते हैं, तो संग्रहकर्ता WAR की आवश्यक- और वैकल्पिक निर्भरताओं के लिए सभी के लिए क्लास-पथ प्रविष्टियां रखता है।

हालांकि, कुछ प्रविष्टियां बस वहां नहीं हैं। कक्षा-पथ प्रविष्टियों का उपयोग "Download Extensions," या WAR में JARs बाहरी को संदर्भित करने के लिए किया जाता है।WEB-INF/lib में स्थित JAR नहीं है, इसलिए, WAR के मैनिफेस्ट में क्लास-पथ प्रविष्टियां हैं। जब आप संग्रह में addClassPath=true सेट करते हैं तो मैवेन वॉर प्लगइन इस नियम को तोड़ देता है।

इसके अलावा, जब आप addClassPath=true को मैवेन के संग्रह में पास करते हैं, तो यह सभी क्लास-पथ प्रविष्टियों को एक ही निर्देशिका उपसर्ग देता है - इससे कोई फर्क नहीं पड़ता कि निर्भरताएं ईएआर के भीतर स्थित हैं। यह वैकल्पिक होने पर समस्याएं उत्पन्न करता है- और आवश्यक निर्भरताएं अलग-अलग स्थानों जैसे ईएआर रूट निर्देशिका, ईएआर lib और WAR WEB-INF/lib जैसी स्थितियों में स्थित हैं।

स्वाभाविक रूप से

, जब एक एक कान जिसका युद्ध प्रकट ऊपर त्रुटियों JBoss चेतावनी अगर युद्ध वर्ग लोडर अंततः एक निर्भरता (जार WEB-INF/lib में स्थित) या त्रुटियों मिल सकता है वर्ग पथ का प्रारंभिक भाग गलत है (उदाहरण के लिए फेंकता एक पर शामिल तैनात ईजेबी जार या ईएआर lib निर्देशिका में निर्भरता)।

इसलिए, यदि आपका वायर, मेरी तरह है, तो ईएआर की रूट पर स्थित ईजेबी मॉड्यूल पर निर्भर करता है, और WEB-INF/lib में स्थित किसी भी निर्भरता पर निर्भर करता है, मेवेन आर्काइवर सभी के लिए क्लास-पथ प्रविष्टियां उत्पन्न करेगा निर्भरताएं और ईएआर के भीतर उनके स्थान की परवाह किए बिना वे सभी एक ही उपसर्ग करेंगे।

अच्छा नहीं है।

समस्या कुछ हद तक कम हो जाएगी यदि संग्रहकर्ता वेब-आईएनएफ में स्थित जेएआरएस की कक्षा-पथ प्रविष्टियों को बाहर करने का साधन प्रदान करेगा। लेकिन ऐसा नहीं है।

यहाँ प्रत्येक निर्भरता की स्थापना के लिए परिणाम का एक सारांश जब एक addClassPath=true का उपयोग करता है:

  Setting     Generate    Copy JAR into 
            Class-Path    WEB-INF/lib 
            Entry 

1. <scope>provided</scope>    NO      NO 

2. <optional>true</optional>   YES      NO 

3. (no option -- default)    YES      YES 

4. ?????        NO      YES 

क्या जरूरत है, स्थिति # 4 के लिए कवरेज है ऊपर: एक कक्षा-पथ प्रविष्टि बनाने नहीं है और, हाँ, JAR को WEB-INF/lib में कॉपी करें। मेवेन संग्रहकर्ता को डिफ़ॉल्ट रूप से इस व्यवहार को लागू करना चाहिए।

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

<manifest> 
    <addClasspath>true</addClasspath> 
</manifest> 

और इस के साथ बदलना: तरीका यह है Patrac-web/pom.xml से निम्नलिखित दूर करने के लिए है

<manifestEntries> 
    <Class-Path>Patrac-ejb-${project.version}.jar</Class-Path> 
</manifestEntries> 

इस विन्यास सिर्फ एक ही कक्षा-पथ प्रविष्टि का उपयोग करना, EJB मॉड्यूल के लिए, बनाया जाता है स्पष्ट रूप से।

1

जरूरत के साथ उन लोगों के जार के लिए MANIFEST से बाहर रखा जाना और WEB-INF/lib से आप उन्हें <scope>provided</scope> के रूप में चिह्नित करने के लिए की जरूरत है। इसका मतलब है कि जार फाइलें कंटेनर द्वारा प्रदान की जाएंगी (और यह आपके मामले में ईएआर है)।

अन्य विकल्पों के लिए WAR manifest guide देखें।

+1

[युद्ध प्रकट गाइड] (http के बारे में विशेष रूप से पढ़ने के लिए n.apache.org/plugins/maven-war-plugin/examples/war-manifest-guide।एचटीएमएल) 3 उदाहरण दिखाता है और एक नोट प्रदान करता है: "कोई तरीका नहीं दिखाया गया है कि वेब-आईएनएफ/lib में निर्भरता कैसे शामिल करें लेकिन मैनिफेस्ट क्लासपाथ में नहीं।" गाइड तब कहता है, "अधिक उदाहरणों के लिए [मैनफिस्ट के साथ काम करने के लिए मार्गदर्शिका] (http://maven.apache.org/guides/mini/guide-manifest.html) देखें।" यह दूसरा पृष्ठ मुझे वापस वॉर मैनिफेस्ट गाइड पेज पर संदर्भित करता है। मुझे उस उदाहरण का पालन करने में सक्षम होना चाहिए जो दिखाया नहीं गया है। –

+0

आप वेब-आईएनएफ/lib में निर्भरता शामिल करना चाहते हैं लेकिन मैनिफेस्ट क्लासपाथ में नहीं? आपको इसकी आवश्यकता क्यों है? यदि आपके 'richfaces',' cssparser' और 'guava' ईएआर में छोड़ते हैं, तो इन निर्भरताओं को' प्रदत्त 'के रूप में चिह्नित किया जाना चाहिए। –

+0

Richfaces et al WAR मॉड्यूल की निर्भरता की आवश्यकता है। इस प्रकार, वे वेब-आईएनएफ/lib में होना चाहिए। मेरी समझ यह है कि WEB-INF में JARs के लिए कोई क्लास-पथ प्रविष्टियां नहीं की जानी चाहिए क्योंकि ऐसी फ़ाइलें स्वचालित रूप से WAR के क्लास लोडर द्वारा लोड की जाती हैं। WAR मॉड्यूल के लिए JARs _external_ के लिए केवल क्लास-पथ प्रविष्टियां WAR के मेनिफेस्ट में दर्ज की जानी चाहिए। मेरे मामले में, ईजेबी जार के लिए एक प्रविष्टि की जानी चाहिए। यह प्रति जेईई स्पेक है। RichFaces et al WAR मॉड्यूल की निर्भरता आवश्यक है और इस प्रकार 'प्रदान की गई 'के रूप में चिह्नित नहीं किया जाना चाहिए। –

0

EJB वर्ग पथ प्रविष्टि EJB मॉड्यूल के लिए उपस्थित होने की जरूरत है ...

वर्ग पथ केवल EJBs मॉड्यूल के लिए उपस्थित होना है जो अन्य संदर्भ (ईएआर की जड़ में) की जरूरत है // मेव: EJB मॉड्यूल (एक ही कान के जड़ में)

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