如何在maven-archetype中将变量扩展为嵌套目录

时间:2016-03-03 10:14:57

标签: maven maven-plugin maven-archetype

假设我已将groupId设置为com.exampleartifactId设置为fancy.project,现在我想创建一个原型,以便在创建时扩展为以下内容结构:

|--src
  |--main
    |--com
      |--example
        |-fancy
          |-project
            |-App.java

也就是说,我想知道如何将变量扩展为嵌套目录。

我理解双重下划线包装的变量将替换为文件/目录名称,但我只能通过__groupId__获得以下内容。

|--src
  |--main
    |--com.example
      |-fancy.project
        |-App.java

2 个答案:

答案 0 :(得分:2)

作为原型的输入,您可以指定package选项(如果需要,可以跟随您的输入,groupId和artifactId连接,即使情况并非总是如此,因此提供更大的灵活性) 。

然后,在您的原型中,您可以使用packageInPathFormat选项(自原型 2.2 以来可用),它将任意点.替换为斜杠\将其转换为生成项目的路径。

但是,该选项并未正式记录(遗憾),即使受到支持也适用于此类情况。

Looking at the codeDefaultFilesetArchetypeGenerator及其getPackageInPathFormat提供从package选项到路径的相关转换,而org.apache.maven.archetype.common.Constants.PACKAGE_IN_PATH_FORMAT是正式切入点对于这个选项。

关于此选项用法的一些外部指针:

进一步解释:

  • 您可以在src / main / java下使用__packageInPathFormat__文件夹,例如
  • __packageInPathFormat将被package选项替换为将点转换为斜线
  • package选项的默认值为groupId,因此,如果您未指定,groupId的值为com.sample,则路径为{ {1}}
  • 因此,您可以在调用时通过com/sample重复-Dpackage=your.package-DgroupId的值来指定所需的包(虽然有点冗长且容易出错)但最终结果实际上是你所期望的(转变为正确的道路)。
  • 您可以通过-DartifactId文件中指定的archetype-metada.xml文件指定新的默认值,通过requiredProperties部分,您可以使用以下内容:

    <requiredProperties>
        <requiredProperty key="package">
            <defaultValue>__groupId__.__artifactId__</defaultValue>
        </requiredProperty>
    </requiredProperties>
    

    但是,生成的路径将是com.sample/artifactid而不是com/sample/artifactid。因此,由于处理工作流程会在将其转换为路径后替换占位符,因此无法按预期工作(遗憾!)。 (注意:它会将我们提供的点转换为配置值,但不会将点转换为替换的占位符。)

    从快速代码分析开始,似乎其DefaultFilesetArchetypeGenerator方法中的generateArchetype类过早地准备了上下文(在其prepareVelocityContext方法中packageInPathFormat转换并添加到上下文中),然后将上下文传递给processArchetypeTemplate*方法,这些方法最终将调用Velocity引擎(然后将替换占位符)。我不是速度专家,因此我可能会错过一些胶水,但观察到的行为和代码工作流程似乎导致了这个结论。

答案 1 :(得分:0)

您可以分别使用__groupId____artifactId__来代替使用变量${groupId}${artifactId}(我不知道发布问题时这些变量是否在周围。 ),因此看起来像这样:

<requiredProperties>
    <requiredProperty key="package">
        <defaultValue>${groupId}.${artifactId}</defaultValue>
    </requiredProperty>
</requiredProperties>

使用这些生成项目时,在交互模式下,它实际上会请求输入包,而在批处理模式下,它将自动生成对OP想要的关闭。

例如groupIdme.zenisbestwolf,而artifactIdfancy-app将生成me/zenisbestwolf/fancy-app的路径。不幸的是,如果不手动定义程序包AFAIK,就无法像OP那样使工件ID从fancy.appfancy/app自动化。