在 Spring Boot App 中运行 jar 文件但在本地运行良好时解析 Thymeleaf 模板文件时出错
Posted
技术标签:
【中文标题】在 Spring Boot App 中运行 jar 文件但在本地运行良好时解析 Thymeleaf 模板文件时出错【英文标题】:Error Resolving Thymeleaf Templates Files when run a jar file in Spring Boot App but runs fine locally 【发布时间】:2021-09-25 21:05:39 【问题描述】:我使用thymeleaf
开发了一个全栈Spring Boot
应用程序,它在本地运行良好,没有任何问题。
现在我正在尝试将其部署到 AWS cloud
但它给了我错误 [内部服务器错误]
我检查了关系数据库并尝试从应用程序连接,它工作正常。
它似乎唯一的问题是它在创建 jar 文件时无法解析模板并且没有呈现模板。
当我启动应用程序时,它会将 HttpRequest 发送到“/”,它会像这样呈现主页模板,但它失败了:
// displays home page
@GetMapping("/")
public String homePage(Model model)
model.addAttribute("title", "Home Page - Information Keeper");
return "home"; // return home.html page from templates folder
resources/template/home [等等]下的所有模板我都有
我的properties file
是
server.port = 5000
spring.thymeleaf.enabled=true
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.datasource.url=jdbc:postgresql://RDS_Endpoint:5432/myinfokeeper
spring.datasource.username=username
spring.datasource.password=password
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL81Dialect
spring.jpa.show-sql = true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update
而我的 pom.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-
4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>info.keeper</groupId>
<artifactId>info_keeper</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Info_Keeper</name>
<description>Information Keeper using Spring boot, JPA and Thymeleaf with Spring Security.</description>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- use postgres sql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.5.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>$project.parent.version</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
<goal>repackage</goal>
</configuration>
</plugin>
</plugins>
<finalName>InfoKeeperWebApp</finalName>
</build>
我应该怎么做?为什么它无法用 jar 解析这些模板,但在 localhost 上却能完美运行?
我在 *** 上查看并尝试了许多解决方案,其中许多似乎在 localhost 上有问题,但我的在 localhost 上运行良好,但 在 jar 上没有导致错误在 AWS beanstalk 中也是如此。 我被困了好几天:)
任何帮助将不胜感激。
我的 home.html 看起来像这样:
<!doctype html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
th:replace="base::layout(~::div)">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>My Information Keeper || Home Page</title>
</head>
<body>
<div class="home d-flex justify-content-center align-items-center">
<section>
<h3>Keep Your Information Secure on Web</h3>
<h4>Recall Anywhere Anytime</h4>
<a class="btn btn-warning btn-lg text-white" href="/register">Get Started</a>
</section>
<script>
let items = document.getElementsByClassName("item");
<!-- alert(items.length); -->
<!-- remove active class first -->
for(i in items)
<!-- alert(items[i].className)-->
if(items[i].className === 'item active')
items[i].classList.remove('active');
const homeLink = document.getElementById("home-link");
homeLink.classList.add("active");
</script>
</div>
</body>
</html>
【问题讨论】:
我后来添加了 spring.thymeleaf.prefix=classpath:/templates/ 这一行,我得到了同样的错误。 我不知道究竟是什么,因为它在本地主机上工作,而不是在我部署时。当我将标题模板包含在其他页面中时,前导 / 导致了标题模板中的问题。我仍然不得不说它在本地主机上工作。 你解决了吗? @overheated 是的,它已经解决了。没有重大问题,但一个“/”导致渲染我的视图出现问题,即使应用程序在本地计算机上运行良好。如果您遇到与我相同的问题,请尝试从代码中删除“/”多余的斜杠,它应该可以工作。 我发现有一个类似的问题,但它是在多个点上。我有所有的 web 文件 webapp 中的文件而不是资源,然后,在移动 /resources/templates 中的 html 和 /resources/static/(css)* 中的 css,js... 之后,我不得不添加这些行application.propperties spring.mvc.static-path-pattern=/static/** 并添加 spring.thymeleaf.prefix=classpath:/templates/ 然后我还必须检查 spring security 允许什么,不允许什么。也许这对其他人有帮助。 【参考方案1】:您可以尝试使用这些配置,并确保您的 HTML 文件包含在“templates”文件夹中,而不是问题中的“template”文件夹中
spring.thymeleaf.check-template=true
spring.thymeleaf.check-template-location=true
【讨论】:
我的所有 html 文件都在模板目录下,在属性文件中添加代码没有结果。我认为还有其他需要为 jar 文件配置的东西,当通过没有 jar 运行时,它可以在 localhost 中完美运行。 我也包含了html文件,如果有错误请告诉我。以上是关于在 Spring Boot App 中运行 jar 文件但在本地运行良好时解析 Thymeleaf 模板文件时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure 应用服务上部署 Spring Boot jar
减少 Spring Boot 可执行 jar Angular App 的磁盘空间
使用 bitbucket 管道部署到 heroku 的 Spring Boot gradle 项目在 build/libs/app-SNAPSHOT-plain.jar 中给出错误 no main m