我使用Spring Boot构建了一个Restful API,并使用Maven将其部署为可执行的Jar文件 . 构建我的POM文件部分如下;
<build>
<finalName>project-name</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
我已经将Thymeleaf添加到我的项目中,因为我需要显示一个HTML文件 . 我没有在application.properties文件中添加任何其他配置选项 . 我在'/ src / main / resources / templates /'文件夹中创建了一个简单的HTML文件,我创建了一个控制器来显示HTML文件 .
如果我在IntelliJ中运行项目,我可以通过控制器查看HTML文件 . 如果我使用'mvn spring-boot:run'运行项目,我可以查看HTML文件 . 通过控制器 . 但是,当我运行'mvn package'后maven创建的可执行Jar文件中运行项目时,我无法查看HTML文件 .
当项目从可执行jar运行时,我在启动时看到以下输出;
18:18:38.234 [main] WARN o.s.b.a.t.AbstractTemplateResolverConfiguration - Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
我假设它无法找到/ templates /文件夹 . 为了调试问题我解压缩了可执行jar,我看到了以下文件夹结构;
- BOOT-INF
- classes
- templates
- mails
reset.html
password-reset.html
- lib
- META-INF
- org
我可以清楚地看到templates文件夹和HTML文件'password-reset.html'一起在jar中 .
我似乎也与项目的另一部分有类似的问题,它将文件的内容加载到字符串中 . 下面的代码再次从IntelliJ运行良好,并通过'mvn spring-boot:run'运行,但是从可执行jar运行时无法加载文件 .
Resource resource = new ClassPathResource("templates/mails/reset.html");
BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream()), 1024);
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
br.close();
body = stringBuilder.toString();
我猜测项目中的类路径(?)存在一些问题,当它从可执行jar运行时 . 我想知道是否有人知道为什么我遇到这个问题以及我可以做些什么来解决它?