【问题标题】:Change package property in Maven Archetype在 Maven Archetype 中更改包属性
【发布时间】:2016-08-22 13:13:52
【问题描述】:

我创建了一个 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

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

【问题讨论】:

标签: maven maven-3 maven-archetype


【解决方案1】:

为了实现您的目标,并且由于您已经在使用 packaged 属性到 true(稍后解释),您可以简单地将目录添加到下面的路径中。

保持相同的配置,添加一个include 元素,如下所示:

<fileSets>
    <fileSet filtered="true" packaged="true" encoding="UTF-8" >
      <directory>src/main/java</directory>
        <includes>
            <include>**/*.java</include>
        </includes>       
    </fileSet>
</fileSets>

然后您可以将您的 Java 源代码 templated 放在 src/main/java/mypackage 下,其中 package 语句如下:

package ${package}.mypackage

注意.mypackage 正好反映了mypackage 文件夹直接位于src/main/java 下。但是,在创建原型时,Maven 会在 ${package} 属性值之间放置一个文件夹(以及包等),默认情况下是 ${groupId}。

您始终可以传递-Dpackage 属性并将其覆盖为默认值(groupId),然后根据上面的模板将其用作包的前缀。

这是因为在上面的fileSet 部分中将packaged 属性设置为true。在这种情况下,true 意味着:将${package} 属性指定的文件夹层次结构添加到其中。将其设置为false 将导致${package} 被忽略,如果您真的想对文件夹结构进行硬编码并将其明显反映到Java 代码的package 语句中,以保持一致性,则可以使用它。


上述行为记录在官方How is metadata about an archetype stored?

原型定义了一个文件集:

  • 文件集将获取archetype-resources/src/main/java 中与**/*.java 模式匹配的所有文件
  • 所选文件将使用 Velocity 引擎 (filtered=true) 生成
  • 文件将在生成项目的src/main/java 目录中生成,该目录与 JAR 文件中的目录相同,但该目录以package 属性为前缀。

还有:

文件集可以是packaged,这意味着选定的文件将在包属性前面的目录结构中生成/复制。它们可以是非打包的,这意味着将生成/复制选定的文件而无需预先添加。

同样的细节(关于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 源文件中)并使用值 com/sample/something/mypackage 填充 packageInPathFormat 属性(相同的属性,但在路径中格式)并创建所需的包层次结构,与期望放置的 Java 源代码一致。

【讨论】:

  • 这些方法似乎都不适合我。在 Java 类中添加正确的包名称是可行的,但是当我创建一个新项目时,该类没有放在适当的文件夹中 - 它仍然放在 groupId.artifactId 文件夹中
  • @wvdz 在为新项目运行新的mvn archetype:generate ... 之前,您是否应用了相同的方法并在您的机器中重新安装了原型(mvn clean install)?两种方法都对我有用。您是否按照说明在src/main/java 中创建了新文件夹?
  • 我使用的是eclipse界面。为了能够在创建新项目时选择原型,我使用 Run As Maven Build... 和参数 clean install archetype:update-local-catalog。这应该与在提示符下执行mvn clean install archetype:update-local-catalog 相同。之后,我只是在创建新项目时选择它。我添加了一个必需的属性“包”,默认值为 ${package}.mypackage.
  • 我只是在命令行中尝试过,它确实有效,提供 ${groupId}.${artifactId}.mypackage 作为包属性的默认值。 Eclipse 中的问题似乎是它总是提供 -dPackage 属性,覆盖定义的属性。
  • 我从中得到的最重要的东西是-Dpackage,如果没有指定将使用-DgroupId。通过指定-Dpackage 我得到了我需要的东西
猜你喜欢
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2023-03-06
  • 1970-01-01
  • 2013-06-29
  • 2013-11-30
相关资源
最近更新 更多