我可以将 artifactId 转换为 maven 原型中的类名前缀吗?

2022-09-03 04:25:56

我正在创建一个 maven 原型,并在项目中生成了一个以生成的项目 ID 命名的类。

工件 ID 的格式将设置为:,类应命名为 。the-project-nameTheProjectNameMain

我试图在我的身上这样做,但我不能把它做好。archetype-metadata.xml

<archetype-descriptor>
    <requiredProperties>
        <requiredProperty key="classNamePrefix">
            <defaultValue>${WordUtils.capitalize(artifactId.replaceAll("-", " ")).replaceAll(" ", "")}</defaultValue>
        </requiredProperty>        
    </requiredProperties>
</archetype-descriptor>

正如你所看到的,我试图使用WordUtils(来自apache-commons),但我猜这不可用,因为我得到了一个错误。 .我也尝试了不同的组合,但我无法获得正确的格式。Error merging velocity templates:.....replaceAll

有谁知道在这种情况下从a-hypenated-string到CamelCaseClassName的方法?


答案 1

无法从 Velocity 访问任意 java 类,但您可以调用现有对象的方法。在 Maven 原型的上下文中,您可以使用来自和 Velocity 循环的方法来完成工作。java.lang.String

#macro( ccase $str )
#foreach( $word in $str.split('-') )$word.substring(0,1).toUpperCase()$word.substring(1)#end
#end
#set( $classNamePrefix = "#ccase( $artifactId )" )

public class ${classNamePrefix}Application {
    // ...
}

如果使用标记,请添加属性以确保使用 Velocity 处理源文件。fileSetfiltered="true"

另请参阅:

版本 2.0 更新了文档:http://velocity.apache.org/engine/2.0/user-guide.html#loops


答案 2

我希望能够在文件名中执行此操作,因此我想出了骆驼案例属性的黑客:artifactId

<requiredProperty key="artifactIdCamelCase">
  <defaultValue>${artifactId.replaceAll("^a|-a", "A").replaceAll("^b|-b", "B").replaceAll("^c|-c", "C").replaceAll("^d|-d", "D").replaceAll("^e|-e", "E").replaceAll("^f|-f", "F").replaceAll("^g|-g", "G").replaceAll("^h|-h", "H").replaceAll("^i|-i", "I").replaceAll("^j|-j", "J").replaceAll("^k|-k", "K").replaceAll("^l|-l", "L").replaceAll("^m|-m", "M").replaceAll("^n|-n", "N").replaceAll("^o|-o", "O").replaceAll("^p|-p", "P").replaceAll("^q|-q", "Q").replaceAll("^r|-r", "R").replaceAll("^s|-s", "S").replaceAll("^t|-t", "T").replaceAll("^u|-u", "U").replaceAll("^v|-v", "V").replaceAll("^w|-w", "W").replaceAll("^x|-x", "X").replaceAll("^y|-y", "Y").replaceAll("^z|-z", "Z")}</defaultValue>
</requiredProperty>

这会将任何遵循带连字符的小写命名约定转换为驼峰大小写的内容。从一些有限的测试来看,格式很脆弱,因此诸如换行符和正则表达式添加之类的小编辑可能会阻止 Velocity 替换该属性。artifactIda-z

应该在2.1之后的Maven版本上运行(当这个错误被修复时)。我的版本:

> mvn -v
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T11:29:23-06:00)

这里还有一个有时有用的,不带连字符的版本:artifactId

<requiredProperty key="artifactIdUnhyphenated">
  <defaultValue>${artifactId.replace("-","")}</defaultValue>
</requiredProperty>

推荐