Spring Boot работает только в IDE

Я разрабатываю приложение Spring Boot с использованием IntelliJ, и я пытаюсь создать исполняемый JAR.

В среде IDE все работает нормально, но когда я создаю исполняемый файл JAR и запускаю его через CMD, я получаю всевозможные ошибки.

Мой Main выглядит так:

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

А потом получаю вот что:

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:155)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1234)
    at my.app.Main.main(Main.java:9)
Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.java:204)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:178)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:152)
    ... 8 common frames omitted

Не могу найти, почему так и как это исправить. Любая помощь приветствуется.

Мой файл сборки Gradle:

plugins {
    id 'java'
}

group 'my.app'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
    flatDir {
        dirs 'lib'
    }
}

dependencies {
    compile 'com.graphql-java:graphql-java:9.0'
    compile 'com.graphql-java:graphql-java-tools:5.1.0'
    compile 'com.graphql-java:graphql-spring-boot-starter:4.2.0'
    compile 'org.springframework.data:spring-data-couchbase:3.0.8.RELEASE'
    compile 'org.hibernate:hibernate-core:5.3.2.Final'
    compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.9.2'
    compile 'com.beust:klaxon:3.0.1'
    compile fileTree(dir: 'lib', includes: ['*.jar'])
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

Каталог lib включает следующие файлы:

classmate-1.3.4.jar
hibernate-validator-6.0.9.Final.jar
jackson-annotations-2.9.0.jar
jackson-core-2.9.5.jar
jackson-databind-2.9.5.jar
jackson-datatype-jdk8-2.9.5.jar
jackson-datatype-jsr310-2.9.5.jar
jackson-module-parameter-names-2.9.5.jar
javax.annotation-api-1.3.2.jar
jboss-logging-3.3.2.Final.jar
jul-to-slf4j-1.7.25.jar
log4j-api-2.10.0.jar
log4j-to-slf4j-2.10.0.jar
logback-classic-1.2.3.jar
logback-core-1.2.3.jar
reactive-streams-1.0.2.jar
slf4j-api-1.7.25.jar
snakeyaml-1.19.jar
spring-aop-5.0.5.RELEASE.jar
spring-aop-5.0.6.RELEASE.jar
spring-aspects-5.0.5.RELEASE.jar
spring-beans-5.0.5.RELEASE.jar
spring-beans-5.0.6.RELEASE.jar
spring-boot-2.0.2.RELEASE.jar
spring-boot-autoconfigure-2.0.2.RELEASE.jar
spring-boot-starter-2.0.2.RELEASE.jar
spring-boot-starter-json-2.0.2.RELEASE.jar
spring-boot-starter-logging-2.0.2.RELEASE.jar
spring-boot-starter-tomcat-2.0.2.RELEASE.jar
spring-boot-starter-web-2.0.2.RELEASE.jar
spring-context-5.0.5.RELEASE.jar
spring-context-5.0.6.RELEASE.jar
spring-context-indexer-5.0.5.RELEASE.jar
spring-context-support-5.0.5.RELEASE.jar
spring-core-5.0.5.RELEASE.jar
spring-core-5.0.6.RELEASE.jar
spring-expression-5.0.5.RELEASE.jar
spring-expression-5.0.6.RELEASE.jar
spring-instrument-5.0.5.RELEASE.jar
spring-jcl-5.0.5.RELEASE.jar
spring-jcl-5.0.6.RELEASE.jar
spring-jdbc-5.0.5.RELEASE.jar
spring-jms-5.0.5.RELEASE.jar
spring-messaging-5.0.5.RELEASE.jar
spring-orm-5.0.5.RELEASE.jar
spring-oxm-5.0.5.RELEASE.jar
spring-test-5.0.5.RELEASE.jar
spring-tx-5.0.5.RELEASE.jar
spring-web-5.0.5.RELEASE.jar
spring-web-5.0.6.RELEASE.jar
spring-webflux-5.0.5.RELEASE.jar
spring-webmvc-5.0.5.RELEASE.jar
spring-webmvc-5.0.6.RELEASE.jar
spring-websocket-5.0.5.RELEASE.jar
sqlite-jdbc-3.21.0.jar
Hibernate.jar
tomcat-embed-core-8.5.31.jar
tomcat-embed-el-8.5.31.jar
tomcat-embed-websocket-8.5.31.jar
validation-api-2.0.1.Final.jar

Тот факт, что вам нужно было добавить TomcatServletWebServerFactory, уже указывает на то, что что-то не так. Опубликуйте свой pom.xml или build.gradle и покажите зависимости, а также опубликуйте полную трассировку стека, а не только сообщение.

M. Deinum 11.07.2018 07:27

Самая важная информация - это причина исключения, которое будет дальше по трассировке стека. Пожалуйста, опубликуйте это.

Andy Brown 11.07.2018 11:37

@ M.Deinum Я отредактировал вопрос в соответствии с вашим комментарием

Neo 11.07.2018 12:41

В вашем файле сборки нет ничего, связанного с загрузкой ... Итак, как Spring Boot знает, как создать исполняемый файл jar и включить правильные зависимости? Их нет в вашем списке зависимостей.

M. Deinum 11.07.2018 14:28

@ M.Deinum В моей папке lib есть файлы Spring Boot JAR. Параметры артефакта IntelliJ предназначены для извлечения всех файлов JAR из папки lib в окончательный исполняемый файл JAR.

Neo 11.07.2018 14:56

Не делай этого. Не изобретайте свой собственный механизм. Для создания действительного исполняемого файла jar вам понадобится плагин весенней загрузки. Не пытайтесь перехитрить фреймворк, работайте с ним.

M. Deinum 11.07.2018 15:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
327
1

Ответы 1

Попробуйте использовать это в своем pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

или / а также этот:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

и попробуйте удалить:

 @Bean
public ServletWebServerFactory servletWebServerFactory() {
    return new TomcatServletWebServerFactory();
}

из основных

У меня есть оба файла в виде jar-файлов

Neo 10.07.2018 23:28

странно ... однако обычно я не вставляю этот код в основной файл, когда создаю файл jar: @Bean public ServletWebServerFactory servletWebServerFactory () {return new TomcatServletWebServerFactory (); }

falberto89 10.07.2018 23:41

Другие вопросы по теме