2011-12-05 6 views
2

maven-compiler-plugin 용 새 컴파일러를 만들었습니다. 이 컴파일러는 src/main/groovy와 src/main/java에서 컴파일 소스를 찾는 것을 좋아합니다. 비슷하게, 테스트 소스는 src/test/groovy와 src/test/java에 있습니다.빌드에 새 소스 폴더를 자동으로 추가하는 Maven 모조 만들기

build-helper-maven-plugin 사용자가 빌드를 위해 새 원본 폴더를 지정하도록 POM을 늘릴 수 있지만이 플러그인을 사용하면 20 lines of extra configuration in the pom 이상이 필요하므로 이상적이지 않습니다.

추가 소스 폴더를 자동으로 구성하는 모조를 만들고 싶습니다.

여기 내가 만든 모조가 있지만, 모조가 적절한시기에 실행되도록하는 방법을 모르겠습니다.

/** 
* @goal add-groovy-source 
* @phase generate-sources 
* @requiresDependencyResolution compile 
* @execute phase="compile" 
*/ 
public class AddGroovySourceFolders extends AbstractMojo { 
    /** 
    * @parameter expression="${project}" 
    * @required 
    * @readonly 
    */ 
    private MavenProject project; 

    public void execute() throws MojoExecutionException, MojoFailureException { 
     getLog().info("Adding /src/main/groovy to the list of source folders"); 
     this.project.addCompileSourceRoot(project.getBasedir() + "/src/main/groovy"); 
    } 
} 

다시 말하지만, 내 목표는 사용자의 치어의 구성의 최소한의 금액을 보장하는 것입니다. 이 말은이 모조와 더 이상 구성이없는 플러그인에 대한 종속성 선언 만 있어야한다는 뜻입니다.

답변

2

커스텀 라이프 사이클을 정의하는 것이 가능합니다.

1 단계 : 경로를 추가하려면 MOJO를 정의하십시오. 이미 AddGroovySourceFolders으로이 작업을 수행했습니다.

2 단계 : src/main/resourcesMETA-INF/plexus/components.xml 파일을 만듭니다

<component-set> 
    <components> 
     <component> 
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role> 
      <role-hint>jar</role-hint> 
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation> 
      <configuration> 
       <lifecycles> 
        <lifecycle> 
         <id>default</id> 

         <phases> 
          <!-- I added this one, use appropriate plugin groupId/artifactId instead--> 
          <initialize>groovyadd:maven-groovyadd-plugin:add-build-paths</initialize> 
          <process-resources>org.apache.maven.plugins:maven-resources-plugin:2.4.3:resources</process-resources> 
          <compile>org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile</compile> 
          <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:2.4.3:testResources</process-test-resources> 
          <test-compile>org.apache.maven.plugins:maven-compiler-plugin:2.3.2:testCompile</test-compile> 
          <test>org.apache.maven.plugins:maven-surefire-plugin:2.7.2:test</test> 
          <package>org.apache.maven.plugins:maven-jar-plugin:2.3.1:jar</package> 
          <install>org.apache.maven.plugins:maven-install-plugin:2.3.1:install</install> 
          <deploy>org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy</deploy> 
         </phases> 
        </lifecycle> 
       </lifecycles> 
      </configuration> 
     </component> 
    </components> 
</component-set> 

요소는 수명주기위한 포장을 지정합니다. 분명히 당신은 jar 라이프 사이클을 오버라이드 할 수 있습니다 (Maven 3.0.3에서이 작업을했습니다). maven-core-3.0.3.jar \ META-INF \ plexus \ components.xml의 해당 구성 요소에서 초기화 단계를 제외한 모든 것을 복사했습니다.

Maven의 JAR 수명주기를 대체하는 부작용은 이제 Maven에있는 플러그인 대신 플러그인 및 다른 플러그인의 버전을 하드 코딩 한 것입니다. 나는 그것이 나쁜 것이 든 좋은 것이 든 확실하지 않습니다.

3 단계 : 다른 프로젝트에서 플러그인을 사용하는 경우, 당신이 필요로하는 모든이 :

<plugins> 
    ... 
    <plugin> 
     <groupId>groovyadd</groupId> 
     <artifactId>maven-groovyadd-plugin</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <extensions>true</extensions> 
    </plugin> 
    ... 
</plugins> 

중요한 부분은 확장 요소입니다. 플러그인이 없으면 플러그인의 맞춤 라이프 사이클이 선택되지 않습니다.

라이프 사이클의 다른 단계에도 다른 플러그인을 추가 할 수 있습니다 (예 : maven-compiler-plugin 용 컴파일러를 추가하는 대신 별도의 플러그인에서 컴파일 단계의 그루비 코드를 컴파일).

참조 : Overriding the Default Lifecycle 메이븐 북

+0

감사합니다. 나는 이것을 시험해 볼 것이다. –

+0

우수. 나는 일을 시작하고있다. 그래도 몇 가지 질문이 있습니다. 나는 각 단계의 목표 버전이 명백하다는 것에 만족하지 않는다. 내 component.xml에서 그들을 제거하고 일들이 작동하는 것 같습니다. 그걸로 어떤 문제가 보이십니까? 또한 이러한 구성 요소는 jar 라이프 사이클과 관련이 있습니다. 필자는 다른 재미있는 라이프 사이클 (예 : ear, war, maven-plugin 등)을 위해 일을 복사해야한다고 생각합니다. 주위에 어떤 방법이 보이니? –

+1

@AndrewEisenberg에서 버전을 제거한다는 것은 플러그인의 최신 버전이 선택 될 것임을 의미합니다. 이는 원하는 것 일 수도 있고 아닐 수도 있습니다. 긍정적 인 점은 사용되는 Maven의 버전이 무엇이든간에 합리적으로 적절한 플러그인 버전을 사용하고 작동한다는 것입니다. 네거티브는 사용자가 컴파일러 플러그인의 최신 버전을 가지고 있다면 플러그인이 메이븐의 기본 플러그인 대신 활성화되었을 때 사용됩니다. 더 많은 패키징 유형 (war, ejb 등)을 지원해야하는 경우 각 유형의 수명주기 구성을 무시해야합니다. – prunge