Можно ли преобразовать artifactId в префикс класса в моем архетипе maven?
Я создаю архетип maven и в проектах сгенерировал класс, названный в честь идентификатора артефакта сгенерированного проекта.
Идентификатор артефакта будет отформатирован следующим образом: the-project-name
, а класс должен быть назван TheProjectNameMain
.
Я пытался сделать это в своем 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
Нет доступа к произвольным java-классам из Velocity, но вы можете вызывать методы существующих объектов. В контексте архетипа Maven вы можете использовать методы из java.lang.String
и цикл Velocity, чтобы выполнить задание.
#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 {
// ...
}
Если вы используете тег fileSet
, добавьте свойство filtered="true"
, чтобы убедиться, что исходные файлы обрабатываются с помощью Velocity.
См. также:
Ответ 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>
Это преобразует любой artifactId
, который следует за именованием условного дефиса, нижний регистр a-z
в случай верблюда. Из некоторого ограниченного тестирования формат является хрупким, поэтому небольшие изменения, такие как разрывы строк и добавления регулярных выражений, могут остановить изменение скорости Velocity.
Должен работать над версиями Maven после 2.1 (когда была зафиксирована эта ошибка). Моя версия:
> mvn -v
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T11:29:23-06:00)
Также здесь есть полезная, непереполненная версия artifactId
:
<requiredProperty key="artifactIdUnhyphenated">
<defaultValue>${artifactId.replace("-","")}</defaultValue>
</requiredProperty>
Ответ 3
Чтобы изменить ваше имя файла, вы можете установить свойство requiredProperty и использовать другие свойства для его создания.
<requiredProperty key="routeBuilderFileName"><defaultValue>RouteBuilder${flowName.toUpperCase()}${flowWay.substring(0,1).toUpperCase()}${flowWay.substring(1)}</defaultValue></requiredProperty>
Затем назовите файл шаблона: __routeBuilderFileName__.java