Архетип Maven не использует свойства для создания имен модулей

Я создал архетип, в котором вы можете установить имя модуля (или ожидать), используя обязательное свойство moduleName, вот метаданные архетипа xml (уменьшенный, который я также пробовал с аналогичными результатами)

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="modules-archetype">

  <requiredProperties>
    <requiredProperty key="moduleName">
    </requiredProperty>
  </requiredProperties>

  <modules>
    <module id="modules-${moduleName}-api" 
            dir="modules-__moduleName__-api" 
            name="modules-${moduleName}-api">
      <fileSets>
        <fileSet encoding="UTF-8">
          <directory>src/main/java</directory>
        </fileSet>
      </fileSets>
    </module>
  </modules>

</archetype-descriptor>

После установки и генерации значение moduleName не используется в имени каталога или идентификаторе артефакта, результирующие значения

For the directory:        project/module-__moduleName__-api
For the pom/artifactId:   module-${moduleName}-api

Значение корректно заменяется в некоторых других файлах проекта, так что проблем с орфографией, я думаю, нет.

Я видел много подобных вещей, но все они используют rootArtifactId, и на самом деле, если я использую rootArtifactId (как начальную часть имени), он работает так, как ожидалось.

Не удалось найти похожую проблему, есть идеи, почему она не работает или как заставить ее работать?


person tonio    schedule 10.10.2012    source источник


Ответы (4)


Я нашел разумный обходной путь.

Похоже, единственное место, где вы можете использовать только rootArtifactId, — это элемент <module> в дескрипторе архетипа, но в любом другом месте вы можете использовать moduleName без каких-либо проблем.

Что я сделал:

Используйте ${moduleName} в

  • ArtifactId в модуле pom
  • некоторые зависимости по умолчанию
  • Определение модуля в основном pom (<module>module-${moduleName}</module>)
  • и т.п.

Используйте __moduleName__ в

  • имя пакета в src/main/java & resources

В дескрипторе артефакта

  • Используйте имя модуля исправления, например, module-sample1 и module-sample2 (и, конечно же, назовите каталоги внутри ресурсов артефакта таким же образом).

Что нужно исправить после создания проекта

  1. Имя каталога модулей
  2. Выньте элементы модуля из основного pom, содержащего модуль-образец [12].

Все это в сценарии ant, встроенном в файл postcreate-pom.xml, который нужно запустить после создания проекта.

И работал ровно.

Надеюсь, что это полезно для кого-то.

спасибо всем, кто нашел время, чтобы прочитать мой вопрос, Тонио.

person tonio    schedule 18.10.2012
comment
У меня та же проблема. Что вы имеете в виду под «postcreate-pom.xml»? Есть ли стандартный способ выполнить какое-либо действие после создания в конце создания проекта? - person Michael K.; 19.12.2012
comment
Что ж, я не нашел способа сделать это, я просто создаю postcreate-pom.xml как часть проекта и затем запускаю его, чтобы завершить настройку проекта. - person tonio; 21.02.2013
comment
Правильный подход - это подход @sgpalit (хотя и не прямой) - person Jan Zyka; 16.10.2019

archetype-metadata.xml и pom.xml подмодуля:

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="multi-module">

  <modules>
    <module name="${rootArtifactId}-ria" id="${rootArtifactId}-ria" dir="__rootArtifactId__-ria">
      <fileSets>
        <fileSet filtered="true" packaged="true">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
        <fileSet filtered="true" packaged="true">
            <include>pom.xml</include>
        </fileSet>
      </fileSets>
    </module>
  </modules>


</archetype-descriptor>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>${groupId}</groupId>
    <artifactId>${rootArtifactId}</artifactId>
    <version>${version}</version>
  </parent>

  <artifactId>${artifactId}</artifactId>
  <packaging>war</packaging>

</project>
person sgpalit    schedule 17.03.2015
comment
Ты спас мой день! Спасибо - person troig; 21.11.2018
comment
Несмотря на то, что это правильный ответ, его стоит уточнить. Покажите структуру каталогов в ресурсах-архетипах хотя бы потому, что это очень не просто. - person Jan Zyka; 16.10.2019

Глядя в источники maven-archetype (версия 2.2), кажется, что единственным возможным значением для использования является rootArtifactId, извлеченный из DefaultFilesetArchetypeGenerator.

   while (subprojects.hasNext() ) {

        ModuleDescriptor project = subprojects.next();

        File moduleOutputDirectoryFile = new File( outputDirectoryFile
             , StringUtils.replace( project.getDir()
                   , "__rootArtifactId__"
                   , rootArtifactId 
                   ));
        ...........
person tonio    schedule 11.10.2012
comment
См. ошибку jira.codehaus.org/browse/ARCHETYPE-191, которая ничего не проясняет. слишком много, но, по крайней мере, проблема уже вокруг - person tonio; 12.10.2012

После создания архетипа из проекта отредактируйте файл target\generated-sources\archetype\src\main\resources\META-INF\maven\archetype-metadata.xml.

Добавлять

    <fileSet filtered="true" packaged="true" encoding="UTF-8">
      <directory></directory>
      <includes>
        <include>pom.xml</include>
      </includes>
    </fileSet>

Это заставит его фильтровать ваш файл pom! Затем снова запустите mvn install.

person BPS    schedule 13.05.2013
comment
Проблема заключалась в том, что я пытался использовать ${artifactId} в одном из файлов конфигурации .yml, и это не сработало. Вход в archetype-metadata.xml и включение /*.yml работает. Спасибо - person vutbao; 07.08.2015