Смягчающая многословие файлов 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"/>
...
Я видел сообщение в котором предлагался экспериментальный инструмент для создания зависимостей, как это делает Айви. Тем не менее, я никогда не пробовал.