SpringBoot项目分离与分层方式之容器化部署

devtools/2025/1/11 17:26:14/

SpringBoot项目分离与分层方式之容器化部署

文章目录

  • 1.前言
  • 2.deom项目工程结构
  • 3.分离容器部署
    • 3.1父工程pom
    • 3.2子模块3的Dockerfile
    • 3.3子模块3的target
    • 3.4构建启动docker命令
  • 4.分层容器部署
    • 4.1父工程pom
    • 4.2子模块3的Dockerfile
    • 4.3子模块3的target
    • 4.4构建启动docker命令
  • 5.jekines脚本
  • 6.总结

1.前言

  之前也分享过分离与分层方式部署,本文只不过将之前的那两种方式放到了容器中来部署运行,里面多多少少还是有点坑在里面的,要相对简单一点直接使用如下命令部署:

java">nohup java -jar xxxx.jar --spring.profiles.active=xx ,,,,, > xxxx.log &

  使用容器部署方式就比这种更高级优雅一点,根据个人喜好去选择适合自己的部署方式。

  之前的文章链接如下:

https://blog.csdn.net/qq_34905631/article/details/126616809?spm=1001.2014.3001.5501
https://mp.weixin.qq.com/s/OTZ-VVn_VimHNcSdEaLYJw
https://blog.csdn.net/qq_34905631/article/details/126574085?spm=1001.2014.3001.5501
https://mp.weixin.qq.com/s/5mhF1ge_yYUA6tMCYi77Og

2.deom项目工程结构

image-20250110000123743

3.分离容器部署

3.1父工程pom

  这里只展示build的配置

