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

相关文章
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
6天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
2522 111
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
13天前
|
Linux iOS开发 MacOS
deepseek部署的详细步骤和方法,基于Ollama获取顶级推理能力!
DeepSeek基于Ollama部署教程,助你免费获取顶级推理能力。首先访问ollama.com下载并安装适用于macOS、Linux或Windows的Ollama版本。运行Ollama后,在官网搜索“deepseek”,选择适合你电脑配置的模型大小(如1.5b、7b等)。通过终端命令(如ollama run deepseek-r1:1.5b)启动模型,等待下载完成即可开始使用。退出模型时输入/bye。详细步骤如下图所示,轻松打造你的最强大脑。
9274 86
|
4天前
|
人工智能 自然语言处理 JavaScript
宜搭上新,DeepSeek 插件来了!
钉钉宜搭近日上线了DeepSeek插件,无需编写复杂代码,普通用户也能轻松调用强大的AI大模型能力。安装后,平台新增「AI生成」组件,支持创意内容生成、JS代码编译、工作汇报等场景,大幅提升工作效率。快来体验这一高效智能的办公方式吧!
1262 5
|
1月前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
阿里云与企业共筑容器供应链安全
171375 18
|
5天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
1163 7
阿里云PAI部署DeepSeek及调用
|
1月前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150313 32
|
1天前
|
人工智能 自然语言处理 API
DeepSeek全尺寸模型上线阿里云百炼!
阿里云百炼平台近日上线了DeepSeek-V3、DeepSeek-R1及其蒸馏版本等六款全尺寸AI模型,参数量达671B,提供高达100万免费tokens。这些模型在数学、代码、自然语言推理等任务上表现出色,支持灵活调用和经济高效的解决方案,助力开发者和企业加速创新与数字化转型。示例代码展示了如何通过API使用DeepSeek-R1模型进行推理,用户可轻松获取思考过程和最终答案。
|
4天前
|
JavaScript 前端开发 API
低代码+阿里云部署版 DeepSeek,10 分钟速成编剧大师
阿里云部署版DeepSeek重磅发布,钉钉宜搭低代码平台已首发适配,推出官方连接器。用户可轻松调用DeepSeek R1、V3及蒸馏系列模型。通过宜搭低代码技术,结合DeepSeek大模型,仅需10分钟即可制作编剧大师应用。
561 19
|
5天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。

热门文章

最新文章