假设我已经设置了groupId
to com.example
, and artifactId
to fancy.project
,现在我想创建一个原型,这样在创建时会扩展为以下结构:
|--src
|--main
|--com
|--example
|-fancy
|-project
|-App.java
也就是说,我想知道如何将变量扩展到嵌套目录中。
我知道双下划线包裹的变量将在文件/目录名称中替换,但我只能得到以下内容__groupId__
.
|--src
|--main
|--com.example
|-fancy.project
|-App.java
作为原型的输入,您可以指定package
选项(如果您愿意,它会跟随您的输入、groupId 和artifactId 连接,即使情况并非总是如此,因此提供了更大的灵活性)。
然后,在您的原型中,您可以使用packageInPathFormat
选项(自原型以来可用2.2) 这将取代任何点.
变成斜杠\
并因此将其转换为生成项目的路径。
然而,尽管该选项受到支持并且在这种情况下工作得很好,但该选项并未被正式记录(遗憾)。
看代码, the DefaultFilesetArchetypeGenerator
和它的getPackageInPathFormat
提供相关的转换package
路径的选项,而org.apache.maven.archetype.common.Constants.PACKAGE_IN_PATH_FORMAT是此选项的官方入口点。
有关此选项用法的一些外部指针:
- http://geekofficedog.blogspot.be/2013/08/creating-maven-archetypes-tutorial.html
- http://www.theotherian.com/2012/05/maven-archetypes-part-2-how-do-i-create.html
进一步解释一下:
- 您可以拥有
__packageInPathFormat__
例如,在 src/main/java 下的文件夹
- The
__packageInPathFormat
然后将被替换为package
将点转换为斜线的选项
- The
package
选项有一个默认值groupId
,所以如果你不指定它,对于groupId
有价值com.sample
,路径将是com/sample
- 因此,您可以在调用时指定所需的包
-Dpackage=your.package
重复值-DgroupId
and -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 引擎的方法(它将取代占位符)。虽然我不是 Velocity 专家,因此我可能会错过一些粘合剂,但观察到的行为和代码工作流程似乎得出了这个结论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)