如何在IntelliJ IDEA中使用外部Tomcat运行Spring Boot Maven项目
在IntelliJ IDEA中用外部Tomcat 8.0.50运行Maven+Spring Boot项目的方案
当然可行!Spring Boot项目完全可以打包成war包部署到外部Tomcat,而且IntelliJ IDEA也有类似Eclipse“Run on server”的便捷流程,下面我一步步给你讲清楚怎么做:
一、先确认项目配置的关键要点
你的pom.xml已经做对了两个核心配置:
- 设置了
<packaging>war</packaging>,指定打包为war格式 - 将
spring-boot-starter-tomcat的scope设为provided,避免和外部Tomcat的容器依赖冲突
不过你的主应用类需要做一点修改,让它能被外部Tomcat正确加载:
修改主应用类
原来的主类只包含main方法,需要继承SpringBootServletInitializer并重写configure方法,这样外部Tomcat启动时才能初始化Spring Boot的上下文:
@SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
二、在IntelliJ中配置外部Tomcat 8.0.50
这一步就对应Eclipse的“Run on server”,配置一次之后下次直接点击运行即可:
- 点击右上角运行按钮旁边的下拉菜单,选择Edit Configurations
- 点击左上角的
+号,找到Tomcat Server -> Local - 切换到Server标签页,点击
Configure按钮,选择你本地Tomcat 8.0.50的安装目录 - 切换到Deployment标签页,点击
+号,选择Artifact,然后选中你的项目对应的war exploded(推荐选这个,支持热部署,修改代码后无需重启Tomcat) - 设置Application context(比如填
/,这样访问路径就是http://localhost:8080/,或者填你的项目名) - 检查JRE版本是否为1.8,和你pom.xml里的
java.version保持一致
三、启动并测试项目
配置完成后,点击运行按钮启动Tomcat,等控制台输出Tomcat启动成功的日志后,就可以访问你的控制器接口了。比如你控制器里的/index路径,就可以访问http://localhost:8080/index(根据你设置的Application context调整)。
如果用的是war exploded,修改代码后按Ctrl+F9就能触发热部署,Tomcat会自动重新加载修改后的内容,非常方便。
附上你提供的完整配置代码
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</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-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jersey</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</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-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</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-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
完整的控制器示例(补充你未写完的部分)
@RestController public class Controller { private final String SIGNIN_PAGE = "/index"; @GetMapping(SIGNIN_PAGE) public String getSignInPage() { return "Welcome to the sign-in page!"; } }
内容的提问来源于stack exchange,提问作者Gopal




