Используя Maven Archetype, создайте в том же каталоге

#java #git #maven #jenkins #maven-archetype

#java #git #maven #дженкинс #maven-archetype

Вопрос:

Есть ли способ запустить mvn archetype: сгенерировать и настроить таргетинг на текущий каталог вместо создания каталога из artifactId? Предполагается, что плагин принимает параметр basedir, но передача «-Dbasedir=.» не помогает.

Для дополнительного контекста у меня настроено 2 репозитория Git. Первый содержит источник Maven archetype для создания пользовательских веб-служб, а второй — образец службы, созданный на основе архетипа. У меня есть задание Дженкинса, которое создает мой архетип, по сути, просто запуская «mvn clean install». Я пытаюсь настроить второе задание Jenkins как часть нашего рабочего процесса CI, создающего тестовую службу с использованием «mvn archetype: generate», создает службу с помощью mvn clean install, запускает службу, запускает некоторые интеграционные тесты, а затем отправляет исходный код для тестовой службы во второй репозиторий, если тесты пройдены. Оба задания Jenkins используют тип задания сборки Maven 2/3, и я указал нашу информацию о репозитории Git в разделе SCM конфигурации задания, поэтому задания начинаются с выполнения «git clone».

Для второго задания мой текущий рабочий процесс выглядит следующим образом:

 // Clean out the existing source and commit locally.
git rm -r . 
git commit -m "Cleaning out previous version." .

// Generate the new source from the archetype.
mvn archetype:generate ...

// Big hack that I'd like to remove.
mv <artifactId>/* .
rm -rf <artifactId>

// Add the new generated source and commit locally.
git add -A .
git commit -m "Committing new version." .

// Build and test.
mvn integration-test

// Assuming that passed, commit the changes.
git push origin master
 

Проблема заключается в том, что я не уверен, как указать плагину archetype использовать мой текущий каталог вместо создания вложенного каталога с именем artifactId, поэтому мне нужно переместить все обратно в корневой каталог моего локального репозитория и удалить созданный каталог. Не конец света, но это кажется уродливым. Обратите внимание, что я открыт для предложений о том, как лучше достичь моей общей цели, в дополнение к ответам на мой первоначальный вопрос. 🙂 Заранее спасибо!

Ответ №1:

Это невозможно без какого-либо обходного пути, по 2 причинам:

  1. basedir Свойство не работает, см. Эту проблему.
  2. Плагин archetype всегда добавляет artifactId в качестве последнего дочернего каталога. Вы можете увидеть это в источниках.

Ваши варианты

  • оставь свой хак себе, это не так уж и ужасно 😉
  • важно ли, чтобы проект находился в корне репозитория? если нет, просто сделайте cd <artifactId> перед тестами сборки / интеграции
  • если требуется сборка из корня репозитория, используйте root pom.xml типа pom, с сгенерированным проектом в качестве дочернего модуля (я думаю, это то, что другое сообщение предлагает как # 3)
  • предоставьте PR для добавления желаемой функциональности в плагин maven archetype, это может занять некоторое время, но, вероятно, является самым чистым решением

Комментарии:

1. привет, я пытаюсь решить эту проблему в github.com/apache/maven-archetype/pull/36

Ответ №2:

Я знаю, что это старая тема, но у меня была похожая проблема:

У archetype:generate goal есть параметр outputDirectory, вы можете установить его в корневую папку (../). При создании артефакта из archetype важно, чтобы имя вашего артефакта совпадало с текущим каталогом.

 mvn archetype:generate -DarchetypeGroupId=[archetype-group] -DarchetypeArtifactId=[archetype-id] -DoutputDirectory=../ -DartifactId=[current-folder-name] -DgroupId=[whatever-you-want] -Dversion=[ex: 0.1] -Dpackage=[jar|pom|etc.] -B
 

Комментарии:

1. -DartifactId=${PWD##*/} прекрасно сочетается с -DoutputDirectory=../ , с точки зрения ноты … «важно, чтобы имя вашего артефакта совпадало с текущим каталогом»

Ответ №3:

У меня есть три идеи:

  1. Вы можете попытаться использовать абсолютный путь для basedir , но я думаю, что свойство перезаписывается Maven, когда он видит pom.xml файл.
  2. Используйте скрипт и pushd .. перейдите в родительскую папку перед запуском mvn archetype:generate . popd я верну тебя обратно.
  3. Используйте сборку модуля maven. Таким образом, у вас есть корневой POM, который создает архетип, и вы можете запустить mvn archetype:generate его для создания модуля внутри проекта:
      demo-project/
         pom.xml
         archetype/
             pom.xml
     

Комментарии:

1. Спасибо за ответ! Я протестировал # 1, но, похоже, он не работает (или я что-то делаю неправильно). # 2 сработало бы, но в моем случае это не вариант, потому что я работаю в среде сборки с блокировкой chroot и не могу подняться на уровень. Я не уверен, что я полностью использую # 3, но я не думаю, что это вариант для меня, поскольку создание архетипа и создание службы с архетипом выполняются в отдельных заданиях Дженкинса.

2. Попробуйте преобразовать проект «генерирующий сервис» в многомодульную сборку.

Ответ №4:

У меня нет репутации, чтобы комментировать, поэтому вместо этого мне придется дать ответ. Это не очень хорошая идея иметь эти строки в вашем сценарии:

 mv <artifactId>/* .
rm -rf <artifactId>
 

Если кто-то решит заполнить пустой (или просто ‘/’) идентификатор артефакта, вы в конечном итоге попытаетесь переместить весь диск в этот каталог, только чтобы затем удалить весь диск. Вместо этого вы можете сделать это:

 mv ./<artifactId>/* .
rmdir ./<artifactId>
 

Перемещение не может повредить, и rmdir может удалять только пустые каталоги.