WEB-INF没有被添加到SpringBoot jar中



我正在使用SpringBoot组装一个Web应用程序。

REST部分工作良好;JSP部分";是borked。端点被调用,一切都很好,直到我返回JSP页面的基本名称,例如return "info";。该方法返回一个String

当我调用一个端点时,我会得到以下消息:

[…][dispatcherServlet]:路径为[]的上下文中Servlet[dispatcherServlet的Servlet.service((引发异常[无法解析名为"dispatcherServlet"的Servlet中名为"info"的视图],原因为根本原因javax.servlet.ServletException:无法解析名为"dispatcherServlet"的servlet中名为"info"的视图

我跟随";图案";为SpringBoot添加JSP支持(我说"模式"是因为我找到的十几个源似乎都引用了同一个例子(。

我正在用Maven构建一个JAR,查看那个JAR,我找不到JSP文件,甚至找不到任何WEB-INF目录结构,所以我认为问题出在Maven和SpringBoot的插件之间。

以下是POM的部分,删除了大部分依赖项:

<packaging>jar</packaging>
...
<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>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
...
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

POM主要是根据原型构建的。

我对调试Maven构建相当无知,假设这是一个Maven问题,然而,我认为这可能与springboot插件有关。我感谢所有的帮助,包括比我找到的更好的阅读资源。

更新根据邱周对的评论,我在POM中添加了以下内容:

<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>

并将JSP目录移动到src/main/resources/WEB-INF.JSP。JAR文件现在包含以下内容:

BOOT-INF/classes/WEB-INF/jsp/info.jsp

这似乎是正确的。我不再得到dispatcherServlet消息(见上文(,然而,当我卷曲网站时,我得到的是:

% curl localhost:8099/info
{"timestamp":"2020-09-01T17:22:28.413+00:00","status":404,"error":"Not Found","message":"","path":"/info"}

控制器代码如下:

@Controller
public class SimpleController {
@GetMapping("/info")
public String info() {
return "info";
}
}

我仍然感到困惑——JAR构建正确吗??感谢

您没有指定要使用的插件的版本。根据版本的不同,您可能需要配置插件,通过在插件配置中添加以下内容,将资源目录添加到应用程序类路径

<configuration>
<addResources>true</addResources>
</configuration>

这允许对资源进行热重新加载,但现在实际建议使用此功能和其他开发功能的是添加spring-dev工具依赖项。

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.3.3.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>

您可以通过阅读插件文档了解更多信息。https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/html/#run

khmarbaise在他的评论中提供了一个解决方案——将JAR打包为WAR。我等着他发表回复,但已经过了很长一段时间,所以我将代表他回答。

尝试以下步骤:

1、 包括jstl依赖项:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>

2、 将jsp文件放在src/main/webapp/WEB-INF/jsp目录中。(如果不存在,则手动创建(

3、 在application.propertiesapplication.yml:中设置视图前缀

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

4、 指定jsp文件在输出中的位置,在pom.xml中放入以下配置(基于您的配置(:

<packaging>jar</packaging>
...
<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>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
...
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>

<resources>
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>

最新更新