Почему intellij прекрасно запускает SpringBootApplication, а упакованный jar не находит ресурсы? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть простая форма POST, использующая Springboot / gradle / java. Что я не могу понять, так это то, почему, когда я щелкаю правой кнопкой мыши и нажимаю кнопку run из intellij, приложение находит страницу индекса, никаких проблем. Но когда я упаковываю в банку, он не найдет страницу индекса. я могу набрать его вручную, но затем я получаю странные проблемы, когда пишу сообщение, поэтому сначала пытаюсь исправить первую проблему ...

это мое главное:

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication

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

Мой контроллер

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.PostMapping

@Controller
class RewardsDataController {
    @GetMapping("/")
    String index(Model model){
        return "index"
    }

Структура Dir

src
-main
-resources
-application.properties
--META-INF
---MANIFEST.MF
--templates
---index.html

Я попытался переместить каталоги веб-ресурсов (/, resources /, resources / templates / et c) безрезультатно из-за этого сообщения об ошибке, но я спрашиваю, почему у меня должен быть преобразователь шаблона, когда у меня есть все настройки по умолчанию в соответствии с пружинными уроками:

08:28:15.370 [reactor-http-nio-2] DEBUG org.thymeleaf.spring5.view.reactive.ThymeleafReactiveView - [f3e264cf] View name 'index', model {thymeleafWebSession=MonoCacheTime}
08:28:15.400 [boundedElastic-1] ERROR org.thymeleaf.TemplateEngine - [THYMELEAF][boundedElastic-1] Exception processing template "index": Error resolving template [index], template might not exist or might not be accessible by any of the configured Template Resolvers
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [index], template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869)
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
    at org.thymeleaf.spring5.SpringWebFluxTemplateEngine.lambda$createFullStream$0(SpringWebFluxTemplateEngine.java:212)
    at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
    at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:55)
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
    at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1637)
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:147)
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.ignoreDone(MonoIgnoreThen.java:190)
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreInner.onComplete(MonoIgnoreThen.java:240)
    at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
    at reactor.core.publisher.Operators$MonoSubscriber.onComplete(Operators.java:1679)
    at reactor.core.publisher.MonoIgnoreThen$ThenAcceptInner.onComplete(MonoIgnoreThen.java:314)
    at reactor.core.publisher.MonoWhen$WhenCoordinator.signal(MonoWhen.java:208)
    at reactor.core.publisher.MonoWhen$WhenInner.onComplete(MonoWhen.java:285)
    at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
    at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1638)
    at reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.signalCached(MonoCacheTime.java:320)
    at reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.onNext(MonoCacheTime.java:337)
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
    at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67)
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
    at reactor.core.publisher.FluxSubscribeOnCallable$CallableSubscribeOnSubscription.run(FluxSubscribeOnCallable.java:249)
    at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
    at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
08:28:15.401 [boundedElastic-1] ERROR org.thymeleaf.spring5.SpringWebFluxTemplateEngine - [THYMELEAF][boundedElastic-1] Exception processing template "index": Error resolving template [index], template might not exist or might not be accessible by any of the configured Template Resolvers
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [index], template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869)
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
    at org.thymeleaf.spring5.SpringWebFluxTemplateEngine.lambda$createFullStream$0(SpringWebFluxTemplateEngine.java:212)
    at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
    at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:55)
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
    at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1637)
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:147)
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.ignoreDone(MonoIgnoreThen.java:190)
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreInner.onComplete(MonoIgnoreThen.java:240)
    at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
    at reactor.core.publisher.Operators$MonoSubscriber.onComplete(Operators.java:1679)
    at reactor.core.publisher.MonoIgnoreThen$ThenAcceptInner.onComplete(MonoIgnoreThen.java:314)
    at reactor.core.publisher.MonoWhen$WhenCoordinator.signal(MonoWhen.java:208)
    at reactor.core.publisher.MonoWhen$WhenInner.onComplete(MonoWhen.java:285)
    at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
    at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1638)
    at reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.signalCached(MonoCacheTime.java:320)
    at reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.onNext(MonoCacheTime.java:337)
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
    at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67)
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
    at reactor.core.publisher.FluxSubscribeOnCallable$CallableSubscribeOnSubscription.run(FluxSubscribeOnCallable.java:249)
    at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
    at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
