这是我参与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的资源管理是默认打开的,两个项目同时使用会冲突。