假设我已将groupId
设置为com.example
,artifactId
设置为fancy.project
,现在我想创建一个原型,以便在创建时扩展为以下内容结构:
|--src
|--main
|--com
|--example
|-fancy
|-project
|-App.java
也就是说,我想知道如何将变量扩展为嵌套目录。
我理解双重下划线包装的变量将替换为文件/目录名称,但我只能通过__groupId__
获得以下内容。
|--src
|--main
|--com.example
|-fancy.project
|-App.java
答案 0 :(得分:2)
作为原型的输入,您可以指定package
选项(如果需要,可以跟随您的输入,groupId和artifactId连接,即使情况并非总是如此,因此提供更大的灵活性) 。
然后,在您的原型中,您可以使用packageInPathFormat
选项(自原型 2.2 以来可用),它将任意点.
替换为斜杠\
将其转换为生成项目的路径。
但是,该选项并未正式记录(遗憾),即使受到支持也适用于此类情况。
Looking at the code,DefaultFilesetArchetypeGenerator
及其getPackageInPathFormat
提供从package
选项到路径的相关转换,而org.apache.maven.archetype.common.Constants.PACKAGE_IN_PATH_FORMAT是正式切入点对于这个选项。
关于此选项用法的一些外部指针:
进一步解释:
__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想要的关闭。
例如groupId
为me.zenisbestwolf
,而artifactId
为fancy-app
将生成me/zenisbestwolf/fancy-app
的路径。不幸的是,如果不手动定义程序包AFAIK,就无法像OP那样使工件ID从fancy.app
到fancy/app
自动化。