web-dev-qa-db-de.com

Wie erstelle ich mit Maven ein auf Feder basierendes ausführbares Glas?

Ich habe ein Maven-basiertes Spring-WS-Clientprojekt, das ich als einzelnes Glas verpacken möchte. In Eclipse läuft alles einwandfrei. Wenn ich versuche, es als ausführbare Dose zu verpacken, erhalte ich ClassNotFound-Ausnahmen, da die Spring-Dosen nicht in meiner Anwendungs-Dose enthalten sind.

Also fügte ich das maven-shade-plugin hinzu, um alle meine Abhängigkeiten in meinen Anwendungsbehälter aufzunehmen. Wenn ich mir meinen App-Jar anschaue, sehe ich alle Klassendateien aller enthaltenen Abhängigkeiten (alle Library-Jar sind explodiert).

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.cws.cs.Client</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.7</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>

        </plugin>
    </plugins>
</build>

Mein Problem ist, dass beim Packen meine mehrfachen Federabhängigkeiten unterschiedliche META-INF/spring.schemas -Dateien haben, die sich überschreiben. Folglich hat mein endgültiges Glas eine unvollständige Datei spring.schemas.

Wenn ich versuche, mein ausführbares jar auszuführen, erhalte ich Spring-Fehlermeldungen, dass Dateien nicht gefunden werden können, da die Datei spring.schemas unvollständig ist (die JAR-Datei des Spring-WS hat die spring.schemas-Datei des Spring-Core überschrieben). 

Mein ausführbares jar META-INF/spring.schemas:

http\://www.springframework.org/schema/web-services/web-services-1.5.xsd=/org/springframework/ws/config/web-services-1.5.xsd
http\://www.springframework.org/schema/web-services/web-services-2.0.xsd=/org/springframework/ws/config/web-services-2.0.xsd
http\://www.springframework.org/schema/web-services/web-services.xsd=/org/springframework/ws/config/web-services-2.0.xsd

Anstelle von Spring-beans.jar META-INF/spring.schemas:

http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd
http\://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd
http\://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd
http\://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd
http\://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd
http\://www.springframework.org/schema/tool/spring-tool-3.1.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd
http\://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd
http\://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd
http\://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd
http\://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd
http\://www.springframework.org/schema/util/spring-util-3.1.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd
http\://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd

Ich bin verblüfft Ich bin nicht sicher, ob/wie ich alles als einzelnes ausführbares Glas verpacken kann. Ich weiß nicht, ob es sich hierbei um ein Konfigurationsproblem für das Schatten-Plugin handelt oder ob ich etwas Unmögliches versuchen möchte. Es scheint nicht richtig, dass ich meine eigene spring.schemas-Datei manuell erstellen müsste (eine Verkettung der anderen).

Ich bin vielleicht ein bisschen mit der Waffe gesprungen. Bei der Suche nach mehr Informationen über das Schatten-Plugin fiel mir der AppendingTransformer auf, den ich zuvor übersehen hatte. Mein Anliegen ist jedoch, zu wissen, welche anderen Dateien dieselben Probleme haben. Ich habe diese Frühlingsausgabe entdeckt/gefangen. Ich habe keine Ahnung von anderen Bibliotheken, die etwas ähnliches machen ...

Anregungen werden gebeten.

28
Eric B.

Verwenden Sie statt maven-shade-plugin onejar-maven-plugin . One-JAR ermöglicht das Packen einer Java-Anwendung zusammen mit ihren abhängigen Jars in eine einzige ausführbare Jar-Datei.

6
amra

Sie können die folgende Konfiguration hinzufügen, damit der Inhalt der .schema-Dateien aus allen Jars zusammengefügt wird.

<configuration>
  <transformers>
    <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
      <resource>META-INF/spring.handlers</resource>
    </transformer>
    <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
      <resource>META-INF/spring.schemas</resource>
    </transformer>
  </transformers>
</configuration>
59
gkamal

Gestern bin ich auch auf dieses Problem gestoßen.

Die Lösung bestand darin, die erforderlichen Dateien durch manuelle Verkettung und Konfiguration des Assembly-Plugins so vorzubereiten:

  <files>
    <file>
        <source>src/META-INF/spring.schemas</source>
        <outputDirectory>META-INF</outputDirectory>
    </file>
    <file>
        <source>src/META-INF/spring.handlers</source>
        <outputDirectory>META-INF</outputDirectory>
    </file>
  </files>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
      <unpackOptions>
        <excludes>
            <exclude>META-INF/spring.handlers</exclude>
            <exclude>META-INF/spring.schemas</exclude>
        </excludes>
      </unpackOptions>  
    </dependencySet>
  </dependencySets>

HINWEIS: Die Verwendung eines Jar-Ansatzes ist nicht gut genug - Sie können nicht sicher sein, ob gemischte Dateien vorhanden sind. Versuchen Sie, alle Abhängigkeiten so zu exportieren, wie sie sind ... 

4
Mikhail Tsaplin
Assembly plugin have issues, use below plugin

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>at.seresunit.lecturemanager_connector.App</mainClass>
                    </transformer>
                    <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.handlers</resource>
                    </transformer>
                    <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.schemas</resource>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

you may get security exception resolve it using below configuration

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

Hast du das maven-Assembly-Plugin ausprobiert?

Es wird ein einzelnes Jar mit Abhängigkeiten für Sie erstellt, und es kann dazu führen, dass dieses Jar ausführbar ist:

Verwenden Sie mainClass, um die Klasse anzugeben, die Sie ausführen möchten.

<plugin>
    <artifactId>maven-Assembly-plugin</artifactId>
    <version>2.3</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <id>make-Assembly</id> <!-- this is used for inheritance merges -->
        <phase>package</phase> <!-- bind to the packaging phase -->
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>