Условно включить исключить файлы при создании проекта с использованием архетипа maven

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

Например, если пользователь будет использовать этот собственный архетип и передавать такие параметры, как
-DprojectType = webProject или -DprojectType = webDBProject


если webProject копирует только файлы, связанные с webProject, и если его webDBProject копирует файлы, связанные с webProject и файлами, связанными с БД.

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

Как я могу условно включить или исключить файл из архетипа при создании проекта?

Другой вариант, который у меня был, состоял в том, чтобы выполнить цель после генерации архетипа и включить/удалить ненужные файлы. Но мы не можем использовать плагин eclipse M2E с этим.

Последний вариант, который я пробовал, - это использовать сам шаблон скорости для выполнения операций постобработки.

Поскольку мы не можем создать экземпляр объекта внутри шаблона скорости, я пытался использовать отражение для создания экземпляра файла и удаления некоторого файла, как показано ниже:

$somestring.getClass().forName("java.io.File").getMethod("delete", null).invoke($somestring.getClass().forName("java.io.File").getConstructor($somestring.getClass()).newInstance("delete.txt"), null)

запись вышеупомянутой строки в файл шаблона скорости и запуск на изолированной java-программе скорости работает нормально. Но то же самое не работает при выполнении в составе генератора архетипов Maven.

Я пытался идти шаг за шагом, где выполнение было успешным до получения класса, но часть getConstructor() не выполняется при запуске archetype: generate.

Кто-нибудь пытался узнать причину или нашел альтернативное решение?

Также кто-нибудь знает, какая версия скоростного двигателя используется в Maven?

Ответ 1

Я понимаю, что это действительно старый вопрос, но теперь (в 2018 году) я выполняю эту задачу с помощью поддержки Maven для постгенерирующего groovy script.

Если вы включили в проект архетипа src/main/resources/META-INF каталог groovy script с именем "archetype-post-generate.groovy", то он будет выполнен после создания архетипа.

script будет иметь доступ к свойствам архетипа, например. ${artifactId}, включая любые пользовательские свойства.

Что я делаю, это включить все возможные файлы в архетип, а затем в groovy script, я проверяю соответствующие свойства архетипа и удаляю ненужные файлы.

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

Это немного громоздко, но оно работает.

Ответ 2

Ответ выше GreyBeardedGeek является правильным. Если кому-то нужен пример того, как должен выглядеть этот скрипт на Groovy, я написал небольшой пост.

Вот Groovy скрипт из моего поста:

import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths

// the path where the project got generated
Path projectPath = Paths.get(request.outputDirectory, request.artifactId)

// the properties available to the archetype
Properties properties = request.properties

// connectionType is either ftp or sftp
String connectionType = properties.get("connectionType")

// the Java package of the generated project, e.g. com.acme
String packageName = properties.get("package")

// convert it into a path, e.g. com/acme
String packagePath = packageName.replace(".", "/")

if (connectionType == "sftp") {
  // delete the FTP file
  Files.deleteIfExists projectPath.resolve("src/main/java/" + packagePath + "/polling/FtpFlowBuilder.java")
} else if (connectionType == "ftp") {
  // delete the SFTP file
  Files.deleteIfExists projectPath.resolve("src/main/java/" + packagePath + "/polling/SftpFlowBuilder.java")
}