0

私はこの問題を抱えています:

spring-boot を使用したプロジェクトがあります。Eclipse で完全に動作しますが、依存関係のある jar を生成する必要があるため、pom に maven-assembly-plugin 構成を追加します。

一部の春の依存関係には、META-INF に spring.schemas というファイルがあり、すべての spring.schemas を 1 つにマージする必要があります (spring-context、spring-beans など)。

maven-shade-pluggin と AppendingTransformer を使用してこのソリューションを試したところ、すべての spring.schemas が完全にマージされました...しかし、jar を実行すると次のように失敗するという問題があります。

java.lang.IllegalStateException: Unable to open nested entry 'lib/spring-boot-starter-batch-1.2.4.RELEASE.jar'. 
It has been compressed and nested jar files must be stored without compression.
Please check the mechanism used to create your executable jar file

したがって、shade プラグインは jar を圧縮しますが、spring-boot はそれを好まず、shade で圧縮をオフにする方法はありません。シェードによって生成されたシェード spring.schemas を手動でコピーし、それを maven-assembly-pluggin で生成された圧縮されていない jar に依存関係とともに配置します。できます。

次に、生成された spring.schemas をリソース フォルダーに含めようとしましたが、常に spring-context の spring.schemas によってオーバーライドされます。

アセンブリで記述子 XML を使用して依存関係 jar から spring.schemas を除外するために、この他のソリューションも試しましたが、機能しません。

<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>distribution</id>
    <formats>
        <format>jar</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>org.springframework:spring-context</include>
            </includes>
            <unpack>true</unpack>
            <unpackOptions>
                <excludes>
                    <exclude>**/spring.schemas</exclude>
                </excludes>
            </unpackOptions>
        </dependencySet>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <excludes>
                <exclude>org.springframework:spring-context</exclude>
            </excludes>
            <unpack>true</unpack>
        </dependencySet> 
    </dependencySets>
</assembly>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>org.springframework.batch.core.launch.support.CommandLineJobRunner</mainClass>
                        </manifest>
                        <compress>false</compress>
                    </archive>
                    <descriptors>
                        <descriptor>src/main/assembly/distribution.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

これは私の依存関係です:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
        </dependency>
        <!-- MySql 5.5 Connector -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>
    </dependencies>

何か案は?前もって感謝します

4

2 に答える 2

0

使用できますmaven-assembly-plugin

にプラグインを追加しますpom.xml

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.1</version>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <descriptors>
      <descriptor>fat-jar.xml</descriptor>
    </descriptors>
  </configuration>
</plugin>

fat-jar.xml次の記述子を追加しますpom.xml

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
  <id>fat</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <containerDescriptorHandlers>
    <containerDescriptorHandler>
      <handlerName>metaInf-spring</handlerName>
    </containerDescriptorHandler>
  </containerDescriptorHandlers>
</assembly>

metaInf-springハンドラーに注目してください。spring名前が単語で始まる META-INF 重複ファイルをマージします。

リファレンス ドキュメント: https://maven.apache.org/plugins/maven-assembly-plugin/examples/single/using-container-descriptor-handlers.html

于 2021-03-13T18:54:37.543 に答える
-1

maven-assembly-plugin と maven-shade-pluggin を使用する代わりに、Spring Boot 独自の spring-boot-maven-plugin を使用して、実行可能な「fat」JAR を作成しようとします。このリファレンス ドキュメント ページのセクション「73.2 Maven を使用して実行可能な JAR を作成する」を参照してください。

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
</plugins>

または、spring-boot-starter-parent POM を使用しない場合:

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.2.5.RELEASE</version>
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

于 2015-07-09T14:19:04.917 に答える