2010-11-03 4 views
30

vorangestellt Ich verwende das "Schatten" Maven2-Plugin, um eine monolithische JAR mit allen Java-Abhängigkeiten gebündelt zu erstellen. Der entsprechende Abschnitt in pom.xml ist ziemlich einfach:Maven "schattiert" JAR ist mit "Original" in den Dateinamen

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>1.4</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <finalName>${project.artifactId}-${project.version}-SHADED</finalName> 
       <transformers> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <mainClass>com.mypackage.MyClass</mainClass> 
        </transformer> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Allerdings sind die Build-Ergebnisse ungerade. Es scheint, dass zwei Dateien tatsächlich von diesem Maven Plugin erstellt:

myartifact-1.0.0-SHADED.jar (zero bytes) 
original-myartifact-1.0.0-SHADED.jar (10 MB) 

Die JAR-Datei mit dem Präfix „Original“ richtig aufgebaut ist und funktioniert gut. Ich nehme an, ich könnte es einfach umbenennen, um dieses Präfix abzustreifen und auf meinen fröhlichen Weg zu gehen.

Allerdings bin ich sehr gespannt was hier mit dem "Schatten" -Plugin vorgeht. Es sieht so aus, als wäre die "Original" -Datei ein temporäres Arbeitsraum-Thing, das am Ende des Prozesses umbenannt werden soll, und das endgültige Umbenennen wird einfach nicht abgeschlossen. Es gibt jedoch keine offensichtliche Erklärung dafür (d. H. Dateisystemberechtigungen usw.). Hat das schon mal jemand gesehen?

+2

Sie könnten erwägen, Ihr Häkchen auf Stewarts Antwort zu setzen. – Gray

+0

Eine Umgehung ist es, '/tmp' zu setzen. Die 'original - * .jar'-Datei wird noch geschrieben, aber sie befindet sich zumindest nicht im Entwicklungspfad. –

Antwort

19

Maven's Build Schritte werden das Glas target/artifact-version.jar erstellen.

Dann läuft das Schatten-Plugin. Normalerweise benennt er dieses jar in target/original-artifact-version.jar um und gibt dem schattierten JAR den Namen target/artifact-version.jar.

Sie konfigurieren das Shade-Plugin jedoch so, dass es einen anderen Namen verwendet. Wenn es keinen guten Grund dafür gibt, entferne ich <finalName> aus deiner Konfiguration und lebe mit dem, was dir das Schatten-Plugin geben möchte.

+10

Das war es. Seufz ... Ich genieße meine Experimente mit Maven, und ich mag die Kraft, die es mir gibt. Ich konnte jedoch viel von der Kultur "kämpfe nicht Maven" und "tue, was Maven will" in dieser Gemeinschaft weglassen. Ich kann es verstehen, einen Fehler oder eine Warnmeldung zu werfen, wenn man Maven bittet, eine schlechte Übung zu machen ... aber wenn Maven einfach auf eine buggy Weise versagt, klingen diese Sätze wie leere Ausreden. Wenn das Plugin "nicht möchte", dass ich einen benutzerdefinierten endgültigen Namen im '' Element deklariere ... dann BIETEN SIE DAS '' ELEMENT ALS TEIL DES SCHEMA AN? Das ist einfach ein Fehler. –

+2

Oh, ich habe nicht die Absicht dich zu beschimpfen, Anon ... einfach Maven und seine normale Gemeinschaft im Allgemeinen zu packen! :) Ich schätze Ihre Hilfe. –

+0

@Steve - nichts für ungut. Glaub mir, ich meckere Maven ständig an. Im Moment bin ich in Sorge, weil ich die Deployment-URL in meiner settings.xml nicht so leicht überschreiben kann :-) Und gelegentlich musste ich mir den Quellcode ansehen, um herauszufinden, was schief gelaufen ist. – Anon

33

Ich weiß, dass diese Frage alt ist, dachte aber, es hat sich gelohnt, die folgenden Informationen hinzuzufügen.

Ich denke, die von Steve ursprünglich gewünschte Ausgabe ist die auf dieser Seite der maven-shade-plugin documentation angegeben.

<shadedArtifactAttached>true</shadedArtifactAttached> 
<shadedClassifierName>jar-with-dependencies</shadedClassifierName> 
4

@Stewart Im Anschluss an eine etwas bessere Antwort zu geben (keine Beleidigung für entweder: D):

Der Grund, warum Sie die original- bekommen * Chaos zweierlei sein:

  1. festlegen <finalName> bedeutet, dass Sie einen anderen Namen als den, den Maven Ihnen standardmäßig gibt (dh wie der Name des Artefakts: artifactId-version.jar oder artifactId-version-shaded.jar) haben möchten. Wenn Sie einen endgültigen Namen angeben, der mit einem der beiden identisch ist, wird versucht, den alten Namen als Original - *. Jar zu speichern und ihn dann mit dem neuen schattierten zu überschreiben. In deinem Fall sagst du ihr, dass sie die letzte JAR * -shaded.jar machen soll, was bereits der Fall ist, wenn sie aus Maven kommt (bevor sie sie standardmäßig in artifactId-version.jar eintragen), also wird sie zuerst zurückgesetzt bis die alte *-shaded.jar als original-*-shaded.jar und dann Bugs out beim Schreiben der Bytes auf die neue *-shaded.jar angesichts der alten verschwunden (sie scheinen es umzubenennen).

  2. (was mein Fall war) <shadedClassifierName> verwenden, die nur das Suffix Maven ändert verwendet die * -shaded.jar zu erzeugen, in Kombination mit <finalName> kann auch die gleichen Ergebnisse liefern. Wenn Sie möchten, können Sie einfach verwenden und ein anderes Suffix angeben und damit fertig werden, ohne <finalName> mit der ganzen Sache angeben zu müssen. In meinem Fall hatte ich beide eingerichtet, um die Ausgabe das gleiche zu nennen: zB: artifactId-version-all.jar aber die Verwendung von 'all' als Classifier brachte mich zurück zu dem in # 1 beschriebenen Szenario.

+1

Vielleicht möchten Sie auch verwenden, aber das bedeutet nur, dass Sie das schattierte Artefakt im Maven Repo haben wollen, nachdem Sie es zusammen mit dem Original installiert haben. Ändert nichts wirklich, wenn es darum geht, es zu benennen. –

Verwandte Themen