在 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 源文件夹并将我的 类 放入由 groupIdartifactId 定义的包中。

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

com.example.wvdz.mypackage

问题:我该如何完成?

为了实现您的目标,并且由于您已经在使用 truepackaged 属性(稍后解释),您只需将目录添加到下面的路径即可。

保持相同的配置,增加一个 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 源代码期望放置的内容一致。