2009-09-08 5 views
15

Ich mag Maven. Ich mag es sogar sehr sehr. Seit ich von Ant auf das System umgestiegen bin, habe ich viele Arbeitsstunden eingespart, Baudateien erstellt, Abhängigkeiten verwaltet usw. und viel Platz in meinem Quellcodeverwaltungs-Repository gespart.Verringerung der Ausführlichkeit von Maven pom.xml-Dateien (oder: eine Kritik von Maven von einem Fan)

Das Problem ist, dass Maven-Dateien zu ausführlich sind. Nicht, dass Ant-Dateien weniger ausführlich waren, aber ihre Ausführlichkeit war angemessen für das, was sie tun.

Zum Beispiel anstelle des Schreibens:

<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> 

Ich möchte etwas schreiben wie

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

Oder statt

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

Ich möchte

<build version="1.5"/> 

Und (letztes Beispiel und wir sind fertig), statt des Schreibens:

<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> 

ich nichts nicht zu haben, schreiben möchten . Das heißt, Maven würde das Vorhandensein des Ordners native2ascii erkennen und das Richtige tun standardmäßig.

Ich weiß, dass ich integrierte Funktionalität mit Plugins und anderen Dingen mische, aber bitte versuchen Sie aus der Sicht eines Maven-Benutzers, der sehr glücklich mit dem Tool ist, aber denkt, er könnte glücklicher sein.

So:

  1. Gibt es eine Möglichkeit, ich Maven konfigurieren kann, so zu arbeiten? (Und wäre es klug, dies zu tun)

  2. Gibt es vielleicht ein anderes Werkzeug, das mir nicht bewusst ist, dass das tut?

+2

+ 1 für den guten Geist Ihrer Frage :) –

Antwort

9

Maven Konfiguration sicherlich ausführlich ist, Maven 3 soll dies unter anderem begegnen (siehe these videos für einige Idee), und es gibt ein plugin for Maven 2, die für die Konfiguration ermöglicht in YAML definiert werden. Es gibt auch eine experimental "terse" branch, die Attribute unterstützt und die Größe der Konfiguration etwas reduziert.

Zum Beispiel:

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 

Mit Maven 2 können Sie die Ausführlichkeit durch die Festlegung gemeinsame Konfiguration in einem übergeordneten Projekt mildern, die in den Beispielen Sie zitieren, können die Abhängigkeiten alle in den übergeordneten definiert werden oder im dependencyManagement Abschnitt eines Elternteils so kann ein Kind die junit Abhängigkeit als

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

erklären, die ein bisschen eine Verbesserung ist.

Die Plugins können beide im Parent deklariert sein und müssen nicht in Ihrem Kind definiert sein.

4

Ich stimme Ihnen vollkommen zu, dass einige Teile der pom.xml kondensiert sein können, insbesondere der <dependencies> Teil.

Ich mag die Art und Weise Ivy deklarieren Abhängigkeiten wirklich:

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

Ich habe ein blog post gesehen, dass ein experimentelles Werkzeug, um die Abhängigkeiten wie Ivy tun zu schaffen vorgeschlagen. Ich habe es jedoch noch nie ausprobiert.

+0

Wenn sich nur die Maven-Leute die Mühe gemacht hätten, etwas über XML richtig zu lernen, insbesondere, dass "Attribute" existieren, bevor sie begannen .... fangen Sie mich nicht einmal an auf . –