SpringBoot系列:SpringBoot打包成war,并在tomcat下运行

2 篇文章 0 订阅
1 篇文章 0 订阅

1、实现继承SpringBootServletInitializer类

package com.example.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(DemoApplication.class);
	}

}

package com.example.demo;

import javax.servlet.Filter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.web.filter.CharacterEncodingFilter;

@SpringBootApplication
public class DemoApplication {

	// 用于处理编码问题  
		@Bean
		public Filter characterEncodingFilter() {
			CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
			characterEncodingFilter.setEncoding("UTF-8");
			characterEncodingFilter.setForceEncoding(true);
			return characterEncodingFilter;
		}
		
		/**
		 * mvn打包后,需要指定内嵌tomcat的服务,否则会“找不到EmbeddedServletContainerFactory”报错
		 * 也可以使用jetty服务
		 * @return
		 */
		@Bean
		public EmbeddedServletContainerFactory servletContainer() {
			TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
			return factory;
		}
		
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

2、将SpringBoot打包方式改成war

<packaging>war</packaging>

3、在pom中将spring-boot-starter-tomcat的scope设置成provided

如果打包成war时,不会打包tomcat相关的jar

如果打包成jar时,会打包tomcat相关jar

<!-- scope=provided,当打包成war时不会将tomcat.jar打包进去;当直接eclipse执行DemoApplication时需要
			一定要配置<scope>provided</scope>
		 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>

4、配置maven-war-plugin插件

注意:failOnMissingWebXml要设置成false,因为springboot是没有web.xml,否则mvn会出错

outputDirectory设置成tomcat下webapps目录下,可以自动复制到webapps目录下

<!-- war发布打包,并war包直接输出到tomcat下 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<configuration>
					<!-- 设置成false,否则检查web.xml是否存在。因为springboot是没有web.xml的 -->
					<failOnMissingWebXml>false</failOnMissingWebXml>
					<warName>myweb</warName>
					<archive>
						<manifest>
							<mainClass>${start-class}</mainClass>
							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
						</manifest>
					</archive>
					<skipTests>true</skipTests>
					<skip>true</skip><!-- 跳过测试 -->
					<testFailureIgnore>true</testFailureIgnore>
					<!-- 将war包直接输出到tomcat下webapps目录下 -->
					<outputDirectory>${outputDirectory}</outputDirectory>
				</configuration>
			</plugin>

5、完整配置

<?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>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.7</java.version>
		<springboot.version>1.5.13.RELEASE</springboot.version>
		<outputDirectory>D:/Program Files/Tomcat/apache-tomcat-7.0.70/webapps</outputDirectory>
	</properties>
	
	<dependencyManagement>
		<dependencies>
			<!--springboot相关依赖 -->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${springboot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
		</dependency>
		
		<!-- scope=provided,当打包成war时不会将tomcat.jar打包进去;当直接eclipse执行DemoApplication时需要
			一定要配置<scope>provided</scope>
		 -->
		<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>

	</dependencies>

	<build>
		<plugins>
			<!-- 编译插件,以${java.version}编译 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
				</configuration>
			</plugin>

			<!-- war发布打包,并war包直接输出到tomcat下 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<configuration>
					<!-- 设置成false,否则检查web.xml是否存在。因为springboot是没有web.xml的 -->
					<failOnMissingWebXml>false</failOnMissingWebXml>
					<warName>myweb</warName>
					<archive>
						<manifest>
							<mainClass>${start-class}</mainClass>
							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
						</manifest>
					</archive>
					<skipTests>true</skipTests>
					<skip>true</skip><!-- 跳过测试 -->
					<testFailureIgnore>true</testFailureIgnore>
					<!-- 将war包直接输出到tomcat下webapps目录下 -->
					<outputDirectory>${outputDirectory}</outputDirectory>
				</configuration>
			</plugin>
			
			<!-- jar发布打包,并jar包直接输出到指定目录下 -->
			<!-- <plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>1.5.9.RELEASE</version>
				<configuration>
                   	 指定该Main Class为全局的唯一入口
                    <mainClass>com.example.demo.DemoApplication</mainClass>
                    <layout>ZIP</layout>
                    <outputDirectory>${outputDirectory}</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>可以把依赖的包都打包到生成的Jar包中
                        </goals>
                    </execution>
                </executions>
			</plugin> -->
			
			<!-- 将resources目录下文件打包进去 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<encoding>UTF-8</encoding>
					<delimiters>
						<delimiter>@</delimiter>
					</delimiters>
					<useDefaultDelimiters>false</useDefaultDelimiters>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
		</plugins>

	</build>


</project>

6、运行tomcat并访问

通过http://127.0.0.1:8080/myweb/index访问

如果不需要contextPath, 可以将war打包到webapps下的ROOT目录, 则http://127.0.0.1:8080/index访问

注意:application.properties中的端口和contextPath配置不再生效了,而是使用tomcat的方式

server.port=8081
server.context-path=/mydemo

代码已上传到github:https://github.com/suncht/sun-test/tree/master/springboot.tomcat.test


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值