【springboot开发】项目打包、发布和部署

2023-11-12

前言:可以打包成JAR包独立运行,也可以打包成WAR包部署到Tomcat容器中,若涉及到大规模部署,Jenkins成为最佳选择之一。本文主要介绍Maven项目的打包、发布和部署。

1. 项目打包

1.1 生成JAR包

Maven默认会打包jar包,也可以在pom.xml中指定打包方法:

    <groupId>com.example</groupId>
    <artifactId>buildBaseFrame</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>baseBuildFrame</name>
    <description>basic springboot frame</description>
    <packaging>jar</packaging>

主要是最后一行。
然后在项目根目录下的控制台执行:

mvn clean package -Dmaven.test.skip=true
  • mvn clean package包括mvn clean(清除项目taarget下的文件);mvn package(打包命令)
  • -Dmaven.test.skip=true:排除测试代码后打包
    执行完后会在target下生成jar包(项目名+版本号.jar)

1.2 生成WAR包

相对于jar包,war包需要安装Tomcat。
(1)pom.xml配置

    <groupId>com.example</groupId>
    <artifactId>buildBaseFrame</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>baseBuildFrame</name>
    <description>basic springboot frame</description>
    <packaging>war</packaging>

(2)排除内置Tomcat

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

scope属性设置为provided,这样在打包产生的war包就不会包含Tomcat相关的jar。
(3)注册启动类
改写启动类。

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

(4)生成war包
和生成jar包一样

mvn clean package -Dmaven.test.skip=true

将打包好的war包复制到Tomcat服务器中的webapps目录下启动就行。

1.3 资源分离打包

为了方便修改配置文件、静态资源,可以把他们分开打包。只需要修改pom.xml就可以实现。

2. 运行部署

2.1 启动jar包

(1) 前台运行

java -jar package-1.0.0.jar

(2) 后台运行

nohup java -jar package-1.0.0.jar &

日志会被重定向到nohup.out文件中,也可以更改重定向文件:

nohup java -jar package-1.0.0.jar >spring.log 2>&1&

重定向到spring.log

2.2 生产环境部署

2.1是简单的部署运行,建议使用服务的方法来部署。
(1)jar包复制到/usr/local/目录下
(2)创建服务文件
先进入目录:

cd /etc/systemd/system/

使用vim springbootpackage.service创建服务文件:

[Unit]
Description=springbootpackage
After=syslog.target

[Service]
ExecStart=/usr/java/jdk1.8.0_221-amd64/bin/java -Xmx4096m -Xms4096m -Xmn1536m -jar /usr/local/spring-boot-package-1.0.0.jar

[Install]
WantedBy=multi-user.target

主要是定义服务名字,启动的命令和参数,使用时只需要修改Description和ExecStart。
(3)启动服务
手动操作服务:

// 启动服务
systemctl start springbootpackage
// 停止服务
systemctl stop springbootpackage
// 查看服务状态
systemctl status springbootpackage

// 查看服务日志
journalctl -u springbootpackage

还可以设置服务在系统开机时自动启动:

systemctl enable springbootpackage

3. Docker部署

3.1 Docker介绍

  • Docker是一个开源的应用容器引擎,可以让开发者打包应用及依赖包到一个可移植的容器中,然后发布到任何Linux机器上,还可以实现虚拟化。
  • Docker是C/S架构,包括Docker Daemon和Docker Client。

组成部分:

  • 镜像(Image)
    只读的,包含需要运行的组件。用来创建容器,一个镜像可以运行多个容器
  • 容器(Container)
    Docker的运行组件。容器是一个隔离环境,互不影响。
  • 仓库(Registry)
    负责管理和共享Docker镜像。

总结:镜像相当于打包好的程序,启动后运行在容器中,仓库是保存存储镜像的服务地址。

3.2 Springboot集成Docker

3.2.1 pom.xml

添加构建Docker的插件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <!-- Docker maven plugin -->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>

<imageName>${docker.image.prefix}/${project.artifactId}</imageName
                >
                <dockerDirectory>src/main/docker</dockerDirectory>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
        <!-- Docker maven plugin -->
    </plugins>
</build>

参数说明:

  • ${docker.image.prefix}:自定义的镜像名称。
  • :配置Dockerfile的路径。
  • ${project.artifactId}:项目的artifactId。
  • ${project.build.directory}:构建目录,默认为target。
  • ${project.build.finalName}:产出物名称,默认为${project.artifactId}-${project.version}。

3.2.2 构建镜像

(1)创建Docker文件
在src/main/docker下创建Dockerfile文件:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD spring-boot-docker-1.0.jar spring-boot-docker.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar", "/spring-boot-docker.jar"]

(2)生成镜像
把项目spring-boot-starter-docker复制到服务器中(示例为centos),进入项目根目录,使用命令:

mvn package docker:build

运行结果:
在这里插入图片描述
(3)使用docker images查看构建好的镜像
在这里插入图片描述
(4)运行镜像
创建并启动应用:

docker run -p 8080:8080 -t springboot/spring-boot-docker

查看正在运行的镜像:

docker ps
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【springboot开发】项目打包、发布和部署 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有

