SpringBoot-打包&部署

简介: SpringBoot 项目支持两种打包方式:WAR 包和 JAR 包。JAR 包内置 Tomcat,可直接运行;WAR 包需部署在外部 Tomcat 上。JAR 包通过 `mvn clean package` 打包并用 `java -jar` 运行,支持后台运行和 JVM 参数配置。WAR 包需修改 pom.xml 为 war 类型,移除嵌入式 Tomcat 依赖,添加 servlet-api,并继承 `SpringBootServletInitializer`。配置文件可通过外部 application.yml 覆盖,默认优先级高于 JAR 内部配置。

SpringBoot 项目支持两种打包方式,一种是 WAR 包,然后在 Tomcat 上部署运行,一种是 JAR 包,内置了 Tomcat,可以直接运行。

打成 JAR 包

Spring Boot 默认自带了一个嵌入式的 Tomcat , 支持以 jar 方式运行.

① pom.xml 添加打包插件

xml

代码解读

复制代码

<properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <!--指定编码-->
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
  <!--打包出的 jar 包的名字-->
  <finalName>ts_eureka_server</finalName>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.0</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>2.0.6.RELEASE</version>
      <!--这里写上main方法所在类的路径-->
      <configuration>
        <mainClass>com.ts.eureka.EurekaApplication</mainClass>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
  <resources>
    <!-- 在这里将你需要添加到 jar 文件的所有文件都配置进去 -->
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.xml</include>
        <include>**/*.yml</include>
        <include>**/*.html</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.yml</include>
        <include>**/*.xml</include>
      </includes>
    </resource>
  </resources>
</build>

② 打包

在 cmd 中,使用 mvn clean package 命令进行打包.

③ 运行

在 cmd 中, 通过 java -jar + jar包名, 即可运行该项目. 只要不关闭 cmd, 就会一直运行.

如果是在 linux 中想要运行且在后台运行该 jar 包时, 使用如下命令, 返回的是其 pid 号.

c

代码解读

复制代码

// 结尾的 & 表示在后台进程运行  
// > log.log 是在当前目录下生成日志文件
java -jar xxx.jar  > log.log  &

④ 配置 JVM 参数运行

可以在启动的时候, 指定 JVM 参数.

ruby

代码解读

复制代码

nohup java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar /jar包路径

⑤ 访问

访问地址为: http://服务器ip:项目中配置的端口/接口路径

打成 WAR 包

① 修改打包方式, 在 pom.xml 中, 修改打包方式为 war 方式 :

xml

代码解读

复制代码

<packaging>war</packaging>

② 移除自带的 Tomcat 依赖. 添加 servlet-api 的依赖.

xml

代码解读

复制代码

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <!-- 移除嵌入式tomcat插件 -->
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>

③ 修改启动类, 并重写初始化方法

启动类继承SpringBootServletInitializer类, 并重写 configure 方法.

scala

代码解读

复制代码

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

④ 打包

mvn clean package 打包完成后会在 target 目录下生成 .war 文件.

⑤ 部署

将 war 文件放到 Tomcat 的 webapps 目录下, 启动 Tomcat 即可自动解压部署.

⑥ 访问

访问地址为: http://服务器ip:服务器里Tomcat配置的端口/项目名/接口路径

注意:项目名以 Tomcat 的 webapps 目录下解压后的文件夹名字为准, 由于不使用 Spring Boot 自带的 Tomcat, 所以 yml 文件里的 server 配置不起作用.

打包之后, 配置文件的修改

在将 SpringBoot 项目打成 jar 包之后, 配置文件也被加入到了 jar 文件里面, 无法再对其修改了, 但有时又有对其进行修改的需求, 这时, 不可能重新修改项目, 重新打包, 这样十分麻烦.

只需要在打出的 jar 文件所在的目录, 创建一个 application.yml文件或者 application.properties 文件, 因为外部的配置文件的优先级高于jar包内部的配置文件, 所以将要修改的配置, 写在该外部文件即可. 然后, java -jar xxx.jar 启动即可, 可以看到配置已经修改了.

还可以通过启动参数 –spring.config.location=/opt/jars/oauth/application.yml来指定外部配置文件的位置.

不过, 经过测试发现, 这种方式只支持 SpringBoot 本身存在的属性, 对我们自定义的属性配置好像无法覆盖. 还是使用 JAR 包里面的配置.

最后的解决方式 :

  • 编写项目时, 暂时将自定义的配置写在 application.yml 中.
  • 在准备打成 JAR 包的时候, 将所有的自定义的配置, 剪切到外部的 application.yml, 然后再打 JAR 包. 这样打完 JAR 包后, 配置就分为两部分, 一部分 SpringBOOt 本身的可以被覆盖的, 在 JAR 包里面, 另外一部分自定义的, 在 JAR 包外面.

SpringBoot 项目增量更新部署

背景:SpringBoot 项目打 jar 包方便是方便, 就是每次打包出来的 jar 太大了, 先不说上传时间的问题, 如果只修改了 1 个类就需要重新打包项目, 然后重新上传项目到服务器, 怎么觉得还不如之前使用 war 包方便呢, 使用 war 包时, 虽然要部署到 Tomcat 中, 但只需要将修改的 class 替换一下, 重启一下 Tomcat 就可以快速部署了.

瘦身前的Jar包

Tomcat 在部署 Web 工程的时候, 可以进行增量更新, 其实, Spring Boot 也是可以的. Spring Boot 编译出来的 Jar 包中, 占用空间大的, 都是一些外部依赖库 jar 包.

例如:进入项目工程根目录, 执行 mvn clean install 命令, 得到的 Jar 包, 用压缩软件打开, 目录结构如下:

整个 Jar 包 16.7M, 但是 BOOT-INF/lib 就占用了将近 16.6 M.

瘦身步骤

1.第一次打包时, 打包出带有外部依赖的 jar 包. 并将 jar 包进行解压, 将 lib 文件夹解压到指定目录中.

打包所用的 pom :

xml

代码解读

复制代码

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <mainClass>it.com.XXApplication</mainClass>
        <layout>ZIP</layout>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal> 
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugins>
<build>

2.第二次打包, 打包出没有外部依赖的 jar 包.

打包所用的 pom :

xml

代码解读

复制代码

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <mainClass>it.com.XXApplication</mainClass>
        <layout>ZIP</layout>
        <includes>
          <include>
            <groupId>nothing</groupId>
            <artifactId>nothing</artifactId>
          </include>
        </includes>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugins>
<build>

3.将解压出来的 lib 文件夹、第二次打包的 jar 包放在同一个目录下, 运行下面命令 就能成功运行.

ini

代码解读

复制代码

// 指定 lib 位置
java -Dloader.path=lib -jar xxxx.jar

4.后续对代码的修改, 都按照第二次打包的方式, 进行打包.

5.当然了, 这种方式要求打包后, 没有引入新的外部依赖, 如果有新的依赖, 则需要重新按照第一次的方式进行打包.


转载来源:https://juejin.cn/post/7133924780226379790

相关文章
|
4月前
|
Java 应用服务中间件 Maven
如何将 Spring Boot 应用程序部署为 WAR?
如何将 Spring Boot 应用程序部署为 WAR?
272 1
|
1月前
|
Java 应用服务中间件 Maven
SpringBoot项目打包成war包
通过上述步骤,我们成功地将一个Spring Boot应用打包成WAR文件,并部署到外部的Tomcat服务器中。这种方式适用于需要与传统Servlet容器集成的场景。
48 8
|
2月前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue的班级综合测评管理系统设计与实现(系统源码+文档+数据库+部署等)
✌免费选题、功能需求设计、任务书、开题报告、中期检查、程序功能实现、论文辅导、论文降重、答辩PPT辅导、会议视频一对一讲解代码等✌
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的高校食堂移动预约点餐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
2月前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
57 10
|
2月前
|
Java 应用服务中间件
SpringBoot工程打包部署
SpringBoot工程打包部署简介:SpringBoot项目可通过三种方式运行:可执行Jar包、可执行War包和标准War包。其中,可执行Jar/War包可独立运行,标准War包需部署在Tomcat中。具体步骤包括:1. 修改pom.xml添加构建依赖;2. 执行`mvn clean package`命令打包;3. 运行生成的Jar/War包(如`java -jar xxx.jar`)。对于标准War包,还需修改启动类并配置Tomcat依赖。