2013-05-22 8 views
12

Maven 아키타 입을 만드는 데 관심이 있습니다. 기본 사항이 대부분이라고 생각합니다. 그러나 내가 붙어있는 한 가지 점은 맞춤 로직을 사용하여 템플릿을 채우기를 원할 때가 있다는 것입니다. 예를 들어 누군가가 내 아키 타입을 생성하고 artifactId를 hello-world로 지정하면 "Hello World!"라는 출력을 출력하는 HelloWorld라는 클래스를 생성하고 싶습니다. 콘솔에. 다른 사람이 artifactId = howdy-there로 생성하면 gendy 클래스는 HowdyThere가되고 "Howdy There!"가 출력됩니다.Maven 아키 타입에 커스텀 로직을 어떻게 제공합니까?

Maven의 기본 메커니즘은 Velocity Template Engine을 사용하므로이 글은 creating custom directives에서 읽었습니다. 이것은 내가 찾고있는 것으로 보였으므로, org.apache.velocity.runtime.directive.Directive를 확장 한 HyphenatedToCamelCaseDirective라는 클래스를 만들었습니다. 해당 클래스에서 내 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를 = 안녕하세요 - 거기의 groupId = 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 지시어를 evaulating. 지시어 클래스에서, 나는 render 메소드가 System.out에 메시지를 로깅하지만, 그 메시지는 콘솔에 나타나지 않는다. 그래서이 메소드는 archetype : generate 중에 결코 실행되지 않았다고 믿는다.

나는 여기에 간단한 것을 놓치고 있습니까? 아니면이 방법은 그냥가는 것이 아닙니다.

답변

2

archetype-metatadata xml의 필수 속성 섹션은 속도 컨텍스트에 추가 속성을 전달하는 데 사용되며 이 아닌은 속도 엔진 구성을 전달하기위한 것입니다. 따라서 userDirective라는 속성을 설정하면 변수 $ userDirective 만 사용할 수 있고 사용자 지정 지시문을 속도 엔진에 추가하지 않습니다.

소스 코드가 보이면 maven-archetype plugin에서 사용하는 속도 엔진은 구성을위한 외부 속성 소스에 의존하지 않습니다. generates the project 코드는 VelocityComponent의 autowired (plexus 컨테이너에 의한) 구현에 의존하는 코드입니다.

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

사용자 정의 지시어를 추가하는 해키 방법이 있습니다 :

는 속도 엔진이 초기화 코드입니다. 위에서 볼 수있는 속성은 plexus-velocity-1.1.8.jar의 components.xml 파일에서 읽습니다. 이 파일을 열고 구성 등록 정보를 추가하십시오.

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

다음이 사용자 정의 지정 클래스 파일을이 jar에 추가하고 archetype : generate를 실행하십시오.

위의 내용을 보면 알 수 있듯이이 해킹 된 신경 얼기 속도 병을 배포 할 방법을 찾아야합니다. 이 아키 타입을 사용하려는 계획에 따라 노력할 가치가 있습니다.

관련 문제