在Maven Archetype中更改包属性

wvd*_*vdz 9 maven-3 maven 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>
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它创建了一个Java源文件夹,并将我的类放在包中,由groupIdand和artifactId.

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

com.example.wvdz.mypackage
Run Code Online (Sandbox Code Playgroud)

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

A_D*_*teo 17

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

使用include以下附加元素保持相同的配置:

<fileSets>
    <fileSet filtered="true" packaged="true" encoding="UTF-8" >
      <directory>src/main/java</directory>
        <includes>
            <include>**/*.java</include>
        </includes>       
    </fileSet>
</fileSets>
Run Code Online (Sandbox Code Playgroud)

然后,您可以在src/main/java/mypackage您的Java源代码下放置模板,其中package语句如下所示:

package ${package}.mypackage
Run Code Online (Sandbox Code Playgroud)

请注意,它直接.mypackage反映了mypackage文件夹src/main/java.但是,在创建原型时,Maven将作为文件夹(以及包等)放在$ {package}属性值之间,默认情况下为$ {groupId}.

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

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


上面的行为记录在官方如何存储原型的元数据?:

原型定义了一个文件集:

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

并且:

文件集可以是packaged,这意味着将在package属性前面的目录结构中生成/复制所选文件.它们可以是非打包的,这意味着将生成/复制所选文件而不进行前置.

相同的细节(关于packaged属性)也可以在官方原型描述模型中找到.


另一种可能的解决方案是使用其他属性或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>
Run Code Online (Sandbox Code Playgroud)

注意新的requiredProperties部分:这里我们设置package属性的默认值,不需要在运行时提供它(但可以覆盖上面的值).

因此,下面的Java源模板src/main/java(不需要其他静态文件夹)就是:

package ${package}
Run Code Online (Sandbox Code Playgroud)

在创建(archetype:generate)期间,Maven将使用com.sample.something.mypackageas package值(在Java源文件中)并packageInPathFormat使用值com/sample/something/mypackage(相同的属性,但以路径格式)填充属性并创建所需的包层次结构,与Java源代码一致代码可能会被放入.

  • 我只是尝试使用命令行实际工作,提供`$ {groupId}.$ {artifactId} .mypackage`作为package属性的默认值.Eclipse中的问题似乎是它将始终提供-dPackage属性,覆盖已定义的属性. (2认同)