随机推荐

  • win11安装WSA(安卓子系统)教程

    1 更新到最新版win11 截止2021年10月23日 最新版本号是22000 282 2 启用Windows沙盒和Windows虚拟机监控程序平台 控制面板打开程序与功能 启用或关闭Windows功能 找到这两个选项 打钩确定 等待安装
  • 机器学习实战第十四章-利用SVD简化数据

    一 什么是SVD SVD Singular Value Decomposition 奇异值分解 基本知识如下图所示 其中U和V都可以作为高维转低维的转换矩阵将原始高维冗余数据转换到一个低维无冗余语义空间中 从而实现数据的降维 SVD的应用
  • fastjson总结

    fastjson 版本 1 2 36 主要 API 序列化 API String JSON toJSONString Object 将对象序列化为 json 字符串 反序列化 API T JSON parseObject String st
  • 记一次mybatis-plus遇到的问题

    在用了 springboot 和 mybatis plus很久之后 有一天突然看到配置文件有点繁杂 想将相同的配置拉到application yml里 就在将配置拉过去后 问题就开始出现了 在调用 baseMapper method 的时候
  • 【杰发科技AC7802x测评】4,RTC串口输出

    起初我认为AC7802X的实时实钟会很难 我想留着以后再评吧 可是今天看了RTC说明突然开了悟了 原来RTC只是个计数器 我打开例程并没有发现RTC时钟的例程 到是有个秒中断例程 那也不要紧我把它的功能补全吧 typedef struct
  • 【C++基础学习】引起类模板被实例化情形总结

    在我们使用类模板时 只有当代码中使用了类模板的一个实例的名字 而且上下文环境要求必须存在类的定义时 这个类模板才被实例化 并不是每次使用一个类都要求知道该类的定义 1 声明一个类模板的指针和引用 不会引起类模板的实例化 因为没有必要知道该类
  • 虚拟DOM和真实DOM的区别

    DOM DOM意思是文档对象模型 Dcoument Object Model 它是一个结构化文本的抽象 操作DOM 所以 只要我们想要动态修改网页的内容的时候 我们就修改DOM var item document getElementByI
  • 第二章:25+ Python 数据操作教程(第十七节PYTHON 字典理解与示例)持续更新中

    在本教程中 我们将介绍 Python 中字典理解的工作原理 它包含各种示例 可以帮助您学习字典理解的概念以及如何在现实场景中使用它 什么是词典 字典是Python中的一种数据结构 用于存储数据 以便将值与其相关的键连接起来 大致来说 它的工
  • mac终端操作文件或文件夹(持续更新)

    1 复制文件夹 有文件 cp R 要复制的文件 要复制到哪个路径 2 复制文件 cp 要复制的文件 要复制到哪个路径 3 移动文件夹 mvdir 你要移动的文件夹 要移动到哪里
  • C++ 变量类型

    C 变量类型 变量其实只不过是程序可操作的存储区的名称 C 中每个变量都有指定的类型 类型决定了变量存储的大小和布局 该范围内的值都可以存储在内存中 运算符可应用于变量上 变量的名称可以由字母 数字和下划线字符组成 它必须以字母或下划线开头
  • 手搓のTensorRT网络

    用过TensorRT的基本都接触过trtexec 1 可以方便快捷地将你的ONNX模型转换为TensorRT的engine trtexec onnx model onnx 其中原理是啥 这就涉及到了另外一个库onnx tensorrt 2
  • git 获取不到gitLab创建的新分支

    当我们在日常开发功能的时候 肯定会涉及到新建分支的问题 这时候我们本地的IDE就无法去切换新创建好的分支 因为切换的时候根本找不到那个新建的分支 此时可以可以去通过刷新分支达到发现新分支的目的 找到项目的路径并打开Git Bash Here
  • 第一次作业

    include stm32f4xx h include sys h include delay h include led h include key h int main void u8 MENU NVIC PriorityGroupCo
  • Integer中parseInt(),valueOf(),toString()的区别

    1 parseInt String s int radix 以给出的radix解析s 当不给出radix时 与valueOf 的作用一样 只是s不要超出Integer的范围 2 valueOf String s 把s转换成Integer类型
  • c语言5的阶乘流程图_C语言学习 算法

    1 程序 对数据和操作的描述 算法 数据结构 程序 2 算法的特性 有穷性 在合理的范围内 确定性 无歧义 有零个或多个输入 有一个或多个输出 有效性 3 算法的表示 自然语言 日常用的语言 汉语 英语或其他语言 流程图 4 传统流程图即3
  • 记录Spring boot 项目中druid SQL验证报错但是系统功能正常 报后端报 merge sql error 前端数据查询正常

    异常代码 20 17 49 331 http nio 8081 exec 6 ERROR c a d f s StatFilter mergeSql 169 merge sql error dbType oracle druid 1 2 8
  • SpringBoot整合——阿里云对象存储(OSS)

    SpringBoot整合 阿里云对象存储 1 OSS介绍 在开发应用的过程中 我们经常会有用户需要实名认证之后才能访问的需求 用户认证需要上传证件图片 首页轮播也需要上传图片 因此我们要做文件服务 阿里云oss是一个很好的分布式文件服务系统
  • Docker安装RabbitMQ

    本篇博客主要记录在centos7当中安装RabbitMQ 并且安装完成之后使用外部客户端链接 目录 一 查看docker环境是否正常 二 下载rabbitmq的镜像 三 创建rabbitmq容器 四 访问地址 一 查看docker环境是否正
  • xxx.app已损坏,打不开。您应该将它移到废纸篓解决方法

    1 打开终端 2 在终端中依次输入一下代码 sudo spctl master disable xattr cr Applications xxx app
  • 【springboot开发】项目打包、发布和部署

    前言 可以打包成JAR包独立运行 也可以打包成WAR包部署到Tomcat容器中 若涉及到大规模部署 Jenkins成为最佳选择之一 本文主要介绍Maven项目的打包 发布和部署 目录 1 项目打包 1 1 生成JAR包 1 2 生成WAR包