在 Maven Archetype 中更改包 属性
Change package property in Maven Archetype
我创建了一个 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
,那么我的package应该是:
com.example.wvdz.mypackage
问题:我该如何完成?
为了实现您的目标,并且由于您已经在使用 true
的 packaged
属性(稍后解释),您只需将目录添加到下面的路径即可。
保持相同的配置,增加一个 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
),然后将其用作包的前缀,基于上面的模板。
发生这种情况是因为在上面的 fileSet
部分中 packaged
属性设置为 true
。在这种情况下 true
表示:向其添加 ${package}
属性 指定的文件夹层次结构。将它设置为 false
会导致 ${package}
被忽略,如果你真的想对文件夹结构进行硬编码并且显然将其反映到你的 [= 的 package
语句中,可以使用它81=] 代码,为了保持一致性。
上面的行为记录在官方 How is metadata about an archetype stored?:
the archetype defines a single fileset:
- the fileset will take all the files in
archetype-resources/src/main/java
that match the **/*.java
pattern
- the selected files will be generated using the Velocity engine (
filtered=true
)
- the files will be generated in the
src/main/java
directory of the generated project in the same directory as in the JAR file, but with that directory prepended by the package
property.
还有:
Filesets can be packaged
, which means the selected files will be generated/copied in a directory structure that is prepended by the package property. They can be non-packaged, which means that the selected files will be generated/copied without that prepend.
同样的细节(关于packaged
属性)也可以在官方Archetype Descriptor Model.
中找到
另一种可能的解决方案是使用额外的 属性 或直接在 archetype-metadata.xml
文件中定义 package
属性 值,如下所示:
<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 源代码期望放置的内容一致。
我创建了一个 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
,那么我的package应该是:
com.example.wvdz.mypackage
问题:我该如何完成?
为了实现您的目标,并且由于您已经在使用 true
的 packaged
属性(稍后解释),您只需将目录添加到下面的路径即可。
保持相同的配置,增加一个 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
),然后将其用作包的前缀,基于上面的模板。
发生这种情况是因为在上面的 fileSet
部分中 packaged
属性设置为 true
。在这种情况下 true
表示:向其添加 ${package}
属性 指定的文件夹层次结构。将它设置为 false
会导致 ${package}
被忽略,如果你真的想对文件夹结构进行硬编码并且显然将其反映到你的 [= 的 package
语句中,可以使用它81=] 代码,为了保持一致性。
上面的行为记录在官方 How is metadata about an archetype stored?:
the archetype defines a single fileset:
- the fileset will take all the files in
archetype-resources/src/main/java
that match the**/*.java
pattern- the selected files will be generated using the Velocity engine (
filtered=true
)- the files will be generated in the
src/main/java
directory of the generated project in the same directory as in the JAR file, but with that directory prepended by thepackage
property.
还有:
Filesets can be
packaged
, which means the selected files will be generated/copied in a directory structure that is prepended by the package property. They can be non-packaged, which means that the selected files will be generated/copied without that prepend.
同样的细节(关于packaged
属性)也可以在官方Archetype Descriptor Model.
另一种可能的解决方案是使用额外的 属性 或直接在 archetype-metadata.xml
文件中定义 package
属性 值,如下所示:
<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 源代码期望放置的内容一致。