2013-05-22 15 views
12

Ich bin daran interessiert, einen Maven-Archetyp zu erstellen, und ich denke, ich habe die meisten Grundlagen unten. Eine Sache, an der ich festhalte, ist, dass ich manchmal benutzerdefinierte Logik verwenden möchte, um eine Vorlage auszufüllen. Wenn beispielsweise jemand meinen Archetyp generiert und die artifactId als Hallo-Welt angibt, möchte ich eine Klasse namens HelloWorld generieren, die einfach "Hello World!" zur Konsole. Wenn eine andere Person es mit artifactId = howdy-there erzeugt, wäre die genierte Klasse HowdyThere und es würde "Howdy There!" Ausgedruckt.Wie kann ich benutzerdefinierte Logik in einem Maven-Archetyp bereitstellen?

Ich weiß, dass im Maven-Archetypmechanismus die Velocity Template Engine verwendet wird, also lese ich diesen Artikel unter creating custom directives. Dies schien genau das zu sein, wonach ich gesucht hatte. Daher habe ich eine Klasse namens "SilbentrennungToCamelCaseDirective" erstellt, die org.apache.velocity.runtime.directive.Directive erweitert. In dieser Klasse gibt meine getName() - Implementierung "hyphenatedCamelCase" zurück. In meiner Urbild-Datei metadata.xml, ich habe folgenden ...

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

Meine Template-Klasse sieht wie folgt aus ...

package ${package}; 

public class #hyphenatedToCamelCase('$artifactId') { 

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

Nachdem ich mein Urbild installieren und dann ein Urbild tun: erzeugen durch Angabe artifactId = howdy-dort und groupId = f1.f2, sieht die resultierende Klasse wie folgt ...

package f1.f2; 

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

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

das Ergebnis zeigt, dass, obwohl userdirective die Art und Weise ist, gesetzt ich es erwartet, ist es nicht die #hyphenatedToCamelCase-Anweisungen zu schätzen, wie ich es mir erhofft hatte. In der direction-Klasse habe ich die render-Methode, die eine Nachricht an System.out protokolliert, aber diese Nachricht wird nicht in der Konsole angezeigt, was mich zu der Annahme verleitet, dass die Methode niemals während archetype: generate ausgeführt wurde.

Fehle ich etwas einfach hier, oder ist dieser Ansatz einfach nicht der Weg zu gehen?

Antwort

2

der erforderlichen Eigenschaften Abschnitt des Urform-Metatadaten XML verwendet wird, um zusätzliche Eigenschaften der Geschwindigkeit Kontext zu passieren, ist es nicht für Durchtrittsgeschwindigkeit der Motorkonfiguration gemeint. Wenn Sie also eine Eigenschaft namens userDirective festlegen, wird nur die Variable $ userDirective verfügbar und keine benutzerdefinierte Anweisung zur velocity engine hinzugefügt.

Wenn Sie den Quellcode sehen, hängt die vom maven-archetype-Plugin verwendete Velocity-Engine für die Konfiguration nicht von einer externen Eigenschaft ab. Der Code, der generates the project ist, beruht auf einer autoverwirkten (durch den Plexusbehälter) Implementierung von VelocityComponent.

Dies ist der Code, wo die Geschwindigkeit Motor initialisiert wird:

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); 
    } 
} 

Es gibt einen Hacky kann DuFormal Deine individuelle Richtlinie hinzuzufügen. Die Eigenschaften, die Sie oben sehen, werden aus der Datei components.xml in der Plexus-Velocity-1.1.8.jar gelesen. So öffnen Sie diese Datei und fügen Sie Ihre Konfigurationseigenschaft

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

Nächstes fügen Sie Ihre benutzerdefinierten Richtlinie Klassendatei in diesem Glas und laufen Urbild: erzeugen.

Wie Sie sehen, ist dies sehr fraglie und Sie müssen einen Weg finden, um dieses gehackte Plexus-Geschwindigkeitsgefäß zu verteilen. Abhängig davon, was Sie planen, diesen Archetyp zu verwenden, könnte es die Mühe wert sein.

Verwandte Themen