6

基本的に次のことを行う必要があるmavenプラグインを作成しています:

  1. ビルドされたプロジェクトのすべてのクラスを処理する
  2. ソースコードの一部を記述したファイルを作成する
  3. そのファイルをjarビルドに追加します(ディレクトリへの追加MANIFESTまたは新しいファイルとしてMETA-INF

私はMavenプラグインを作成する最初のステップを作成しているので、ここに私の(おそらくばかげた)質問があります:

プロジェクトのビルド時に実行されるプラグインからプロジェクトのソース コードにアクセスするにはどうすればよいですか (最良の方法: 簡単に処理できるビルド パス上のパッケージとして)。

これまでの私の唯一のアプローチは、プロジェクトのソースを次のようなもので取得することです

// assuming the project exists (to exclude instance checks etc.)
MavenProject project = (MavenProject) getPluginContext().get("project");
String projectSource = project.getSourceDirectory();

次に、このディレクトリの内容をファイル操作で処理します。しかし、これは私には非常に醜いので、より良い解決策が存在すると確信しています(そして、Google、Mavenページ、およびstackoverflowでそれを見つけることができません)。

4

3 に答える 3

6

たとえば、現在のプロジェクトに関する情報を含むMojo APIを知っています。これは、次のような適切なマーカーを使用することにより、神経叢に自動的に含まれているだけで簡単に注入できます。

public class WhatEverMojo extends AbstractMojo {

    /**
     * The Maven project.
     *
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject project;
}

あなたの質問を誤解しているかもしれませんが、Introduction to Plugin developmentを読むことをお勧めします。

更新: apt-maven-pluginなどの他のプラグインを調べると役立つ場合があります。

次のようなことが役立ちます。

/**
 * The source directories containing the sources to be processed.
 * 
 * @parameter expression="${project.compileSourceRoots}"
 * @required
 * @readonly
 */
private List<String> compileSourceRoots;

完全なソース コードは SVN 経由で入手でき、詳細を調べることができます。

于 2012-05-22T08:10:32.673 に答える
4

注入する構文は次のとおりMavenProjectです。

@Parameter(defaultValue = "${project}", required = true, readonly = true)
MavenProject project;

maven-projectプラグインの pom に依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-project</artifactId>
    <version>2.0.6</version>
</dependency>

次に、ソース ファイルを管理する方法についてはよくわかりませんが、ファイル システム API を使用してMavenProject.getSourceDirectory(). それ以上のソースについて、コアメイヴンが何を教えてくれると期待するかはわかりません。もちろん、他のプラグイン (Java のコンパイル用など) は、特定のタイプのプロジェクト用により洗練されたドメイン モデルを備えている場合があります。

于 2015-08-06T15:55:40.170 に答える
1

1 回の実行でクラスがクラスローダーに 1 回だけロードされるため、静的フィールドを使用します。

private static final Set<MavenProject> proceeded = new HashSet<MavenProject>();

@Override
public void execute() throws MojoExecutionException {
    MavenProject project = (MavenProject) getPluginContext().get("project");
    if (proceeded.contains(project)) {
        getLog().info("Already done in this run.");
        return;
    } else {
        proceeded.add(project);
    }
于 2016-09-07T07:38:08.323 に答える