Условно включить исключить файлы при создании проекта с использованием архетипа 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")
}