Maven Tipp – API-Kompatibilität mit dem Animal Sniffer Plugin sicherstellen

Möchte man in einem Maven Projekt gegen eine bestimmte Version einer API entwickeln, lässt sich das sehr elegant mit dem Animal Sniffer Plugin sicherstellen. Das Plugin prüft dazu, ob die eigenen Klassen auch nur die Klassen, Methoden und Felder nutzen, die durch die spezifische API bereitgestellt werden. Die Prüfung erfolgt dabei gegen eine Signatur der API, welche vorher erstellt werden muss.

Ein typischer Anwendungsfall ist das Entwickeln eines Artefakts, das in einer älteren JavaSE Version (z.B. 1.4) zur Ausführung kommen soll. In diesem Falle reicht es nicht, nur den Compiler für die Erzeugung von Version 1.4 kompatiblen Bytecode zu konfigurieren. Zusätzlich muss auch sichergestellt werden, dass keine Methoden aufgerufen werden, die erst Teil einer späteren API Spec sind.

Da für die gängigen JavaSE Versionen bereits fertige Signaturen existieren (siehe Animal Scents Codehaus Projekt), reicht hierfür folgendes POM-Konfigurationsfragment:

[...]
<build>
	<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.4</source>
                    <target>1.4</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>animal-sniffer-maven-plugin</artifactId>
                <version>1.6</version>
                <executions>
                    <execution>
                        <id>check-java-version</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <signature>
                                <groupId>org.codehaus.mojo.signature</groupId>
                                <artifactId>java14</artifactId>
                                <version>1.0</version>
                            </signature>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
	</plugins>
</build>
[...]

Wird nun beispielsweise die erst mit JavaSE 1.6 verfügbare Methode java.lang.String.isEmpty() verwendet, bricht der Bild mit folgender Meldung ab:

[...]
[INFO] --- animal-sniffer-maven-plugin:1.6:check (check-java-version) @ superproject ---
[INFO] Checking unresolved references to org.codehaus.mojo.signature:java14:1.0
[ERROR] Undefined reference: java/lang/String.isEmpty()Z in D:projectssuperprojecttargetclassesdeoiosuperprojectSuperManager.class
[...]

Für den Einsatz des Animal Sniffer Plugins in Ant-basierten Projekten, sind entsprechende Ant-Tasks verfügbar.

Short URL for this post: http://wp.me/p4nxik-yH
This entry was posted in Build, config and deploy and tagged , , , . Bookmark the permalink.

Leave a Reply