03 Spring Cloud 准备 - Spring Boot打包

544 阅读3分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战 Spring Boot支持jar和war两种方式启动应用。

1. 使用内置Tomcat发布jar包

<build>
	<finalName>syc_core</finalName>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<!--这里写上main方法所在类的路径 -->
				<mainClass>com.syc.CoreApplication</mainClass>
				<!--外部进行打包 -->
				<includeSystemScope>true</includeSystemScope>
			</configuration>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-surefire-plugin</artifactId>
			<configuration>
				<skipTests>true</skipTests>
			</configuration>
		</plugin>
	</plugins>
</build>

<finalName>syc_core</finalName>
打包后的文件名

<goal>repackage</goal>
1、在原始Maven打包形成的jar包基础上,进行重新打包,新形成的jar包不但包含应用类文件和配置文件,而且还会包含应用所依赖的jar包以及Springboot启动相关类(loader等),以此来满足Springboot独立应用的特性;
2、将原始Maven打包的jar重命名为XXX.jar.original作为原始文件;

<skipTests>true</skipTests>
打包完不执行测试单元

打包执行

打包

mvn clean package

运行jar

java -jar syc_core.jar

maven回顾

Maven:项目管理和构建工具。

Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。
Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

1、clean生命周期:清理项目,包含三个phase。 1)pre-clean:执行清理前需要完成的工作 2)clean:清理上一次构建生成的文件 3)post-clean:执行清理后需要完成的工作

2、default生命周期:构建项目,重要的phase如下。 1)validate:验证工程是否正确,所有需要的资源是否可用。 2)compile:编译项目的源代码。
3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。 4)Package:把已编译的代码打包成可发布的格式,比如jar。 5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。 6)verify:运行所有检查,验证包是否有效且达到质量标准。 7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。 8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。

3、site生命周期:建立和发布项目站点,phase如下 1)pre-site:生成项目站点之前需要完成的工作 2)site:生成项目站点文档 3)post-site:生成项目站点之后需要完成的工作 4)site-deploy:将项目站点发布到服务器

2.打包成war包发布

步骤如下:

2.1 在pom.xml中修改打包格式

<packaging>war</packaging>

2.2 修改pom.xml build标签下的内容

	<build>
		<finalName>pg_core</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
		</plugins>
	</build>

去掉<mainClass>,因为编译后的war包直接部署到tomcat,不会执行main方法。

2.3 添加tomcat依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-tomcat</artifactId>
	<scope>provided</scope>
</dependency>

<scope>provided</scope> 编译时去掉tomcat包。不能直接通过<exclusion>标签去掉tomcat包,因为本地开发的时候需要通过Application类启动。

2.4 修改启动类Application

@SpringBootApplication
public class CoreApplication extends SpringBootServletInitializer{
    public static void main(String[] args) {
    	ConfigurableApplicationContext application = SpringApplication.run(CoreApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(CoreApplication.class);
	}
}

2.5 打包

mvn clean package

访问的端口号由外部tomcat设置。

3. 比较

通过war启动的程序无法像jar包那样,在启动时指定运行环境或其他想要动态改变的参数值,切上下文路径以war包的名字为准,还需要自己安装tomcat,较为麻烦。
注意:
以war方式部署多个SpringBoot工程到tomcat时,需要增加以下配置

spring:
  jvm: 
    default-domain: core

不同的工程配置不同的domain,否则会起冲突。原因是SPringBoot的资源管理是默认打开的,两个项目同时使用会冲突。