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ソースフォルダーを作成し、groupId
とartifactId
で定義されているようにクラスをパッケージに入れるという点で機能します。
しかし、彼のパッケージ名を変更したいと思います。たとえば、groupIdがcom.example
でartifactIdがwvdz
の場合、パッケージは次のようになります。
com.example.wvdz.mypackage
質問:どうすればこれを達成できますか?
目的を達成するために、また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ソースコードが配置されると予想されるものと一致する、目的のパッケージ階層を作成します。