0

新しいプロジェクトが生成されるディレクトリへのパスであるアーキタイプ リソース ファイルに変数が必要です。この StackOverflow の投稿は、これを行うための独自のプラグインを作成した人物によるものです。

残念ながら、もともとどのように実行することを意図していたのかわかりません。このコマンドを実行すると:

mvn \
com.example.build.maven:property-setter-maven-plugin:0.1:set-properties \
archetype:generate \
-DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=...

アーキタイプから新しいプロジェクトを作成する予定の空のディレクトリから、次のエラーが発生します。

Goal requires a project to execute but there is no POM in this directory

これは私には完全に間違っているようです。このディレクトリに新しい Maven プロジェクトを作成しようとしていますが、まだそこに pom.xml があるべきではありません。そこで、maven-archetype-plugin によって実行されるフェーズを調べ、代わりにこのプラグインを実行することにし<goal>archetype:generate</goal>、実行中の maven コマンドから set-properties を削除しました。

ここで、archetype:generate コマンドを実行するとアーキタイプが生成されますが、必要な環境変数が存在せず、プラグインがまったく何もしていないように見えます。

これを機能させる方法を知っている人はいますか?

4

1 に答える 1

1

最初の簡単な答え:

カスタムプラグインは本当に必要ですか? 変数は${basedir}、アーキタイプが実行されたベース ディレクトリに対応するアーキタイプ リソース ファイルで機能する必要があります。

ターゲット プロジェクトのルートは ${basedir}/${artifactId} であるため、テンプレートpom.xmlが次の場合:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <version>${version}</version>
    <packaging>jar</packaging>

    <name>A custom project at base ${basedir}/${artifactId}</name>

</project>

次に、生成されたアーキタイプは次のpom.xmlようになります。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>galah</groupId>
    <artifactId>galah-artifact</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>A custom project at base /home/prunge/java/testing/galah-artifact</name>

</project>

(コマンドライン/プロンプトから groupId、artifactId、バージョンを設定すると仮定)


しかしここで、プロジェクトのベース ディレクトリだけでなく、別の理由でこれらの環境変数が必要であると仮定しましょう。

私が知る限り、property-setter-maven-pluginは現在の実行プロパティを取得し、それらを環境変数に入れます。そして、ベースディレクトリが必要です

property-setter-maven-plugin を実行するには、変更が必要です。元のプラグインでは、メタデータで定義されているようにプロジェクト/POM を実行する必要があるためです。

元のMOJOの定義:

/**
 * @goal set-properties
 * @phase validate
 * @since 0.1
 */
public class PropertySetterMojo extends AbstractMojo
{
    /**
     * @parameter default-value="${project}"
     * @parameter required
     * @readonly
     */
    private MavenProject project;

    /**
     *  @parameter expression="${session}"
     *  @readonly
     */
    private MavenSession session;

    /**
     * @parameter expression="${mojoExecution}"
     * @readonly
     * @required
     */
    protected MojoExecution execution;

    ...

}

このプラグインをプロジェクトなしで実行できるようにするには、いくつかの変更が必要です。

  • @requiresProject falseこれはデフォルトで true であるためです。追加のドキュメントはこちらです。
  • projecttype のフィールドがありMavenProject、それは - としてマークされてい@parameter requiredます - MOJO がプロジェクトなしで実行できるように、これを削除する必要があります。元の投稿のソース コードをざっと見てみると、このフィールドは使用されていないため、安全に削除できます。

したがって、次のような結果になります。

/**
 * @goal set-properties
 * @phase validate
 * @since 0.1
 * @requiresProject false 
 */
public class PropertySetterMojo extends AbstractMojo
{
    /**
     *  @parameter expression="${session}"
     *  @readonly
     */
    private MavenSession session;

    /**
     * @parameter expression="${mojoExecution}"
     * @readonly
     * @required
     */
    protected MojoExecution execution;

    ...

}

その後、以前と同じようにコマンド ラインを実行できます。

mvn \
com.example.build.maven:property-setter-maven-plugin:0.1:set-properties \
archetype:generate \
-DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=...

property-setter-maven-plugin はすぐに実行できるはずです。

于 2013-02-07T03:16:35.013 に答える