Как я могу проверить архетип maven, который я только что создал?

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

Я хочу, чтобы это была фаза построения архетипа, которая только что создала архетип, запускает на нем mvn archetype:generate, а затем запускает mvn verify в сгенерированном коде, чтобы убедиться, что сгенерированный код на самом деле ОК. Если понадобится, я напишу свой собственный mojo, чтобы сделать это, но хотел посмотреть, существует ли решение. Я вижу цель archetype:integration-test, но, похоже, она не делает то, что я хочу.

Ответ 1

ОБНОВЛЕНИЕ 2013: теперь это намного проще, чем предлагают другие ответы.

https://issues.apache.org/jira/browse/ARCHETYPE-334 был завершен в августе 2011 года

Для использования просто поместите слово install в упомянутый выше файл goal.txt, и тесты из проекта, который вы создаете, будут вызываться как часть обычной сборки. (И/или verify в случае ОП.)

Однако, если вы новичок в создании архетипов, знайте, что это популярное мини-руководство устарело и, хотя оно будет работать для создания архетипа, оно не будет работать для запуска тестов интеграции архетипов. Вместо этого вы должны создать файл archetype-metadata.xml как описано здесь. (С этим гораздо приятнее работать, поскольку он использует наборы файлов!)

Также обратите внимание, что эти интеграционные тесты не отвечают на -DskipTests но это можно исправить следующим образом:

<build>
  <plugins>

    <plugin>
      <artifactId>maven-archetype-plugin</artifactId>
      <version>2.2</version>
      <configuration>
        <skip>${skipTests}</skip>
      </configuration>        
    </plugin>

  </plugins>
</build>

(Хотя это выглядит так, как будто он пропускает весь плагин, он на самом деле работает, возможно, потому, что он возвращается к унаследованному режиму; тогда как я не смог найти какого-либо успешного способа пропустить только выполнение цели integration-test с использованием приведенного выше кода.)

Ответ 2

Помимо подхода использования плагина maven-invoker, мы используем другой подход. С помощью Maven Verifier вы можете легко протестировать свои плагины и архетипы maven. Просто добавьте следующую зависимость в ваш pom вашего тестового проекта maven:

<dependency>                                
  <groupId>org.apache.maven.shared</groupId>
  <artifactId>maven-verifier</artifactId>   
  <version>1.2</version>                    
</dependency>                               

Теперь вы можете использовать

org.apache.maven.it.Verifier

в ваши обычные тесты JUnit. С помощью верификатора вы можете запускать цели maven и некоторые утверждения о результате. Для полного примера просто проверьте интеграционные тесты maven-модулей наших javascript-архетипов: https://github.com/akquinet/javascript-archetypes

Ответ 3

Я сам немного боролся с этим и подумал, что при использовании текущего v2.3 плагина maven-archetype в дополнение к src/test/resources/projects/first/goal.txt, также необходимо src/test/resources/projects/first/archetype.properties, содержащий что-то вроде этого:

sourceEncoding=UTF-8
groupId=integrationtest.group
artifactId=integrationtest.artifactId
version=1.0.0-SNAPSHOT
package=org.eclipse.xtend.xtend-archetype.integrationtest
packageInPathFormat=org/eclipse/xtend/xtend-archetype/integrationtest

Этот запрос на растяжение иллюстрирует полный рабочий пример.

Ответ 5

Я предполагаю, что это будет сценарий для сервера непрерывной интеграции, например hudson.

Вы определяете задание, которое

  • пустет каталог (shell script)
  • создает новый проект, основанный на архетипе (mvn archetype: generate)
  • запускает проект (пакет mvn)

Хотя это, возможно, каким-то образом можно было бы вписаться в один жизненный цикл maven, это было бы ужасно беспорядочно. Вместо этого используйте CI.

Ответ 6

Я вижу цель архетипа: интеграция-тест, но, похоже, он не делает того, что я хочу.

Если я не понял, что вы хотите, цель archetype:integration-test кажется очень хорошим решением:

Выполнить интеграцию архетипа испытаний, состоящих из создания проект из текущего архетипа с определенными свойствами и необязательными сравнение с эталонной копией. ИТ состоит из каталога в SRC/тест/ресурсы/проекты содержащий:

  • target.txt(контент фактически не используется, но будущая версия должна интерпретировать его как цель бежать против сгенерированного проект: см. ARCHETYPE-334),
  • archetype.properties со свойствами для генерации проекта,
  • необязательный справочник/каталог, содержащий ссылочную копию ожидаемый проект, созданный из ИТ.

В соответствии с вышеприведенным описанием эти цели позволяют точно запускать теги интеграции, чтобы проверить проект, сгенерированный с помощью текущего архетипа, на ожидаемый результат, и это выглядит как простой, простой, автономный способ проверки архетипа.

Почему этот подход не удовлетворяет? Что я пропустил?