При генерации Java проекта из собственного архетипа не создаётся файл проекта и не используется artifactId в имени пакета
Имеется проект Maven архетипа для генерации проектов Java, который был создан с помощью org.apache.maven.archetypes:[email protected]. Проблема в том, что при генерации проекта с помощью созданного архетипа файловая структура создаётся, но файл .project в корне созданного проекта отсутствует. Помимо этого в переменной $package, которая должна содержать имя пакета состоящее из комбинации groupId и artifactId указанных при генерации, отсутствует artifactId, также и в созданной файловой структуре отсутствует директория соотносящаяся с artifactId.
Другими словами при генерации проекта следующим образом:
mvn archetype:generate \
-DarchetypeGroupId=io.github.xelanimed \
-DarchetypeArtifactId=java11-junit5 \
-DarchetypeVersion=0.0.1 \
-DgroupId=com.example \
-DartifactId=sandbox-test
сгенерированным именем пакета в файле App.java находящемуся в директории src/main/java/com/example является com.example, т.е. вместо ожидаемого файла
src/main/java/com/example/sandbox_test/App.java мы получаем
src/main/java/com/example/App.java
Устанавливал в локальный репозиторий архетип и так: mvn clean install archetype:update-local-catalog и так mvn clean install с "ручным" удалением старого артефакта.
Переломал уже все бубны, но не могу понять в чём проблема и что я делаю неправильно?
Использованные руководства, ресурсы, ссылки по теме
- Guide to Creating Archetypes
- Guide to Maven Archetype by Baeldung
- How to create custom maven archetypes?
- ArchetypeDescriptor
Структура проекта архетипа
java11-junit5/
├── src/
│ ├── main/
│ │ └── resources/
│ │ ├── archetype-resources/
│ │ │ ├── src/
│ │ │ │ ├── main/
│ │ │ │ │ ├── java/
│ │ │ │ │ │ └── App.java
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── filterable/
│ │ │ │ │ │ └── README.md
│ │ │ │ │ └── logback-test.xml
│ │ │ │ └── test/
│ │ │ │ ├── java/
│ │ │ │ │ ├── AppTest.java
│ │ │ │ │ └── TestBase.java
│ │ │ │ └── resources
│ │ │ ├── .gitignore
│ │ │ ├── pom.xml
│ │ │ └── README.md
│ │ └── META-INF/
│ │ └── maven/
│ │ └── archetype-metadata.xml
│ └── test/
│ └── resources/
│ └── projects/
│ └── it-basic/
│ ├── archetype.properties
│ └── goal.txt
├── target
├── .project
├── pom.xml
└── README.md
Исходники
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>io.github.xelanimed</groupId>
<artifactId>java11-junit5</artifactId>
<version>0.0.1</version>
<packaging>maven-archetype</packaging>
<name>Archetype - java11-junit5</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.archetype</groupId>
<artifactId>archetype-packaging</artifactId>
<version>3.2.1</version>
</extension>
</extensions>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.3.2</version>
</plugin>
<plugin>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.2.1</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<addDefaultExcludes>false</addDefaultExcludes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>3.1.1</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.1.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
.project
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>java11-junit5</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>
src/main/resources/META-INF/maven/archetype-metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor
xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
name="java11-junit5">
<requiredProperties>
<requiredProperty key="groupId" />
<requiredProperty key="artifactId" />
<requiredProperty key="version">
<defaultValue>0.0.1-SNAPSHOT</defaultValue>
</requiredProperty>
</requiredProperties>
<fileSets>
<fileSet filtered="true" packaged="true">
<directory>src/main/java</directory>
</fileSet>
<fileSet filtered="true" packaged="true">
<directory>src/test/java</directory>
</fileSet>
<fileSet filtered="true" packaged="false">
<directory>src/main/resources</directory>
</fileSet>
<fileSet filtered="true" packaged="false">
<directory>src/test/resources</directory>
</fileSet>
</fileSets>
</archetype-descriptor>
src/main/resources/archetype-resources/src/main/java/App.java
package $package;
public class App
{
/**
* Using example:
* {@snippet file="AppTest.java" region="main"}
*/
public static void main( final String[] args )
{
System.out.println( "args: " + java.util.Arrays.toString( args ) );
}
}
src/main/java/com/example/App.java
package com.example;
public class App
{
/**
* Using example:
* {@snippet file="AppTest.java" region="main"}
*/
public static void main( final String[] args )
{
System.out.println( "args: " + java.util.Arrays.toString( args ) );
}
}
Ответы (1 шт):
Всё ниже описанное выполнялось в IDE Eclipse...
На счёт отсутствующего файла .project...
При генерации проекта из консоли (mvn archetype:generate...) создаётся только структура проекта без файла .project. Может быть отсутствует какой-либо необходимый файл или ключ конфигурации, но сейчас решается самостоятельным импортом проекта. Для этого нужно выбрать меню File->Import..., в появившемся мастере выбрать General->Projects from Folder or Archive и на следующем шаге выбрать корневую директорию сгенерированного проекта.
При генерации проекта с помощью мастера (File->New->Maven project) проект создаётся, но требует интерактивного режима из-за использования обязательного свойства package (см.ниже).
На счёт содержимого заполнителя/переменной Velocity $package...
Оказывается, что значение groupId является значением по умолчанию и для заполнителя $package. В документации или каких-то других источниках не нашёл информацию о доступных заполнителях, но в данном случае решил так:
src/main/resources/META-INF/maven/archetype-metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor
xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
name="${artifactId}">
<requiredProperties>
<requiredProperty key="version">
<defaultValue>0.0.1-SNAPSHOT</defaultValue>
</requiredProperty>
<requiredProperty key="package">
<defaultValue>${groupId}.${artifactId.replaceAll("-", "_")}</defaultValue>
</requiredProperty>
</requiredProperties>
<fileSets>
<fileSet filtered="true" packaged="true">
<directory>src/main/java</directory>
</fileSet>
<fileSet filtered="true" packaged="true">
<directory>src/test/java</directory>
</fileSet>
<fileSet filtered="true" packaged="false">
<directory>src/main/resources</directory>
</fileSet>
<fileSet filtered="true" packaged="false">
<directory>src/test/resources</directory>
</fileSet>
</fileSets>
</archetype-descriptor>
Здесь мы добавляем обязательное свойство package и устанавливаем ему значение по умолчанию, попутно заменяя в идентификаторе артефакта дефисы на нижнее подчёркивание.