Ich habe Probleme beim Aufbau eines Maven-Projekts. Ich habe die Anforderung, deterministische JAR-Dateien zu erzeugen, die in verschiedenen Builds und Versionen binärkonsistent sein müssen, falls zwischen diesen Builds keine Quellcodeänderungen auftreten. Zu diesem Zweck habe ich this article zur Orientierung verwendet.Manuelles Anhängen des Hauptartefakts, wenn es von maven-assembly-plugin erstellt wird
Ich habe erfolgreich geschafft, meine Gläser zu bauen, und sie sind konsistent, um meine Anforderungen zu erfüllen. Hier ist meine Konfiguration:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>step-1-remove-timestamp</id>
<phase>prepare-package</phase>
<configuration>
<target>
<touch datetime="01/01/2015 00:10:00 am">
<fileset dir="target/classes"/>
<fileset dir="src"/>
</touch>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>step-3-rename-assembly</id>
<phase>package</phase>
<configuration>
<target>
<copy file="${project.build.directory}/${project.build.finalName}-deterministic.zip"
tofile="${project.build.directory}/${project.build.finalName}.jar"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/zip.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>step-2-make-assembly</id>
<phase>prepare-package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
In dem obigen Code, den ich bauen und das Glas als Zip-Paket, dann kopieren Sie die Zip über die erwartete jar Artefakt.
Das Problem mit dem oben genannten ist, dass maven immer noch die maven-jar-plugin
ausführt, so dass das manuell zusammengebaute Glas durch das der maven-jar-plugin
überschrieben wird. Ich möchte dieses Glas nicht verwenden, da es nicht meinen Anforderungen entspricht.
Also, ich habe die maven-jar-plugin
Ausführung deaktiviert, indem sie explizit Einstellung für eine ungültige Phase zu laufen, wie folgt: (sah, dass von other posts here)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>default-jar</id>
<phase>never</phase>
<configuration>
<finalName>unwanted</finalName>
<classifier>unwanted</classifier>
</configuration>
</execution>
</executions>
</plugin>
Alles in Ordnung scheint, bis ich mein Haupt-Glas entdeckt Artefakt wird nie im Verzeichnis .m2
installiert. Um dies zu korrigieren, habe ich auch die maven-helper-plugin
so dass ich manuell alle Artefakte lege ich von der Assembler-Plugin produzieren:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.9.1</version>
<executions>
<execution>
<id>attach-instrumented-jar</id>
<phase>verify</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${project.build.directory}/${project.build.finalName}.jar</file>
<type>jar</type>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
Dies führt zu einem Fehler, den ich nicht in der Lage bin zu lösen:
[ERROR] Fehler beim Ausführen des Ziels org.codehaus.mojo: build-helper-maven-plugin: 1.9.1: attach-artefakt (attach-instrumentiert-jar) im Projekt my-project: Ausführung attach-instrumentiert-jar des Ziels org.codehaus. mojo: build-helper-maven-plugin: 1.9.1: attach-artifact fehlgeschlagen: Für artefact {full-name-of-my-project.jar}: Ein angehängtes Artefakt muss eine andere ID als das entsprechende Hauptartefakt haben. -> [Hilfe 1]
Gibt es eine Möglichkeit, dieses Problem zu überwinden? Ich habe nach Lösungen gesucht und empfehle am besten, Klassifikatoren zu verwenden, aber ich möchte das Hauptartefakt wie das maven-jar-plugin
installieren. Andere Software, die wir entwickeln, wird die Standard-Jar-Abhängigkeit benötigen, und wir wollen vermeiden, dass unser Setup durch die unangemessene Einführung von Klassifikatoren verkompliziert wird.