2014-10-28 5 views
1

Предположим, у меня есть мультимодульный проект 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?

ответ

1

Несмотря на то, что pom.xml позволяет определить его таким образом, вы не должны (называть его дефектом дизайна). В большинстве случаев не имеет смысла просто добавлять зависимости в профиль. Допустимые конструкции зависят от ОС или версии JDK. Также помните, что pom.xml также действует как «потребитель-пом», поэтому другие проекты, использующие этот артефакт, прочитают этот файл pom, чтобы получить транзитивные зависимости. В таком случае вы больше не можете активировать профиль.

В заключение: не пытайтесь разрешить это с помощью профилей. Должно быть лучшее решение.

+0

Hey Robert, Спасибо за ответ. Итак, немного больше информации: я действительно не имею права делать это - я пытаюсь изменить Apache Hive, который уже использует профили для зависимостей (разные зависимости для Hadoop-1 и для Hadoop-2). Вот почему я думал, что эти два POM должны быть эквивалентны при использовании профиля-1. Разве это не так? –

+0

Я знаю только Hive и Hadoop по названию, но я бы сказал: результаты - это два разных приложения со своей собственной версией groupId/artifactId /, так что 2 разных помина. Даже при введении классификаторов вы не можете изменить разницу между профилями, они по-прежнему используют один и тот же «pom.xml» –