WEB-INF没有被添加到SpringBoot jar

时间:2020-08-31 23:29:19

标签: spring spring-boot maven

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

REST部分工作正常,但是“ JSP部分”很烦人。端点被调用,一切正常,直到我返回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插件有关。感谢所有帮助,包括比我发现的更好的阅读资源。

更新 根据Per Qiu Zhou对的评论,我在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是否正确构建? 谢谢

3 个答案:

答案 0 :(得分:1)

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

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

这可以实现资源的热重载,但是现在对于此功能和其他开发功能的实际建议是添加spring开发工具依赖项。

<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

答案 1 :(得分:0)

尝试以下步骤:

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>

答案 2 :(得分:0)

khmarbaise在他的评论中提供了一个解决方案-将JAR打包为WAR。我等他发表评论或评论,但是已经有一段时间了,所以我将代表他回答。