Смягчающая многословие файлов Maven pom.xml(или: критика Maven поклонником)

Мне нравится maven. Мне это очень нравится. Поскольку я переключился на него с Ant, я сохранил много часов работы, строит файлы сборки, администрирует зависимости и т.д., И сохранил много места в моем исходном репозитории управления.

Проблема в том, что файлы maven слишком многословны. Не то, что Ant файлы, где меньше подробностей, но их многословие было подходящим для того, что они делают.

Например, вместо записи:

<dependencies>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
<dependency>
    <groupId>com.myosproject</groupId>
    <artifactId>superlibrary</artifactId>
    <version>7.5</version>
</dependency> 
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
  </dependency>
</dependencies> 

Я хотел бы написать что-то вроде

<dependencies>
    commons-logging/commons-logging/1.1.1
    com.myosproject/superlibrary/7.5
    test:junit/junit/3.8.1
</dependencies>

Или вместо

<build>
    <plugins>
        <plugin>
             <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
                     <source>1.5</source>
                     <target>1.5</target>
                 </configuration>
        </plugin>
    </plugins>

Я хотел бы

<build version="1.5"/>

И (последний пример, и мы закончили), вместо записи:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>native2ascii-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>native2ascii</goal>
            </goals>
            <configuration>
            <encoding>UTF8</encoding>
                </configuration>
        </execution>
     </executions>
</plugin>

Я бы не хотел ничего писать. I.e., maven обнаружил бы наличие папки native2ascii и выполнил бы правильную по умолчанию.

Я знаю, что я смешиваю встроенную функциональность с плагинами и другими вещами, но, пожалуйста, попробуйте взглянуть с точки зрения пользователя maven, который очень доволен инструментом, но думает, что он может быть счастливее.

Итак:

  • Есть ли способ настроить maven для работы следующим образом? (И было бы разумно сделать это)

  • Есть ли еще один инструмент, о котором я не знаю, что это делает?

Ответы

Ответ 1

Конфигурация Maven, безусловно, многословна, Maven 3 стремится решить эту проблему среди других вещей (см. эти видео для какой-то идеи), и есть a плагин для Maven 2, который позволяет определять конфигурацию в YAML. Также существует экспериментальная "красная ветка" , которая поддерживает атрибуты, несколько уменьшая размер конфигурации.

Например:

groupId: org.twdata.maven
artifactId: maven-yamlpom-plugin
version: 1.0-SNAPSHOT
packaging: maven-plugin
name: YAML POM Plugin
dependencies:
  - { groupId: org.apache.maven, artifactId: maven-plugin-api, version: 2.0 }
  - { groupId: SnakeYAML, artifactId: SnakeYAML, version: 1.1 }
  - { groupId: commons-io, artifactId: commons-io, version: 1.4 }
  - { groupId: dom4j, artifactId: dom4j, version: 1.4 }
  - { groupId: junit, artifactId: junit, version: 3.8.1, scope: test }
  - { groupId: xmlunit, artifactId: xmlunit, version: 1.2, scope: test }
build:
  plugins:
    - artifactId: maven-compiler-plugin
      configuration:
    source: 1.5
    target: 1.5
repositories:
  - id: snakeyaml
    name: SnakeYAML repository
    url: http://snakeyamlrepo.appspot.com/repository

С Maven 2 вы можете смягчить многословие, указав общую конфигурацию в родительском проекте, в приведенных вами примерах, зависимости могут быть определены в родительском или в разделе dependencyManagement родителя, чтобы ребенок мог объявить junit зависимость как

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

что немного улучшилось.

Плагины могут быть объявлены в родительском объекте и не должны быть определены в вашем ребенке.

Ответ 2

Я полностью согласен с вами в том, что некоторые части pom.xml могут быть сжаты, в частности часть <dependencies>.

Мне очень нравится Ivy способ объявления зависимостей:

<dependencies>
    <dependency org="commons-lang" name="commons-lang" rev="2.0"/>
    ...

Я видел сообщение в котором предлагался экспериментальный инструмент для создания зависимостей, как это делает Айви. Тем не менее, я никогда не пробовал.