2011-12-05 11 views
2

maven-compiler-plugin用の新しいコンパイラを作成しました。このコンパイラはsrc/main/groovyとsrc/main/javaの両方でコンパイルソースを探すのが好きです。同様に、テストソースはsrc/test/groovyとsrc/test/javaの両方にあります。ビルドに新しいソースフォルダを自動的に追加するMaven Mojoを作成する

私は、ユーザーがビルドのための新しいソースフォルダを指定するには、彼らのポンポンを強化することができますが、それ以上20 lines of extra configuration in the pomを必要とするので、このプラグインを使用することが理想的ではないbuild-helper-maven-pluginの承知しています。

追加のソースフォルダを自動的に構成するmojoを作成したいとします。

ここに私が作成したモジョがありますが、モジョが適時に実行されるようにする方法はわかりません。

/** 
* @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"); 
    } 
} 

繰り返しますが、私の目標は、ユーザーのポンポン構成の最小限量を確保することです。これにより、このmojoを含むプラグインへの依存性の宣言だけが必要であり、これ以上の設定は必要ありません。

答えて

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のコンパイラを追加するのではなく、別のプラグインでコンパイルフェーズでGroovyコードをコンパイルします)。

参考文献:Overriding the Default Lifecycleメイブン本

+0

ありがとうございました。私はこれを試してみるつもりです。 –

+0

優れています。私は物事を働かせ始めている。しかし、もう少し質問があります。私は、各段階の目標のバージョンが明白であることをうれしくはない。私はそれらをcomponent.xmlから削除しました。あなたはそれに何か問題を見ますか?また、これらのコンポーネントはjarライフサイクルに固有のものです。私は他の面白いライフサイクル(例えば、戦争、メイヴンプラグインなど)のために物事をコピーする必要があると思います。その周りに何か方法がありますか? –

+1

@AndrewEisenbergがバージョンを削除したということは、プラグインの最新バージョンが選ばれたと思うということです。あなたが望むものであってもなくてもかまいません。 Mavenのバージョンがどのようなものであっても、合理的に適切なプラグインのバージョンを使用して動作させることができます。否定的なのは、ユーザーがコンパイラプラグインの新しいバージョンを持っていれば、プラグインがMavenのデフォルトのプラグインではなくアクティブなときに使用されるということです。より多くのパッケージタイプ(war、ejbなど)をサポートする必要がある場合は、それぞれのライフサイクル設定をオーバーライドする必要があります。 – prunge

関連する問題