08:28:15.443 [boundedElastic-1] DEBUG org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler - [f3e264cf] Resolved [TemplateInputException: Error resolving template [index], template might not exist or might not be accessible by any of the configured Template Resolvers] for HTTP GET /
08:28:15.443 [boundedElastic-1] ERROR org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler - [f3e264cf]  500 Server Error for HTTP GET "/"
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [index], template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ? Handler co.za.ebucks.RewardsDataController#index(Model) [DispatcherHandler]
    |_ checkpoint ? HTTP GET "/" [ExceptionHandlingWebHandler]
Stack trace:
        at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869)
        at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607)
        at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
        at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
        at org.thymeleaf.spring5.SpringWebFluxTemplateEngine.lambda$createFullStream$0(SpringWebFluxTemplateEngine.java:212)
        at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
        at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:55)
        at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
        at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1637)
        at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:147)
        at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.ignoreDone(MonoIgnoreThen.java:190)
        at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreInner.onComplete(MonoIgnoreThen.java:240)
        at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
        at reactor.core.publisher.Operators$MonoSubscriber.onComplete(Operators.java:1679)
        at reactor.core.publisher.MonoIgnoreThen$ThenAcceptInner.onComplete(MonoIgnoreThen.java:314)
        at reactor.core.publisher.MonoWhen$WhenCoordinator.signal(MonoWhen.java:208)
        at reactor.core.publisher.MonoWhen$WhenInner.onComplete(MonoWhen.java:285)
        at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292)
        at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1638)
        at reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.signalCached(MonoCacheTime.java:320)
        at reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.onNext(MonoCacheTime.java:337)
        at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
        at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67)
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
        at reactor.core.publisher.FluxSubscribeOnCallable$CallableSubscribeOnSubscription.run(FluxSubscribeOnCallable.java:249)
        at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
        at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

о и мой файл Gradle:

plugins {
    id 'org.springframework.boot' version '2.2.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'war'
    id 'groovy'
//    id 'java'
}
war {
    enabled = true
}
jar {
    manifest {
        attributes 'Main-Class': 'co.za.ebucks.HandlingRewardsFormSubmission'
    }
}
group = 'co.za.ebucks'
version = '1.0.0'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}
ext {
    seleniumVersion = '3.141.59'
}
configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}
test {
    useTestNG()
}

dependencies {
//    compile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
    implementation 'org.springframework.boot:spring-boot-starter-tomcat'
    compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '9.0.31'

    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.session:spring-session-core'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

    implementation group: 'org.codehaus.groovy', name: 'groovy-all', version: '3.0.0'
    implementation group: 'com.google.inject', name: 'guice', version: '4.2.2'
    implementation group: 'com.google.guava', name: 'guava', version: '28.1-jre'
    implementation group: 'cglib', name: 'cglib', version: '3.3.0'
    implementation group: 'org.postgresql', name: 'postgresql', version: '42.2.10'

    testImplementation group: 'org.testng', name: 'testng', version: '7.1.0'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    testImplementation 'io.projectreactor:reactor-test'
    testImplementation "org.seleniumhq.selenium:selenium-support:${seleniumVersion}"
    testImplementation group: 'io.appium', name: 'java-client', version: '7.3.0'
    testImplementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: "${seleniumVersion}"
    testImplementation group: 'org.seleniumhq.selenium', name: 'selenium-server', version: "${seleniumVersion}"
    testImplementation group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver', version: "${seleniumVersion}"
    testImplementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.0'
    testImplementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.13.0'


    developmentOnly 'org.springframework.boot:spring-boot-devtools'


}

1 Ответ

0 голосов
/ 19 февраля 2020

Я чувствую себя слишком глупо прямо сейчас. Извините, я впервые использую Spring и впервые за 15 лет настраиваю веб-сайт.

Проблема заключалась не в вышеуказанном, а в способе настройки ресурсов веб-фасетов. каталог `src / main / resources / 'должен был быть root path' / 'каталога веб-ресурса. Не самое очевидное для меня: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...