在 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 模板文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

spring boot jar包 linux 部署

在 Azure 应用服务上部署 Spring Boot jar

spring boot jar 部署linux服务器

Spring Boot Dockerfile 最佳实践

减少 Spring Boot 可执行 jar Angular App 的磁盘空间

使用 bitbucket 管道部署到 heroku 的 Spring Boot gradle 项目在 build/libs/app-SNAPSHOT-plain.jar 中给出错误 no main m