2016-07-07 19 views
1

Wenn ein Projekt das maven-jar-plugin verwendet, ist es einfach, eine benutzerdefinierte Manifest-Datei in das jar einzufügen, aber ich finde keine Möglichkeit, dasselbe mit maven shade zu tun. Wie kann ich meine eigene Manifest-Datei verwenden, während ich das "maven-shade-plugin" verwende?Wie kann ich eine benutzerdefinierte MANIFEST.MF-Datei angeben, während das Maven Shade-Plugin verwendet wird?

Weitere Details:

Meine benutzerdefinierte Manifest-Datei in "src/main/resources/META-INF/MANIFEST.MF" befindet. Maven enthält meine Datei nicht, stattdessen wird sie im finalen Jar mit einer Standard-Maven-Manifest-Datei ersetzt.

Der Grund, warum ich eine benutzerdefinierte Manifestdatei brauche, ist die Angabe einiger JavaBeans-Klassen in meinem Manifest für eine Swing-Komponentenbibliothek. Mehrere JavaBeans-Klassen sollten in der Manifestdatei im folgenden Format angegeben werden: described here. Beachten Sie, dass die leeren Zeilen (und die Zeilengruppierung) wichtig sind, um JavaBeans-Klassen im Manifest zu markieren.

Name: SomeBean1.class 
Java-Bean: True 

Name: SomeBean2.class 
Java-Bean: True 

Name: SomeBean3.class 
Java-Bean: True 

Eine Liste der versuchten Lösungen (diese haben nicht funktioniert):

1) Dieser Code funktioniert nur, wenn die Maven-Jar-Plugin (nicht Schatten) verwendet wird.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <configuration> 
     <archive> 
     <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> 
     </archive> 
    </configuration> 
    </plugin> 

2) This link sagt: "Wie bei allen Beispielen hier kann diese Konfiguration in allen Plugins verwendet werden, die Maven Archiver verwenden, nicht nur maven-jar-Plugin wie in diesem Beispiel." Basierend auf diesem Rat habe ich den folgenden Code ausprobiert, aber das hat auch nicht funktioniert. (Maven ersetzt noch meine Manifest-Datei mit der Standard-Manifest-Datei.)

 <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> 
         <archive> 
          <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> 
         </archive> 
         <shadedArtifactAttached>true</shadedArtifactAttached> 
         <shadedClassifierName>core</shadedClassifierName> 
         <createDependencyReducedPom>false</createDependencyReducedPom> 
         <minimizeJar>true</minimizeJar>  
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

3) ich nicht den Schatten „ManifestResourceTransformer“ als described here kann die Arbeit zu tun, aus dem folgenden Grunde. Ich muss JavaBeans-Klassen zu meiner Manifest-Datei hinzufügen, wie oben unter "Zusätzliche Details" beschrieben. Wenn ich jedoch Manifesteinträge mit der Farbpalette "ManifestResourceTransformer" hinzufüge, werden diese Einträge in einer unberechenbaren (zufällig erscheinenden) Reihenfolge in die Manifestdatei eingefügt. Zum Angeben von JavaBeans-Klassen ist die Reihenfolge der Manifesteinträge (die Zeilenreihenfolge) wichtig.

4) Ich habe versucht, IncludeResourceTransformer zu verwenden, aber der folgende Code erzeugt den folgenden Fehler: "Fehler beim Erstellen des schattierten Jar: Doppeleintrag: META-INF/MANIFEST.MF".

    <configuration> <shadedArtifactAttached>true</shadedArtifactAttached> 
         <shadedClassifierName>core</shadedClassifierName><createDependencyReducedPom>false</createDependencyReducedPom> 
         <minimizeJar>true</minimizeJar>  
         <transformers> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
           <resource>META-INF/MANIFEST.MF</resource> 
           <file>src/main/resources/META-INF/MANIFEST.MF</file> 
          </transformer> 
         </transformers> 
        </configuration> 

Vielen Dank im Voraus für jede Hilfe!

Antwort

2

Die folgende Pom-Konfiguration ermöglicht es dem Programmierer, die vom Apache Maven Shade-Plugin erstellte Manifest-Datei durch eine benutzerdefinierte Manifest-Datei zu ersetzen. Die benutzerdefinierte Manifest-Datei sollte in diesem Verzeichnis in dem Maven-Projekt platziert werden: "src/main/resources/META-INF/MANIFEST.MF"

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

          <!-- Don't do this: Avoid adding anything that makes shade create or modify a manifest file. 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.mypackage.MyMainClass</mainClass> 
          </transformer> 
          --> 

          <!-- Add a transformer to exclude any other manifest files (possibly from dependencies). --> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"> 
           <resource>MANIFEST.MF</resource> 
          </transformer> 

          <!-- Add a transformer to include your custom manifest file. --> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
           <resource>META-INF/MANIFEST.MF</resource> 
           <file>src/main/resources/META-INF/MANIFEST.MF</file> 
          </transformer> 

         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin>