在Maven Archetype中更改包属性

时间:2016-08-22 13:13:53

标签: maven maven-3 maven-archetype

我创建了一个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源文件夹,并将我的类放在groupIdartifactId定义的包中。

但是,我想修改他的包名。例如,如果我的groupId是com.example而我的artifactId wvdz,那么我的包应该是:

com.example.wvdz.mypackage

问题:我如何做到这一点?

1 个答案:

答案 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源代码期望放置的内容一致。