web-dev-qa-db-ja.com

Spring BootMavenプラグイン-BOOT-INFディレクトリがありません

Spring-boot-maven-pluginのバージョン1.3.8.RELEASEとバージョン1.4.0.RELEASEの間-生成されたパッケージ構造に変更がありました(uber jarファイルを抽出した場合)1.3.8.RELEASE com、 lib、META-INF、およびorgディレクトリ1.4.0.RELEASEには、BOOT-INF、META-INF、およびorgディレクトリがあります。基本的に1.4.0.RELEASE以降、すべてのクラスとライブラリはBOOT-INFディレクトリにあります。このため、AmazonLambdaでSpringBootプロジェクトを実行しようとすると、新しいSpring Boot Uberjar構造を読み取れないためにjarが見つからないというメッセージが表示されます。

私の質問は、Spring Boot Mavenプラグインの新しいバージョンで、バージョン1.3.9.RELEASEと同じ構造のuberjarを生成することは可能ですか?

Maven-shade-pluginを試しましたが、他の問題が発生します

どんな助けでも大歓迎です

ありがとうダミアン

7
Damien

解決策は、pom.xmlファイルにプラグインのMODULEレイアウトを追加することでした。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <layout>MODULE</layout>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>
14
Damien

私の場合、Spring Boot 2.Xを使用しており、spring-boot-maven-pluginの後にmaven-dependency-pluginを宣言しました(これはDockerで解凍して展開されたアプリを作成するために使用しました)。これは解凍前でなければなりません。感覚的には、Spring BootMavenプラグインが実行される前に解凍されていました。次回はプラグインチェーンの最初のものを宣言しますが、これで1時間以上失われました。それが誰かを助けることを願っています。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>${spring.boot.mainClass}</mainClass>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>${project.groupId}</groupId>
                                <artifactId>${project.artifactId}</artifactId>
                                <version>${project.version}</version>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
4
lauksas

上記の答えは

<layout>MODULE</layout>

これは、layout要素がSpring Boot2.xで非推奨になっているためです。 Spring Boot 2.0.xを使用していますが、githubで次の役立つコメントを見つけました。

モジュールレイアウトのサポートは、1.5で非推奨となったSpring Boot2.0で削除されました。残念ながら、Mavenプラグインのドキュメントの更新が見落とされたため、この問題を使用して問題を解決できます。代わりに カスタムLayoutFactory を使用する必要があります。

しかし、LayoutFactoryを実装したくなかったので、実際に再パッケージ化して、名前が指定された分類子を持つ追加のjarを作成する以下の2番目のソリューションを試しました。

これは、Spring Boot1.4で実行可能jarのレイアウトが変更されたためです。アプリケーションクラスは現在、BOOT-INF/classesにパッケージ化されています。クライアントモジュールは、Webモジュールの再パッケージ化されたファットjarに依存します。新しいレイアウトのため、クライアントモジュールはWebモジュールのクラスをロードできなくなりました。 Webモジュールを依存関係として使用する場合は、ファットjarに分類子を適用するようにBootの再パッケージ化を構成する必要があります。例えば:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <classifier>exec</classifier>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

そうすることで、他のモジュールが、モジュールの依存関係を埋め込まず、jarのルートにクラスを持つ元のjarに依存できるようになります。

1つのオリジナルの瓶は私が好きだったのと同じ構造を持っています

com.my-package.foo.bar
META-INF

2番目の分類子はBOOT-INF /などの新しい構造になっています。

2
unawaz

私にとって、解決策はもう少し陰湿でした....私はpluginManagementの下にネストされたspring-boot-maven-pluginを持っていました(以下を参照)。ドー!

厄介なのは、mvn spring-boot:runを実行すると、Spring Bootが正常に起動し、アプリが実行されることです。 PCFに(スプリングブートJARとして)デプロイしようとするまで、バイナリのフォーマットに問題があるというエラーが発生しました。

<build>

  <!-- 
    DON'T DO THIS!! 
  -->
  <pluginManagement>

    <plugins>             
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>${spring.boot.version}</version>            
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                    <goal>build-info</goal>
                </goals>
            </execution>
        </executions>                        
      </plugin>                                     
    </plugins>

  </pluginManagement>

  <!-- 
    DO THIS INSTEAD!! 
  -->      
<plugins>

    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>${spring.boot.version}</version>            
      <executions>
          <execution>
              <goals>
                  <goal>repackage</goal>
                  <goal>build-info</goal>
              </goals>
          </execution>
      </executions>                        
    </plugin>                         

  </plugins>

</build>

プラグイン管理タグをPOMから削除すると、。/ BOOT-INF構造が取得されます。 pluginManagementは通常、親pom構造用であり、そのプラグインの構成を他のモジュールで使用する必要があることに注意してください。

0
Eric Manley