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

相关文章
|
10月前
|
安全 Java 持续交付
如何实现上传jar直接部署成功,这篇文章直接带你上手springboot实现jar包热更新!
本文详细讲解了在Spring Boot应用中实现Jar包热更新的实践方法。通过自定义类加载器(`HotClassLoader`),动态加载和卸载指定目录下的Jar包,结合Spring Bean动态注册机制,使新加载的类能够被Spring容器管理。同时,提供了文件上传接口,方便用户手动触发Jar包更新。文章还强调了安全性、依赖管理和线程安全等注意事项,并给出了测试步骤和总结,帮助开发者高效实现热更新功能,减少服务中断和提升开发效率。
|
7月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
744 13
|
10月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
600 70
|
7月前
|
Prometheus 监控 Cloud Native
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务实现步骤
700 0
|
12月前
|
Java 应用服务中间件 Maven
SpringBoot项目打包成war包
通过上述步骤,我们成功地将一个Spring Boot应用打包成WAR文件,并部署到外部的Tomcat服务器中。这种方式适用于需要与传统Servlet容器集成的场景。
1440 8
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
JavaScript NoSQL Java
基于SpringBoot+Vue的班级综合测评管理系统设计与实现(系统源码+文档+数据库+部署等)
✌免费选题、功能需求设计、任务书、开题报告、中期检查、程序功能实现、论文辅导、论文降重、答辩PPT辅导、会议视频一对一讲解代码等✌
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的高校食堂移动预约点餐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!