Maven 3 профиль с расширениями
Мой вопрос был рассмотрен в этой теме, но объяснение не ясно.
У меня есть это определение сборки в одном из моих файлов pom.xml:
<build>
<finalName>${my.project}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
<extensions>
<extension>
<groupId>org.kuali.maven.wagons</groupId>
<artifactId>maven-s3-wagon</artifactId>
<version>1.1.19</version>
</extension>
</extensions>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/settings.properties</include>
</includes>
</resource>
</resources>
</build>
Обратите внимание, что я использую расширение maven-s3-wagon. Далее я хотел бы иметь 2 разных профиля, каждый со своими настройками, плагинами и расширениями, но maven не допускает тег расширений под профилем.
Когда я пытаюсь использовать профиль:
<profiles>
<profile>
<id>local-build</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<finalName>${my.project}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
<extensions>
<extension>
<groupId>org.kuali.maven.wagons</groupId>
<artifactId>maven-s3-wagon</artifactId>
<version>1.1.19</version>
</extension>
</extensions>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/settings.properties</include>
</includes>
</resource>
</resources>
</build>
</profile>
</profiles>
Я получаю сообщение об ошибке в моем pom:
cvc-complex-type.2.4.a: Invalid content was found starting with element 'extensions'. One of '{"http://maven.apache.org/POM/4.0.0":defaultGoal, "http://maven.apache.org/POM/
4.0.0":resources, "http://maven.apache.org/POM/4.0.0":testResources, "http://maven.apache.org/POM/4.0.0":directory, "http://maven.apache.org/POM/4.0.0":filters, "http://
maven.apache.org/POM/4.0.0":pluginManagement}' is expected.
Вопрос Итак, использование тега расширения означает, что я не могу использовать профили? Как я могу использовать или изменить расширения сборки через профиль?
3 ответа
В самом деле, официальная ссылка Maven POM не ясно о возможном использовании extensions
как часть профиля Maven, так как в нем говорится, что вы можете иметь build
элемент внутри него, но не то, что из build
раздел.
Тем не менее, официальная модель Maven эффективно фильтрует и предоставляет build
раздел, который вы можете использовать в profile
раздел. И действительно extensions
не там.
Однако что такое расширения Maven? Улучшение сборки / жизненного цикла, но также (и по существу): библиотека, добавленная в путь к классам среды выполнения сборки Maven, которая участвует в сборке, но не упакована с последним артефактом.
Следовательно, в таком сценарии (если вам нужно иметь расширения в профиле или иметь профиль для изменения / добавления расширения), вы можете использовать следующий прием:
- Используйте безвредное расширение как расширение по умолчанию для вашей сборки (где безвредное означает любую библиотеку, которая может быть частью вашего пути к классу сборки и, по сути, вообще не влиять на нее)
- Имеют свойства, определяющие координаты GAV (G roupId, A rtifactId, V ersion) этого расширения
- Иметь профиль, который перекрывает эти свойства с желаемым (полезным) расширением
В качестве примера приведен следующий пример POM:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<extension.groupId>junit</extension.groupId>
<extension.artifactId>junit</extension.artifactId>
<extension.version>4.11</extension.version>
</properties>
<build>
<extensions>
<extension>
<groupId>${extension.groupId}</groupId>
<artifactId>${extension.artifactId}</artifactId>
<version>${extension.version}</version>
</extension>
</extensions>
</build>
<profiles>
<profile>
<id>customize-extension</id>
<properties>
<extension.groupId>junit</extension.groupId>
<extension.artifactId>junit</extension.artifactId>
<extension.version>4.12</extension.version>
</properties>
</profile>
</profiles>
</project>
Сборка по умолчанию (без customize-extension
профиль активирован), будет использовать определенный по умолчанию properties
и как таковой добавить junit
как расширение сборки: это безвредно (хотя может создавать конфликты с другими junit
версия вашей сборки, поэтому убедитесь, что вы используете ту же версию, используйте еще более безопасную библиотеку для этого).
Вы можете проверить, что Maven подхватит его, запустив действительно первую фазу сборки, просто чтобы проверить информацию в нашем случае и включить флаг отладки:
mvn initialize -X
И проверка как часть журнала сборки:
[DEBUG] Populating class realm extension>junit:junit:4.11
[DEBUG] Included: junit:junit:jar:4.11
Теперь давайте воспользуемся нашим приемом: давайте добавим (изменим) расширение сборки через профиль:
mvn initialize -X -Pcustomize-extension
И как часть нашего журнала сборки мы будем иметь:
[DEBUG] Populating class realm extension>junit:junit:4.12
[DEBUG] Included: junit:junit:jar:4.12
Бинго. Maven выбрал другое расширение (в этом случае другую версию, 4.12
) и нам удалось изменить (или фактически добавить значимое) расширение сборки через профиль.
Просто сумасшедшая идея: использовать модули
Определить родителя pom
как это:
<groupId>org.example</groupId>
<artifactId>my-parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<profiles>
<profile>
<id>use-pom1</id>
<modules>
<module>pom1</module>
</modules>
</profile>
<profile>
<id>use-pom2</id>
<modules>
<module>pom2</module>
</modules>
</profile>
</profiles>
Определите желаемые расширения на pom1
а также pom2
,
Я думаю, что решение здесь http://maven.apache.org/guides/mini/guide-using-extensions.html
Определите раздел сборки, в котором определены расширения, а затем в профиле установите атрибут true (как во втором профиле, показанном ниже)
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.9</version>
</extension>
</extensions>
</build>
<profiles>
<profile>
<id>create-default</id>
<activation>
<activeByDefault>true</activeByDefault>
<property>
<name>build</name>
<value>full</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>create-core</id>
<activation>
<property>
<name>build</name>
<value>full</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<extensions>true</extensions>
<version>2.6</version>
<configuration>
<finalName>import-station-core-${project.version}</finalName>
</configuration>
<executions>
<execution>
<id>make-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>