web-dev-qa-db-ja.com

Gradle:Spring Bootの依存関係で「ファットジャー」を構築する

Gradleを使用して、非常に単純なSpring Bootアプリケーション(99%静的コンテンツ)をビルドし、Tomcatが埋め込まれたjarにパッケージ化しています。

私はそのjarを作成しようとしましたが、最初の結果は86kであり、いくつかのSpringブートクラスが欠落していたため、起動しませんでした。私が作成したこのjarにはアプリケーションの依存関係が含まれていないと結論付けました。完全に自己完結型のjarが必要だったので、さらに調査する必要があります。

これは、from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }セクションを「jar」に追加して、すべての依存関係を取り込むようにするアドバイスを見つけたときです。 (私は願います)。私は三項演算子の考え方に精通しており、それがここで何をしようとしているのかを見ることができます。

残念ながらそれはまだ機能していません!起動時に発生するエラーは次のとおりです。以下はbuild.gradleです。

Jarに完全に含まれているTomcatが埋め込まれたSpring Bootアプリケーションが必要です。私は非常に型破りなことをしていますか?
この時点で何か助けていただければ幸いです。

(About 80 lines of successful Spring Boot launch messages followed immediately by:
18:16:54.890 [main] WARN  o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:132) [SpringWsTest1.jar:na]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:474) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:117) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:689) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:321) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:969) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:958) [SpringWsTest1.jar:na]
    at ws.Application.main(Application.Java:11) [SpringWsTest1.jar:na]
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.Java:182) [SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.Java:155) [SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:129) [SpringWsTest1.jar:na]
    ... 7 common frames omitted
18:16:54.891 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@3b084709: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,application,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor,demoController,greetingController,org.springframework.boot.autoconfigure.AutoConfigurationPackages]; root of factory hierarchy
18:16:54.891 [main] ERROR o.s.boot.SpringApplication - Application startup failed
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:132) ~[SpringWsTest1.jar:na]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:474) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:117) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:689) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:321) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:969) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:958) [SpringWsTest1.jar:na]
    at ws.Application.main(Application.Java:11) [SpringWsTest1.jar:na]
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.Java:182) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.Java:155) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:129) ~[SpringWsTest1.jar:na]
    ... 7 common frames omitted
Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:132)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:474)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:117)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:689)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:321)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:969)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:958)
    at ws.Application.main(Application.Java:11)
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.Java:182)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.Java:155)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:129)
    ... 7 more

私が使用しているbuild.gradle:

println System.getProperty("Java.home")

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.7.RELEASE")
    }
}

apply plugin: 'Java'
apply plugin: 'Eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'


jar {
    manifest {
        attributes 'Main-Class': 'ws.Application'
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}


repositories {
    mavenCentral()
}


dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("junit:junit")
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8
11
user1445967

Gradle Spring Bootプラグインを使用するため、Spring-BootアプリケーションのFat-jarアーティファクトを構築するために、追加のGradle構成を自分で作成する必要はありません。それはあなたのためにそれをするためのタスクbootRepackageをすでに持っています。公式ユーザーガイド here および here で確認できます。

依存関係のコンテンツを解凍するために行ったすべてを削除し、このタスクを使用して、アプリケーションで単一のjarファイルを取得します。

ちなみに、より良いアーカイブサイズを提供できる可能性のある他のソリューションに興味があるかもしれません。Capsuleと呼ばれるそれらの1つについて読むことができます この記事では

21
Stanislav

Gradleの現在のバージョンでは、これをbuild.gradleファイルの先頭に追加します。

plugins {
    id "org.springframework.boot" version "2.0.0.RELEASE"
}

次にgradle buildだけです-これ以上何もする必要はありません。

最新バージョンを確認するには、 このプラグインのホームページ を参照してください。

1
Bohemian

私は@Stanislavの答えからこのリンクを見つけました: https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/gradle-plugin/reference/html/#packaging-executable-wars-展開可能 非常に役立ちます。

Jarをビルドするために、bootJarタスクを使用してjarをコンパイルしました。 (./gradlew bootJar)。私のプロジェクトにはbootRepackageタスクがなく、./gradlew buildを使用しても、必要なすべての依存関係を持つjarが生成されませんでした。多分それは私がdependsOnのようなものを使って設定しようとするべきものですが、今のところこれでうまくいきます。

私はマルチモジュールプロジェクトを持っているので、シングルモジュールプロジェクトの構成は異なる場合があります。また、依存関係でcom.graphql-Java:graphql-Java-spring-boot-starter-webmvc:1.0を使用しているほか、通常のspingブート依存関係のいくつかを使用しているため、セットアップが完全にバニラではありません。

0
retodaredevil