32

単一の jar としてパッケージ化したい Maven ベースの Spring-WS クライアント プロジェクトがあります。日食では、すべてが適切に実行されます。実行可能 jar としてパッケージ化しようとすると、Spring jar がアプリケーション jar に含まれていないため、ClassNotFound 例外が発生します。

そこで、maven-shade-pluginを追加して、すべての依存関係をアプリケーション jar に含めました。アプリ jar を見ると、含まれているすべての依存関係からのすべてのクラス ファイルが表示されます (すべてのライブラリ jar が展開されています)。

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

私の問題は、パッケージ化プロセスで、複数の春の依存関係に、互いにオーバーライドする異なるMETA-INF/spring.schemasファイルがあることです。その結果、最終的な jar には不完全な spring.schemas ファイルがあります。

そのため、実行可能な jar を実行しようとすると、spring.schemas ファイルが不完全であるためファイルが見つからないという Spring エラー メッセージが表示されます (Spring-WS の jar が Spring-core の spring.schemas ファイルをオーバーライドしました)。

私の実行可能 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

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

私は困惑しています。すべてを単一の実行可能 jar としてパッケージ化できるかどうか、またはその方法がわかりません。これがシェード プラグインの設定の問題なのか、不可能なことをしようとしているのかはわかりません。独自の spring.schemas ファイル (他のファイルの連結) を手動で作成する必要があるというのは正しくないように思われます。

私は少し銃を飛ばしたかもしれません。シェード プラグインについてさらに情報を掘り下げていくと、以前は見逃していたAppendingTransformerに気付きました。しかし、私の懸念は、他のどのファイルが同じ問題を抱えているかを知る方法ですか? この特定の春の問題を発見/キャッチしました。同様のことをしている可能性のある他のライブラリについてはわかりません...

任意の提案をいただければ幸いです。

4

6 に答える 6

63

次の構成を追加して、すべてのjarからの.schemaファイルの内容が一緒に追加されるようにすることができます。

<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>
于 2012-06-22T16:45:21.280 に答える
7

maven-shade-pluginの代わりにonejar-maven- pluginを使用してください。One-JARを使用すると、Javaアプリケーションをその依存関係のJarと一緒に単一の実行可能なJarファイルにパッケージ化できます。

于 2012-06-22T16:46:10.733 に答える
5

昨日、私もこの問題に遭遇しました。

解決策は、手動で連結して必要なファイルを準備し、アセンブリ プラグインを次のように構成することでした。

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

注: 1 つの jar アプローチを使用するのは十分ではありません。ファイルが混在していると確信が持てません。すべての依存関係をそのままエクスポートし続けるようにしてください...

于 2012-08-02T03:51:14.360 に答える
3
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>
于 2015-07-15T18:32:01.523 に答える
2

maven-assembly-pluginを試しましたか?

依存関係を持つ単一の jar が作成され、さらに、この jar を実行可能にすることができます。

mainClass を使用して、実行するクラスを指定します。

<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>
于 2012-06-26T15:28:53.180 に答える