Предположим, у меня есть мультимодульный проект maven. Один из файла POM проекта заключается в следующем:Работа с профилями Maven с плагинами
<?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>
<parent>
<groupId>some.group</groupId>
<artifactId>parent-artifact</artifactId>
<version>0.14.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>artifact-x</artifactId>
<packaging>jar</packaging>
<name>Artifact X</name>
<dependencies>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-a</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-b</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-c</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-d</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-e</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
Допустим, по какой-то причине, я хочу, чтобы переместить некоторые из зависимостей в этом файле POM в профиль. Итак, я перемещаю artifact-c
, artifact-d
, artifact-e
только для зависимостей при использовании profile-1
. profile-1
также используется в других POM в проекте. Мой новый POM теперь становится:
<?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>
<parent>
<groupId>some.group</groupId>
<artifactId>parent-artifact</artifactId>
<version>0.14.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>artifact-x</artifactId>
<packaging>jar</packaging>
<name>Artifact X</name>
<dependencies>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-a</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-b</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>profile-1</id>
<dependencies>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-c</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-d</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-e</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</profile>
</profiles>
</project>
При строительстве, я бегу mvn -Pprofile-1 clean package
на POM верхнего уровня в обоих случаях. Мое предположение заключалось в том, что перемещение зависимостей к профилю не должно ничего менять, когда был указан -Pprofile-1
. Но этого не произошло - некоторые из плагинов начали вести себя ошибочно - например. maven-shade-plugin
не ставил artifact-c
, artifact-d
и artifact-e
в затененном банке и т.д.
Я делаю что-то не так? Профили не должны работать так?
Эти два файла POM не эквивалентны даже при использовании с -Pprofile-1
?
Hey Robert, Спасибо за ответ. Итак, немного больше информации: я действительно не имею права делать это - я пытаюсь изменить Apache Hive, который уже использует профили для зависимостей (разные зависимости для Hadoop-1 и для Hadoop-2). Вот почему я думал, что эти два POM должны быть эквивалентны при использовании профиля-1. Разве это не так? –
Я знаю только Hive и Hadoop по названию, но я бы сказал: результаты - это два разных приложения со своей собственной версией groupId/artifactId /, так что 2 разных помина. Даже при введении классификаторов вы не можете изменить разницу между профилями, они по-прежнему используют один и тот же «pom.xml» –