Сборки для разных платформ способом Maven - PullRequest
5 голосов
/ 04 октября 2011

У меня есть проект с подмодулем a:jar, для которого требуется различный набор зависимостей, в зависимости от того, для какой платформы он компилируется. Код одинаков для всех платформ. Например. в Android библиотека httpcomponents уже включена в состав ОС, в то время как я должен включить ее для сборок для сред J2SE. У меня также есть другой подмодуль, который собирает несколько подмодулей и их зависимости в архив. Как я могу надежно настроить подмодуль сборки, чтобы взять все подмодули, скомпилированные для соответствующей платформы, и их зависимости, подходящие для этой платформы?

Я пытался использовать профили для создания a:jar:android и a:jar:j2se. Однако объявление зависимости от одного из них может привести к странным зависимостям в сборке. То есть, dependency:tree проекта сборки иногда включает в себя зависимости от a:jar:j2se (не имеет значения, объявил ли я использовать a:jar:android или a:jar:j2se в сборке), а иногда и другие. Это изменилось (часто) после того, как я обновил jar a в локальном хранилище. Переключение в сборочном проекте использует также профили.

Я мог бы решить это , применив те же зависимости к профилям проекта сборки , которые необходимы для профиля отдельных подмодулей. Но поскольку я должен повторить себя в POM, есть, вероятно, более мудрый способ достичь этого. Поскольку я новичок в Maven, мне интересно, что это? Я не хочу дублировать код (это было бы еще более повторяющимся, поскольку код остался прежним), и я не хотел бы дублировать части POM, так как их изменение из-за обновления версий может быть сложным.

Некоторый конкретный материал: Зависимости от a:jar POM:

  <dependencies>
    .....
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpmime</artifactId>
      <version>4.0.1</version>
      <scope>compile</scope>
      <!-- Exclusion in the common part, they are provided in the profiles from different sources -->
      <exclusions>
        <exclusion>
          <groupId>org.apache.httpcomponents</groupId>
          <artifactId>httpclient</artifactId>
        </exclusion>
        ....
      </exclusions>
    </dependency>
  </dependencies>
  <profiles>
    <profile>
      <id>android</id>
      <dependencies>
        <dependency>
          <groupId>com.google.android</groupId>
          <artifactId>android</artifactId>
          <version>1.6_r2</version>
          <scope>provided</scope>
        </dependency>   
      </dependencies>
    </profile>
    <profile>
      <id>java</id>
      <dependencies>
        <dependency>
          <groupId>org.apache.httpcomponents</groupId>
          <artifactId>httpclient</artifactId>
          <version>4.0.1</version>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>commons-codec</groupId>
          <artifactId>commons-codec</artifactId>
          <version>1.3</version>
          <scope>compile</scope>
        </dependency>
      </dependencies>
    </profile>
  </profiles>

Профили сборки (в которой используется подключаемый модуль Maven Assembly):

  <profiles>
    <profile>
      <id>android</id>     
      <dependencies>
        <dependency>
          <groupId>a</groupId>
          <artifactId>a</artifactId>
          <version>${project.version}</version>
          <classifier>android</classifier>
          <type>jar</type>
        </dependency>
        <!-- Duplicate --> 
        <dependency>
          <groupId>com.google.android</groupId>
          <artifactId>android</artifactId>
          <version>1.6_r2</version>
          <scope>provided</scope>
        </dependency>   
        <!-- Duplicate --> 
      </dependencies>
    </profile>
    <profile>
      <id>java</id>
      <dependencies>
        <!-- Duplicate -->
        <dependency>
          <groupId>org.apache.httpcomponents</groupId>
          <artifactId>httpclient</artifactId>
          <version>4.0.1</version>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>commons-codec</groupId>
          <artifactId>commons-codec</artifactId>
          <version>1.3</version>
          <scope>compile</scope>
        </dependency>
        <!-- /Duplicate --> 
        <dependency>
          <groupId>a</groupId>
          <artifactId>a</artifactId>
          <version>${project.version}</version>
          <classifier>java</classifier>
         <type>jar</type>
        </dependency>
      </dependencies>
    </profile>
  </profiles>

Я бы хотел избавиться от помеченных объявлений зависимостей.

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

Есть несколько решений:

  1. Зависимости этих подмодулей могут быть объявлены как «предоставленные», в этом случае в проект вы включаете зависимость от подмодуля вместе с явными зависимостями, которых нет у платформы.

  2. Используйте <exclusions> для ненужных зависимостей.

  3. Используя (1) или (2) выше, создайте еще один «структурный» подмодуль a-android: pom a-j2se: pom, который просто описывает зависимости, и используйте эти модули из ваших проектов.

1 голос
/ 04 октября 2011

Вы можете добавить профиль maven в pom и активировать каждый профиль в зависимости от ОС. Активация профиля поддерживает такие опции. Затем в каждом профиле для конкретной ОС вы можете перечислить необязательные зависимости. Вот статья о профилях -> http://maven.apache.org/guides/introduction/introduction-to-profiles.html

В вашем случае это будет примерно так:

<profiles>
  <profile>
    <activation>
      <os>
        <family>Windows</family>
      </os>
    </activation>
    <dependencies>
      ... specific dependencies for Windows
    </dependencies>
    <plugins>
      ... specific build plugins for Windows
    </plugins>
  </profile>
  <profile>
    <activation>
      <os>
        <family>unix</family>
      </os>
    </activation>
    <dependencies>
      ... specific dependencies for unix
    </dependencies>
    <plugins>
      ... specific build plugins for unix
    </plugins>
  </profile>
  <dependencies>
    ... Common dependencies
  <dependencies>
  <plugins>
    ... Common build plugins
  </plugins>
</profiles>
...