2016-04-06 21 views
5

Wenn es zwei Dateien mit unterschiedlichem Inhalt aber mit dem gleichen Namen in zwei verschiedene Maven gibt -Module, die beide zusammen in einer JAR-Datei mit dem maven assembly-plugin, nur eine Datei wird als Teil der .jar-Datei zusammen.Dateien von verschiedenen Maven-Modulen mit dem gleichen Namen können nicht in einer mit dem Maven Assembly-Plugin erstellten JAR-Datei existieren.

Frage: Gibt es eine Möglichkeit sicherzustellen, dass der Inhalt der Dateien beim Erstellen der JAR-Datei in einer Datei zusammengefügt wird?

Ich möchte die Informationen natürlich nicht manuell zusammensetzen, da ich versuche, das zu vermeiden, indem ich das Projekt in verschiedene Module zerlege.

EDIT: Ich habe einen benutzerdefinierten Assembly-Descriptor, den ich behalten möchte, auch wenn ich ein anderes Plugin benutze. Dieser Deskriptor schließt im Grunde genommen jede Sprache außer der englischen für Ressourcen und Fehlertexte aus.

<id>jar-with-dependencies</id> 
<formats> 
    <format>jar</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 
<dependencySets> 
    <dependencySet> 
     <outputDirectory>/</outputDirectory> 
     <useProjectArtifact>true</useProjectArtifact> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
     <unpackOptions> 
      <excludes> 
       <exclude>**/*Resources_*</exclude> 
       <exclude>**/*ErrorsText_*</exclude> 
      </excludes> 
     </unpackOptions> 
    </dependencySet> 
</dependencySets> 

Antwort

5

Wie die maven-assembly-plugin Dokumentation angegeben:

Wenn Ihr Projekt will Ihren Artefakt in einem uber-jar, die Montage-Plugin nur grundlegende Unterstützung bietet verpacken. Verwenden Sie für mehr Kontrolle das Maven Shade Plugin.


Mit der maven-shade-plugin Sie können einen fetten jar haben (wie die Assembly-Plugin) und lösen ähnliche Probleme der Datei Resources transformers mit verschmelzen. In Ihrem Fall würde die Datei AppendingTransformer Dateien mit demselben Namen, aber mit unterschiedlichem Inhalt zusammenführen.

Einige Gläser enthalten zusätzliche Ressourcen (z. B. Eigenschaftendateien), die denselben Dateinamen haben. Um ein Überschreiben zu vermeiden, können Sie sie zusammenführen, indem Sie ihren Inhalt in eine Datei einfügen.

würde eine einfache Konfiguration wie folgt aussehen:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>path/to/file/file-name-here</resource> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

aktualisieren
Sie keine externe Assembly Descriptor für die Schatten-Plugin benötigen, können Sie Ihre Anforderungen direkt als Plugin konfigurieren Aufbau.
In Ihrem Fall, um Ressourcen aus assemblierten Gläsern auszuschließen, können Sie shade filters verwenden.

Eine einfache Konfiguration (oben mit einer verschmolzen werden) aussehen würde:

<configuration> 
    <filters> 
     <filter> 
      <artifact>*:*</artifact> 
      <excludes> 
       <exclude>**/*Resources_*</exclude> 
       <exclude>**/*ErrorsText_*</exclude> 
      </excludes> 
     </filter> 
    </filters> 
</configuration> 
+0

Hauptattribute für Manifest verdauen kann ich die verlieren Möglichkeit, mit dem maven-shade-plugin benutzerdefinierte Assembly-Deskriptoren zu schreiben? – leimooo

+0

@replayleif Was war Ihr Assembly-Deskriptor-Customizing? Kannst du es zu deiner Frage oder zumindest ihrem relevanten Teil hinzufügen? –

+0

Angeforderte Informationen wurden zur Frage hinzugefügt. – leimooo

0

Auch dieses Problem gestoßen, war mein Bedürfnis Ressource-Dateien mit dem gleichen Namen von Abhängigkeits Module, um herauszufiltern, Lösung wie unten:

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <filters> 
          <filter> 
           <artifact>artifact1</artifact> 
           <excludes> 
            <exclude>application.yml</exclude> 
            <exclude>logging.yml</exclude> 
           </excludes> 
          </filter> 
          <filter> 
           <artifact>artifact2</artifact> 
           <excludes> 
            <exclude>application.yml</exclude> 
            <exclude>logging.yml</exclude> 
           </excludes> 
          </filter> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>META-INF/*.SF</exclude> 
            <exclude>META-INF/*.DSA</exclude> 
            <exclude>META-INF/*.RSA</exclude> 
           </excludes> 
          </filter> 
         </filters> 
        </configuration> 
       </execution> 
      </executions> 
</plugin> 

note die folgenden Zeilen ist möglich Ausnahme zu vermeiden:

Exception in thread "main" java.lang.SecurityException: Ungültige Signaturdatei

<filter> 
      <artifact>*:*</artifact> 
      <excludes> 
       <exclude>META-INF/*.SF</exclude> 
       <exclude>META-INF/*.DSA</exclude> 
       <exclude>META-INF/*.RSA</exclude> 
      </excludes> 
</filter> 

Falls Sie weitere Informationen wünschen, finden Sie in Selecting Contents for Uber JAR