Я разрабатываю приложение 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
Самая важная информация - это причина исключения, которое будет дальше по трассировке стека. Пожалуйста, опубликуйте это.
@ M.Deinum Я отредактировал вопрос в соответствии с вашим комментарием
В вашем файле сборки нет ничего, связанного с загрузкой ... Итак, как Spring Boot знает, как создать исполняемый файл jar и включить правильные зависимости? Их нет в вашем списке зависимостей.
@ M.Deinum В моей папке lib есть файлы Spring Boot JAR. Параметры артефакта IntelliJ предназначены для извлечения всех файлов JAR из папки lib в окончательный исполняемый файл JAR.
Не делай этого. Не изобретайте свой собственный механизм. Для создания действительного исполняемого файла jar вам понадобится плагин весенней загрузки. Не пытайтесь перехитрить фреймворк, работайте с ним.




Попробуйте использовать это в своем 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-файлов
странно ... однако обычно я не вставляю этот код в основной файл, когда создаю файл jar: @Bean public ServletWebServerFactory servletWebServerFactory () {return new TomcatServletWebServerFactory (); }
Тот факт, что вам нужно было добавить
TomcatServletWebServerFactory, уже указывает на то, что что-то не так. Опубликуйте свойpom.xmlилиbuild.gradleи покажите зависимости, а также опубликуйте полную трассировку стека, а не только сообщение.