Можно ли преобразовать 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