web-dev-qa-db-ja.com

Mavenアーキタイプのパッケージプロパティを変更します

Mavenアーキタイプを作成しました。私のMETA-INF/maven/archetype-metadata.xmlは次のようになります:

<archetype-descriptor xmlns="http://maven.Apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.Apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.Apache.org/xsd/archetype-descriptor-1.0.0.xsd">

  <fileSets>
    <fileSet filtered="true" packaged="true" encoding="UTF-8" >
      <directory>src/main/Java</directory>
    </fileSet>
  </fileSets>

</archetype-descriptor>

これは、Javaソースフォルダーを作成し、groupIdartifactIdで定義されているようにクラスをパッケージに入れるという点で機能します。

しかし、彼のパッケージ名を変更したいと思います。たとえば、groupIdがcom.exampleでartifactIdがwvdzの場合、パッケージは次のようになります。

com.example.wvdz.mypackage

質問:どうすればこれを達成できますか?

10
wvdz

目的を達成するために、またpackaged属性をtrueにすでに使用しているので(後で説明します)、以下のパスにディレクトリを追加するだけです。

次のようにinclude要素を追加して、同じ構成を維持します。

<fileSets>
    <fileSet filtered="true" packaged="true" encoding="UTF-8" >
      <directory>src/main/Java</directory>
        <includes>
            <include>**/*.Java</include>
        </includes>       
    </fileSet>
</fileSets>

次に、src/main/Java/mypackageの下にあなたのJavaソースtemplatedを配置し、パッケージステートメントは次のようになります。

package ${package}.mypackage

.mypackageは、src/main/Javaの直下にあるmypackageフォルダーを正確に反映していることに注意してください。ただし、アーキタイプを作成するとき、Mavenは$ {package}プロパティ値(デフォルトでは$ {groupId})の間にフォルダーとして(およびパッケージなどとして)配置します。

いつでも-Dpackageプロパティを渡して、デフォルト値(groupId)をオーバーライドできます。これは、上記のテンプレートに基づいて、パッケージのプレフィックスとして使用されます。

これは、上記のpackagedセクションでtrue属性がfileSetに設定されているために発生します。この場合、trueは、${package}プロパティで指定されたフォルダ階層を追加することを意味します。 falseに設定すると、${package}が無視されます。これは、フォルダ構造をハードコーディングして、明らかにそれをpackageステートメントに反映させたい場合に使用できます。 Javaコード、一貫性のため。


上記の動作は公式に文書化されています アーキタイプに関するメタデータはどのように保存されますか?

アーキタイプは単一のファイルセットを定義します。

  • ファイルセットは、archetype-resources/src/main/Javaパターンに一致する**/*.Java内のすべてのファイルを取得します
  • 選択したファイルは、Velocityエンジン(filtered=true)を使用して生成されます。
  • ファイルは、生成されたプロジェクトのsrc/main/JavaディレクトリのJARファイルと同じディレクトリに生成されますが、そのディレクトリの前にpackageプロパティが追加されます。

そしてまた:

ファイルセットはpackagedにすることができます。これは、選択したファイルが、packageプロパティの先頭にあるディレクトリ構造で生成/コピーされることを意味します。それらはパッケージ化されていない可能性があります。つまり、選択されたファイルは、その先頭に追加せずに生成/コピーされます。

同じ詳細(packagedプロパティについて)は、公式の アーキタイプ記述子モデル にもあります。


別の可能な解決策は、追加のプロパティを使用するか、次のようにpackageプロパティ値をarchetype-metadata.xmlファイルに直接定義することです。

<archetype-descriptor
    xmlns="http://maven.Apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.Apache.org/xsd/archetype-descriptor-1.0.0.xsd">

    <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
            <directory>src/main/Java</directory>
        </fileSet>
    </fileSets>

    <requiredProperties>
        <requiredProperty key="package">
            <defaultValue>${groupId}.${artifactId}.mypackage</defaultValue>
        </requiredProperty>
    </requiredProperties>

</archetype-descriptor>

新しいrequiredPropertiesセクションに注意してください。ここではpackageプロパティのデフォルト値を設定しています。実行時に指定する必要はありません(ただし、上記の値をオーバーライドすることは可能です)。

そのため、src/main/Javaの下のJavaソーステンプレート(これ以上静的フォルダーは必要ありません)は、単純に次のようになります。

package ${package}

作成中(archetype:generate)、Mavenはcom.sample.something.mypackageをパッケージ値(Javaソースファイル内)として使用し、packageInPathFormatプロパティにデータを入力します)値com/sample/something/mypackage(同じプロパティですが、パス形式)を使用して、Javaソースコードが配置されると予想されるものと一致する、目的のパッケージ階層を作成します。

16
A_Di-Matteo