<build><!--特别注意:项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目--><plugins><!-- 跳过测试代码  maven版本需要3.6.3及以上版本 jeksion构建时候,maven版本需要3。6.3及以上版本--><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.5.2</version><configuration><skipTests>true</skipTests></configuration></plugin>--><!--Spring Boot模块jar构建--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.12.RELEASE</version><configuration><!-- 指定该Main Class为全局的唯一入口 --><mainClass>xxxx.xxxx.xxxx.xxxApplication</mainClass><!--解决windows命令行窗口中文乱码,该参数配置无效,需要容器启动命令中动态传入该参数才有效--><jvmArguments>-Dfile.encoding=UTF-8</jvmArguments><!--设置为true,以便把本地的system的jar也包括进来--><includeSystemScope>true</includeSystemScope><layout>ZIP</layout><classifier>exec</classifier><addResources>true</addResources><fork>true</fork><!--开启分层编译支持--><!-- <layers><enabled>true</enabled></layers>--><outputDirectory>${project.build.directory}</outputDirectory><skip>true</skip><includes><!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar--><!-- <include><groupId>null</groupId><artifactId>null</artifactId></include>--><!--这里是填写需要包含进去的jar,必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来如果没有则non-exists ,表示不打包依赖--><include><groupId>non-exists</groupId><artifactId>non-exists</artifactId></include><!--<include><groupId>*</groupId><artifactId>*-dto</artifactId></include>--><!--<include><groupId>xxxxx.xxxxx</groupId><artifactId>xxxx</artifactId></include>--></includes></configuration><executions><execution><goals><goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中--></goals></execution></executions></plugin><!--拷贝资源文件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.2.0</version><executions><execution><id>copy-resources</id><phase>package</phase><goals><goal>copy-resources</goal></goals><configuration><resources><resource><directory>src/main/resources</directory><excludes><exclude>static/**</exclude><exclude>*.xml</exclude><!-- 这里把yml文件排除 dockerfile文件中就不用拷贝yml文件,这种验证是ok的--><exclude>*.yml</exclude></excludes></resource></resources><outputDirectory>${project.build.directory}/resources</outputDirectory></configuration></execution></executions><configuration><nonFilteredFileExtensions><nonFilteredFileExtension>pem</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin><!--生成doc jar包--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>2.9</version><configuration><attach>true</attach><!-- utf-8读取文件 --><charset>UTF-8</charset><!-- utf-8进行编码代码 --><encoding>UTF-8</encoding><!-- utf-8进行编码文档 --><docencoding>UTF-8</docencoding></configuration><executions><execution><id>attach-javadocs</id><goals><goal>jar</goal></goals><configuration><additionalparam>-Xdoclint:none</additionalparam></configuration></execution></executions></plugin><!--生成源码jar包--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.2.1</version><executions><execution><id>attach-sources</id><goals><goal>jar</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.3.0</version><configuration><!-- 不打包资源文件--><excludes><!-- <exclude>static/**</exclude>--><exclude>*.properties</exclude><!--<exclude>*.xml</exclude>--><exclude>*.json</exclude><!-- yaml和yml这两个也可以注释了,dockerfile文件中不拷贝yaml文件[这个验证是ok的]--><!-- <exclude>*.yaml</exclude><exclude>*.yml</exclude>--><exclude>*.png</exclude><exclude>*.txt</exclude></excludes><archive><!--  &lt;!&ndash; 生成的jar中,不要包含pom.xml和pom.properties这两个文件 &ndash;&gt;--><addMavenDescriptor>false</addMavenDescriptor><manifest><!-- 指定程序入口 --><mainClass>xxx.xxxxx.xxxiApplication</mainClass><!-- 打包时 MANIFEST.MF文件不记录的时间戳版本,jar不包含唯一版本 --><useUniqueVersions>false</useUniqueVersions><!--MANIFEST.MF中的Class-Path加前缀--><addClasspath>true</addClasspath><!-- 服务依赖的jar包放在lib目录下 --><classpathPrefix>lib/</classpathPrefix><!--<addDefaultImplementationEntries>true</addDefaultImplementationEntries>--></manifest><manifestEntries><!-- &lt;!&ndash;有些非官方三方的诸如sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件通过使用额外定义 Class-Path 值来追加指定依赖组件列表,在子模块按实际情况指定 jar-manifestEntries-classpath 值即可例如(注意前面个点字符及各空格分隔符):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar详见各子模块中 boot-jar-output 属性定义示例&ndash;&gt;--><Class-Path>./resources/</Class-Path><!--这里是一个坑,外部jar依赖分离打包需要在这里配置一下,有多个就配置多个--><Class-Path>lib/xxxxxx.xxxxx.jar lib/xxxxxx.xxxx.jar </Class-Path></manifestEntries></archive><outputDirectory>${project.build.directory}</outputDirectory></configuration></plugin><!-- 拷贝项目所有依赖jar文件到构建lib目录下 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.6.0</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><!--各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录详见各子模块中 boot-jar-output 属性定义--><type>jar</type><includeTypes>jar</includeTypes><!-- 存放服务依赖的jar包,存放在服务相同目录的lib文件夹下 --><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin><!-- 跳过deploy --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version><configuration><skip>true</skip></configuration></plugin><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.1.0</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml><warName>${project.artifactId}</warName></configuration></plugin>--></plugins><finalName>${project.artifactId}</finalName></build>

3.2子模块3的Dockerfile

FROM xxx基础镜像
VOLUME /resources
WORKDIR /app
ADD target/xxx.jar /app/app.jar
ADD target/lib /app/lib/
ADD target/resources/* /app/resources/
# COPY target/resources/*.yml /app/config/ 这种方式是将boostrap.yml文件拷贝到config,提升了加载优先级别,否则找不到这个yml
RUN echo "Asia/Shanghai" > /etc/timezone
EXPOSE xxx对外暴露监听端口
ENTRYPOINT java ${JAVA_OPTS} ${JAVA_PARAMETERS} ${SERVER_NAME}  -Xss1m -jar /app/app.jar

  容器中工作路径下有app.jar、config。resources这几项.

3.3子模块3的target

  子模块3打包之后target下文件如图所示:

image-20250110001324717

3.4构建启动docker命令

#进入到子模块三路劲中
docker build -t xx:v2.0.0 .
docker run -itd -p xxx:xxx --ip=本机ip(连接wifi的ip) -e JAVA_OPTS="-Xms200m -Xmx200m -Xss256K -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=jvm远程调试监听端口 -Dfile.encoding=UTF-8" --name xxx-xxxx-server xx:v2.0.0

4.分层容器部署

4.1父工程pom

  这里只展示build的配置

<build><!--特别注意:项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目--><plugins><!-- 跳过测试代码  maven版本需要3.6.3及以上版本--><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.5.2</version><configuration><skipTests>true</skipTests></configuration></plugin>--><!--Spring Boot模块jar构建--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.12.RELEASE</version><configuration><mainClass>xxxlx.xxxx.xxxApplication</mainClass><includeSystemScope>true</includeSystemScope><!--&lt;!&ndash; 指定该Main Class为全局的唯一入口 &ndash;&gt;<mainClass>xxxx.xxxxx.xxApplication</mainClass>&lt;!&ndash;解决windows命令行窗口中文乱码,该参数配置无效,需要容器启动命令中动态传入该参数才有效&ndash;&gt;<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>&lt;!&ndash;设置为true,以便把本地的system的jar也包括进来&ndash;&gt;<includeSystemScope>true</includeSystemScope><layout>ZIP</layout><classifier>exec</classifier><addResources>true</addResources><fork>true</fork>--><!--开启分层编译支持--><layers><enabled>true</enabled></layers><!--<outputDirectory>${project.build.directory}</outputDirectory><skip>true</skip><includes>&lt;!&ndash; 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar&ndash;&gt;&lt;!&ndash; <include><groupId>null</groupId><artifactId>null</artifactId></include>&ndash;&gt;&lt;!&ndash;这里是填写需要包含进去的jar,必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来如果没有则non-exists ,表示不打包依赖&ndash;&gt;<include><groupId>non-exists</groupId><artifactId>non-exists</artifactId></include>&lt;!&ndash;<include><groupId>*</groupId><artifactId>*-dto</artifactId></include>&ndash;&gt;&lt;!&ndash;<include><groupId>xxxxx.xxxxx</groupId><artifactId>xxxx</artifactId></include>&ndash;&gt;</includes>--></configuration><executions><execution><goals><goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中--></goals></execution></executions></plugin><!--拷贝资源文件--><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.2.0</version><executions><execution><id>copy-resources</id><phase>package</phase><goals><goal>copy-resources</goal></goals><configuration><resources><resource><directory>src/main/resources</directory><excludes><exclude>static/**</exclude><exclude>*.xml</exclude>&lt;!&ndash; 这里把yml文件排除 dockerfile文件中就不用拷贝yml文件,这种验证是ok的&ndash;&gt;<exclude>*.yml</exclude></excludes></resource></resources><outputDirectory>${project.build.directory}/resources</outputDirectory></configuration></execution></executions><configuration><nonFilteredFileExtensions><nonFilteredFileExtension>pem</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin>--><!--生成doc jar包--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>2.9</version><configuration><attach>true</attach><!-- utf-8读取文件 --><charset>UTF-8</charset><!-- utf-8进行编码代码 --><encoding>UTF-8</encoding><!-- utf-8进行编码文档 --><docencoding>UTF-8</docencoding></configuration><executions><execution><id>attach-javadocs</id><goals><goal>jar</goal></goals><configuration><additionalparam>-Xdoclint:none</additionalparam></configuration></execution></executions></plugin><!--生成源码jar包--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.2.1</version><executions><execution><id>attach-sources</id><goals><goal>jar</goal></goals></execution></executions></plugin><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.3.0</version><configuration>&lt;!&ndash; 不打包资源文件&ndash;&gt;<excludes>&lt;!&ndash; <exclude>static/**</exclude>&ndash;&gt;<exclude>*.properties</exclude>&lt;!&ndash;<exclude>*.xml</exclude>&ndash;&gt;<exclude>*.json</exclude>&lt;!&ndash; yaml和yml这两个也可以注释了,dockerfile文件中不拷贝yaml文件[这个验证是ok的]&ndash;&gt;&lt;!&ndash; <exclude>*.yaml</exclude><exclude>*.yml</exclude>&ndash;&gt;<exclude>*.png</exclude><exclude>*.txt</exclude></excludes><archive>&lt;!&ndash;  &lt;!&ndash; 生成的jar中,不要包含pom.xml和pom.properties这两个文件 &ndash;&gt;&ndash;&gt;&lt;!&ndash; <addMavenDescriptor>false</addMavenDescriptor>&ndash;&gt;<manifest>&lt;!&ndash; 指定程序入口 &ndash;&gt;<mainClass>com.lq.invoice.LeQiApplication</mainClass>&lt;!&ndash; 打包时 MANIFEST.MF文件不记录的时间戳版本,jar不包含唯一版本 &ndash;&gt;<useUniqueVersions>false</useUniqueVersions>&lt;!&ndash;MANIFEST.MF中的Class-Path加前缀&ndash;&gt;<addClasspath>true</addClasspath>&lt;!&ndash; 服务依赖的jar包放在lib目录下 &ndash;&gt;<classpathPrefix>lib/</classpathPrefix>&lt;!&ndash;<addDefaultImplementationEntries>true</addDefaultImplementationEntries>&ndash;&gt;</manifest><manifestEntries>&lt;!&ndash; &lt;!&ndash;有些非官方三方的诸如sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件通过使用额外定义 Class-Path 值来追加指定依赖组件列表,在子模块按实际情况指定 jar-manifestEntries-classpath 值即可例如(注意前面个点字符及各空格分隔符):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar详见各子模块中 boot-jar-output 属性定义示例&ndash;&gt;&ndash;&gt;<Class-Path>./resources/</Class-Path><Class-Path>lib/spire.pdf.free-9.13.0.jar</Class-Path></manifestEntries></archive><outputDirectory>${project.build.directory}</outputDirectory></configuration></plugin>&lt;!&ndash; 拷贝项目所有依赖jar文件到构建lib目录下 &ndash;&gt;<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.6.0</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration>&lt;!&ndash;各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录详见各子模块中 boot-jar-output 属性定义&ndash;&gt;<type>jar</type><includeTypes>jar</includeTypes>&lt;!&ndash; 存放服务依赖的jar包,存放在服务相同目录的lib文件夹下 &ndash;&gt;<outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin>--><!-- 跳过deploy --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version><configuration><skip>true</skip></configuration></plugin><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.1.0</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml><warName>${project.artifactId}</warName></configuration></plugin>--></plugins><finalName>${project.artifactId}</finalName></build>

  这个是用之前的分离打包的build改的,测试是ok的

4.2子模块3的Dockerfile

FROM xxxx基础镜像 AS builder
VOLUME /resources
WORKDIR /app
# 配置参数
ARG JAR_FILE=target/xxxx.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} /app/app.jar
#ADD target/lib /app/lib/
#ADD target/resources/* /app/resources/
# COPY target/resources/*.yml /app/config/
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar app.jar extract
RUN echo "Asia/Shanghai" > /etc/timezone
# 正式构建镜像
FROM xxxx基础镜像
WORKDIR /app
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder /app/dependencies/ ./
COPY --from=builder /app/spring-boot-loader/ ./
COPY --from=builder /app/snapshot-dependencies/ ./
COPY --from=builder /app/application/ ./EXPOSE xxx对外暴露监听端口
ENTRYPOINT ["java","-Xms200m","-Xmx200m","-Xss256K","-Xdebug", "-Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=xxxxjvm远程调试监听端口", "-Dfile.encoding=UTF-8", "org.springframework.boot.loader.JarLauncher"]

  这种方式是用一个胖jar包来提取分层镜像构建的,缺点是不能动态传递启动参数,必须在ENTRYPOINT中写死。

4.3子模块3的target

  这种方式是一个正常的java胖jar包,所有的都打入到这个胖jar中,这里就不展示了。

4.4构建启动docker命令

#进入到子模块三路劲中
docker build -t xx:v2.0.0 .
docker run -itd -p xxx:xxxx --ip=本机ip(wifi连接的ip) --name lq-invoice-server xx:v2.0.0

5.jekines脚本

pipeline {agent anyenvironment {image_tag="xxxxx/xxxxx/xxxxxx:v1.0.${BUILD_NUMBER}"git_address="http://xxxx/xxxx/xx.git"git_branch="xxx"port=xxxxxgit_auth="xxxxxx"registry_name="xxxxx"registry_pwd="xxxx"container_name="xxxxxxxx"JAVA_OPTS="-javaagent:/agent/skywalking-agent.jar -Dskywalking.agent.service_name=[xxxx-xxxx-xxx] -Dskywalking.trace.ignore_path=/actuator/** -Xms512m -Xmx512m -Xss256K -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=xxxxxx"}stages {stage("拉取代码") {steps {git branch: "${git_branch}", credentialsId: "${git_auth}",url: "${git_address}"}}stage('质量扫描') {steps {echo '跳过扫描'}}stage('maven编译') {steps {sh 'mvn -B -f ./pom.xml clean install -DskipTests'}}stage('编译镜像') {steps {sh '''cd 子模块三路劲/cp target/*.jar ./docker build -t ${image_tag} .'''sh 'docker login --username=${registry_name} --password=${registry_pwd} xxxx.xxxx.xxxx私服域名'sh 'docker push ${image_tag}'sh 'docker rmi ${image_tag}'}}stage('部署服务') {steps {echo '自动部署'sh '''ssh root@服务器ip << remotesshdocker stop ${container_name}docker rm ${container_name}docker pull ${image_tag}docker run -d -p ${port}:${port} --net=host -e SERVER_PORT=${port} -e JAVA_OPTS="${JAVA_OPTS}" --name ${container_name} ${image_tag}exitremotessh'''}}}
}

  这个构建分离的是没有啥问题的,构建分层的这个docker run 需要修改一下,参数不能动态传了,直接修改为4.4构建启动docker命令的docker run命令部署即可。

6.总结

  这两种方式是之前分享之后的酝酿灵感思路融合实践总结,上面两种方式是互斥的,任选一种即可,希望我的分享对你有所启发和帮助,请一键三连,么么么哒!


http://www.ppmy.cn/devtools/149664.html

相关文章

在Windows环境下搭建无人机模拟器

最近要开发无人机地面站&#xff0c;但是没有无人机&#xff0c;开发无人机对我来说也是大姑娘坐花轿——头一回。我们要用 MAVLink 和无人机之间通信&#xff0c;看了几天 MAVLink&#xff0c;还是不得劲儿&#xff0c;没有实物实在是不好弄&#xff0c;所以想先装一个无人机模…

2025域名出售交易平台PHP源码

源码介绍 2025域名出售交易平台PHP源码,搭建即可正常使用&#xff0c;后台功能测试正常&#xff0c;前台测试正常,无需到处找教程或修复&#xff0c;教程一次性到位 搭建教程 PHP必须是5.6的 导入数据库 数据库配置文件 config/config.php 后台 http://域名/ymadmin 用户&am…

eslint.config.js和.eslintrc.js有什么区别

eslint.config.js 和 .eslintrc.js 的主要区别在于它们所对应的 ESLint 版本和配置方法&#xff1a; 1. .eslintrc.js&#xff1a; 这是 ESLint v8 及更早版本使用的配置文件格式。 它使用层级式的配置系统。 现在被称为"旧版"配置格式 。 2. eslint.config.js&am…

【Spring】注入方式

介绍 在Spring框架中&#xff0c;依赖注入&#xff08;Dependency Injection, DI&#xff09;是实现控制反转&#xff08;Inversion of Control, IoC&#xff09;的核心机制。 除了通过XML配置的注入方式&#xff08;已逐渐被淘汰&#xff09;&#xff0c;Spring还支持多种基…

基于Spring Boot的宠物健康顾问系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

ChatGPT如何赋能办公

课程背景&#xff1a; ChatGPT近来非常火爆&#xff0c;但多数课程偏重于理论&#xff0c;我们本次讲座将以亲身实践为例&#xff0c;分享如何快速赋能办公&#xff0c;并立刻提升生产力。 课程梗概&#xff1a; 本课程旨在探究ChatGPT在办公中的应用。通过案例分析、课堂讨…

[研发效率]什么是软件工程生产力

软件工程生产力是指开发团队在单位时间内能够高效、高质量地完成软件开发任务的能力。提高软件工程生产力不仅有助于缩短项目周期&#xff0c;还能提升软件的质量和可靠性&#xff0c;从而为组织带来更大的商业价值。 提高软件工程生产力的一些关键策略和技术&#xff0c;具体如…

备考蓝桥杯:顺序表详解(静态顺序表,vector用法)

目录 1.顺序表的概念 2.静态顺序表的实现 总代码 3.stl库动态顺序表vector 测试代码 1.顺序表的概念 要理解顺序表&#xff0c;我们要先了解一下什么是线性表 线性表是n个具有相同特征的数据元素的序列 这就是一个线性表 a1是表头 a4是表尾 a2是a3的前驱 a3是a2的后继 空…