Intellij 运行配置 Spring Boot 与 Maven 问题

Posted

技术标签:

【中文标题】Intellij 运行配置 Spring Boot 与 Maven 问题【英文标题】:Intellij Run Configuration Spring Boot vs Maven Issues 【发布时间】:2017-12-01 08:26:47 【问题描述】:

我正在尝试使用 Intellij IDEA 运行我的 Spring Boot 项目。 这个项目是 Spring MVC 类型的,意味着它在路径 main/webapp/WEB-INF/jsp 中有 JSP 文件。

我的application.properties 有这些设置:

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

当我在 Intellij 中将项目作为“Spring Boot 运行配置”运行时,服务器无法识别 JSP 文件的路径。这是我收到的消息:

z

如果我使用命令spring-boot:run 使用“Maven 运行配置”运行项目,一切正常。

我不知道为什么会这样。项目的代码和设置与每个运行配置相同。

你可以试试这个项目(不是我的项目)来理解我的意思https://github.com/mariuszs/spring-boot-web-jsp-example。

我的项目也是如此。 我应该注意,当项目使用 Spring Boot Run Configuration 运行时,我确实在控制台中看到控制器映射正确。

2017-06-28 08:29:13.906  INFO 10308 --- [           main] o.s.w.s.h.SimpleUrlHandlerMapping        : Mapped URL path [/login] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]

2017-06-28 08:29:13.835  INFO 10308 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "[/login],methods=[GET]" onto public java.lang.String com.intuit.mintbills.controllers.generic.LoginController.getLoginPage()

【问题讨论】:

为什么webappmain 包中? 为什么不应该在那里? github.com/mariuszs/spring-boot-web-jsp-example/tree/master/src/…github.com/spring-projects/spring-boot/tree/master/…。第二个例子是Spring Boot正式例子 我认为您可能需要在 IntelliJ 中将 webapp 文件夹标记为“资源”。 【参考方案1】:

我通过在运行配置中将工作目录设置为 $MODULE_DIR$ 解决了这个问题。

【讨论】:

是的!问题是 IntelliJ 不会自动将 JSP 文件等包含到类路径中 或 $MODULE_DIR$ 也适用于我,如果不是 $MODULE_DIR$ @John - 你能改正错字吗?我看不出变量名有什么不同。 @Muzammil 对不起我的错。我的意思是说 $ContentRoot$。【参考方案2】:

这是 IntelliJ 和 Spring boot 的问题。您应该检查以下事项:

网络方面

确保您已启用 Web 方面。示例项目没有web.xml 文件,因此,IntelliJ 不会选择src/main/webapp。您可以将虚拟web.xml 文件添加到src/main/webapp/WEB-INF 并重新导入项目,或者您可以手动添加web facet 并正确配置它。如果 web facet 配置正确,您应该会在 webapp 文件夹中看到一个蓝色圆圈。

一个虚拟web.xml文件的例子:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
</web-app>

这是src/main/webapp文件夹中的“蓝点”:

提供的依赖项

IntelliJ 的另一个问题是提供的依赖项没有正确获取。您通常可以通过打开 Project Structure...、打开 Modules 并选择 Dependencies 选项卡来解决此问题。在这里,您可以覆盖依赖项的范围,因此在您的情况下,我建议将 tomcat-embed-jasperecj 都配置为 Compile

我最近没有这样做,但是每次您更改 pom.xml 时,这可能会被覆盖。在这种情况下,我建议您覆盖 &lt;scope&gt; pom.xml

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>

如果您计划在 Web 容器(例如外部 Tomcat)上部署应用程序,您可能希望使用配置文件,否则这可能会导致冲突,因为这些依赖项是由 Web 容器提供的。

JSP 限制

还建议您将打包更改为 WAR,因为有一些 known limitations 通过将 JSP 与 JAR 文件一起使用。引用文档:

在运行使用嵌入式 servlet 容器(并打包为可执行存档)的 Spring Boot 应用程序时,JSP 支持存在一些限制。

对于 Tomcat,如果您使用 war 打包,它应该可以工作,即可执行的 war 可以工作,并且还可以部署到标准容器(不限于,但包括 Tomcat)。由于 Tomcat 中的硬编码文件模式,可执行 jar 将无法工作。 对于 Jetty,如果您使用 war 打包,它应该可以工作,即可执行的 war 可以工作,并且还可以部署到任何标准容器。 Undertow 不支持 JSP。 创建自定义 error.jsp 页面不会覆盖错误处理的默认视图,应改为使用自定义错误页面。

【讨论】:

这在我在问题中提到的示例项目中有效,但由于某种原因在我自己的项目中它不起作用......我不知道为什么。在我的项目中,我试图在特定模块而不是整个项目中运行配置。 您说要使用蓝点图标制作 webapp,但从 intellij 文档来看,这意味着该文件夹是一个包,但它是吗?当我配置 Web Facets 时,我会看到一个带有地球仪的文件夹图标。我有 2015 版的 Intellij。 @OmriYaHoo 可能是由于版本不同。一个包确实也有一个点,但我注意到这个点比 webapp 文件夹上的点小,包现在有一个黑点,所以我猜这是 IntelliJ 2015 和 IntelliJ 2017 之间的变化。 已尝试使用 2017 版。我们现在在 webapp 文件夹上有了蓝点,一切似乎都已正确配置。遗憾的是,在将项目作为 Spring Boot 运行配置运行时,我仍然无法映射 JSP。 Maven 运行配置运行良好,不知道出了什么问题。 好吧,那么您遇到的问题与您提到的示例代码不同。无能为力,因为我无法复制它。创建一个minimal reproducible example。

以上是关于Intellij 运行配置 Spring Boot 与 Maven 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Groovy、IntelliJ 和 Gradle 在项目中“重新运行 Spring Boot 配置注释处理器”

使用 Spring Boot 和多模块的 Maven 配置 - 在 Intellij 中运行应用程序

从 IntelliJ Idea 运行/调试 Spring Boot 应用程序

Spring Boot 使用IntelliJ IDEA创建一个web开发实例

在运行时使用 intellij 在 Spring boot application.yml 文件中注入占位符值

intellij idea 怎么找不到spring boot