2013-05-22 6 views
12

मुझे मेवेन आर्केटाइप बनाने में दिलचस्पी है, और मुझे लगता है कि मेरे पास मूलभूत बातें हैं। हालांकि, एक चीज जिस पर मैं फंस गया हूं वह यह है कि कभी-कभी मैं टेम्पलेट भरने के लिए कस्टम तर्क का उपयोग करना चाहता हूं। उदाहरण के लिए, अगर कोई मेरी आर्केटाइप उत्पन्न करता है और आर्टिफैक्ट आईडी को हैलो-वर्ल्ड के रूप में निर्दिष्ट करता है, तो मैं हैलोवर्ल्ड नामक एक क्लास जेनरेट करना चाहता हूं जो बस "हैलो वर्ल्ड!" प्रिंट करता है। कंसोल के लिए। यदि कोई अन्य व्यक्ति इसे artifactId = howdy-there के साथ उत्पन्न करता है, तो जेनेड क्लास HowdyThere होगा और यह "Howdy वहाँ!" प्रिंट करेगा।मैवेन आर्केटाइप में कस्टम लॉजिक कैसे प्रदान कर सकता हूं?

मुझे पता है कि कवर के तहत, मेवेन की आर्केटाइप तंत्र वेग वेग टेम्पलेट इंजन का लाभ उठाती है, इसलिए मैंने इस लेख को creating custom directives पर पढ़ा। ऐसा लगता है कि मैं क्या देख रहा था, इसलिए मैंने HyphenatedToCamelCaseDirective नामक एक क्लास बनाई जो org.apache.velocity.runtime.directive.Directive को बढ़ाता है। उस कक्षा में, मेरा getName() कार्यान्वयन "hyphenatedCamelCase" देता है। मेरी आदर्श-metadata.xml फ़ाइल में, मैं निम्नलिखित है ...

<requiredProperties> 
    <requiredProperty key="userdirective"> 
     <defaultValue>com.jlarge.HyphenatedToCamelCaseDirective</defaultValue> 
    </requiredProperty> 
</requiredProperties> 

मेरे टेम्पलेट वर्ग इस तरह दिखता है ...

package ${package}; 

public class #hyphenatedToCamelCase('$artifactId') { 

    // userdirective = $userdirective 
    public static void main(String[] args) { 
     System.out.println("#hyphenatedToCamelCase('$artifactId')")); 
    } 
} 

मैं अपने मूलरूप आदर्श स्थापित करें और उसके बाद एक आदर्श करने के बाद: निर्दिष्ट करने के द्वारा उत्पन्न artifactId = कैसे हो वहाँ और ग्रुप = f1.f2, जिसके परिणामस्वरूप वर्ग इस तरह दिखता है ...

package f1.f2; 

public class #hyphenatedToCamelCase('howdy-there') { 

    // userdirective = com.jlarge.HyphenatedToCamelCaseDirective  
    public static void main(String[] args) { 
     System.out.println("#hyphenatedToCamelCase('howdy-there')")); 
    } 
} 

परिणाम से पता चलता है कि भले ही userdirective तरह से मैं यह करने की उम्मीद किया जा रहा है, यह नहीं है#hyphenatedToCamelCase निर्देशों को विकसित करना जैसे कि मैं उम्मीद कर रहा था। निर्देश वर्ग में, मैं System.out के लिए एक संदेश लॉग इन करने विधि प्रस्तुत करना है, लेकिन उस संदेश, कंसोल में दिखाई नहीं देता तो यह है कि मुझे विश्वास है कि विधि मूलरूप आदर्श के दौरान कभी नहीं मार डाला गया: उत्पन्न करते हैं।

क्या मुझे यहां कुछ आसान याद आ रहा है, या यह दृष्टिकोण सिर्फ जाने का रास्ता नहीं है?

उत्तर

2

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

आप स्रोत कोड को देखते हैं, वेग Maven-मूलरूप आदर्श प्लगइन द्वारा प्रयोग किया जाता इंजन इसके विन्यास के लिए किसी भी बाहरी संपत्ति स्रोत पर निर्भर नहीं करता। कोड generates the projectVelocityComponent के कार्यान्वयन पर एक ऑटोवायर (प्लेक्सस कंटेनर द्वारा) पर निर्भर करता है।

public void initialize() 
    throws InitializationException 
{ 
    engine = new VelocityEngine(); 

    // avoid "unable to find resource 'VM_global_library.vm' in any resource loader." 
    engine.setProperty("velocimacro.library", ""); 

    engine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM, this); 

    if (properties != null) 
    { 
     for (Enumeration e = properties.propertyNames(); e.hasMoreElements();) 
     { 
      String key = e.nextElement().toString(); 

      String value = properties.getProperty(key); 

      engine.setProperty(key, value); 

      getLogger().debug("Setting property: " + key + " => '" + value + "'."); 
     } 
    } 

    try 
    { 
     engine.init(); 
    } 
    catch (Exception e) 
    { 
     throw new InitializationException("Cannot start the velocity engine: ", e); 
    } 
} 

अपने कस्टम निर्देश जोड़ने का एक hacky तरीका नहीं है:

इस कोड को जहां वेग इंजन आरंभ नहीं हो जाता है। उपरोक्त गुणों को components.xml फ़ाइल से प्लेक्सस-वेग-1.1.8.jar में पढ़ा जाता है। तो इस फ़ाइल को खोलने के लिए और अपने विन्यास संपत्ति जोड़ने

<component-set> 
    <components> 
    <component> 
     <role>org.codehaus.plexus.velocity.VelocityComponent</role> 
     <role-hint>default</role-hint> 
     <implementation>org.codehaus.plexus.velocity.DefaultVelocityComponent</implementation> 
     <configuration> 
     <properties> 
      <property> 
      <name>resource.loader</name> 
      <value>classpath,site</value> 
      </property> 
      ... 
      <property> 
      <name>userdirective</name> 
      <value>com.jlarge.HyphenatedToCamelCaseDirective</value> 
      </property> 
     </properties> 
     </configuration> 
    </component> 
    </components> 
</component-set> 

अगला इस जार और चलाने के मूलरूप आदर्श के लिए अपने कस्टम निर्देश वर्ग फ़ाइल जोड़ें: उत्पन्न करते हैं।

जैसा कि आप देख यह बहुत fraglie है और आप एक तरह से यह हैक की गई जाल वेग जार वितरित करने के लिए लगाने की आवश्यकता होगी। इस आर्केटाइप का उपयोग करने की योजना बनाने के आधार पर आप प्रयास के लायक हो सकते हैं।

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