我创建了一个Maven Archetype。我的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
问题:我如何做到这一点?
答案 0 :(得分:14)
要实现您的目标,并且因为您已使用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源模板下面,其中package语句如下:
package ${package}.mypackage
请注意,.mypackage
正好反映了mypackage
下的src/main/java
文件夹。但是,在创建原型时,Maven将作为文件夹(以及包等)放在$ {package}属性值之间,默认情况下为$ {groupId}。
您始终可以传递-Dpackage
属性并将其覆盖默认值(groupId
),然后根据上面的模板将其用作包的前缀。
这是因为上面packaged
部分中的true
属性设置为fileSet
。在这种情况下,true
表示:将${package}
属性指定的文件夹层次结构添加到其中。将其设置为false
将导致${package}
被忽略,如果您真的想要对文件夹结构进行硬编码并且明显地将其反映到Java代码的package
语句中,则可以使用它,为了一致性。
上述行为记录在官方How is metadata about an archetype stored?:
中原型定义了一个文件集:
- 文件集将获取
archetype-resources/src/main/java
中与**/*.java
模式匹配的所有文件- 将使用Velocity引擎(
生成所选文件filtered=true
)- 文件将生成在与JAR文件相同的目录中生成的项目的
src/main/java
目录中,但该目录由package
属性预先添加。
还有:
文件集可以是
packaged
,这意味着将在package属性前面的目录结构中生成/复制所选文件。它们可以是非打包的,这意味着将生成/复制所选文件,而不需要前缀。
同样的细节(关于packaged
属性)也可以在官方Archetype Descriptor Model中找到。
另一种可能的解决方案是使用其他属性或直接在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源代码期望放置的内容一致。