当前位置: 首页 > news >正文

85 总结一下最近遇到的一些 jar发布 相关的知识

前言

呵呵 最近有一些构建服务, 发布服务的一些需求 

我们这里的服务 一般来说是 java application, spring boot application 

针对发布, 当然最好是 增量发布, 尽量的减少需要传递给 发布服务器 的资源的大小  

比如 我的这个 java application, 可能会存在很多依赖, 常规有很多种做法 

1. 吧 application 和其依赖绑定打成一个 fat jar, 然后传到发布服务器上面, java -jar $jar 

2. 通过 classpath 来关联依赖的 jar, java -classpath $classpath -jar $appJar 或者 java -classpath $classpath:$appJar $mainClazz 

假设依赖很多的话, 方式 显然会传递很多 大概率不会变化的依赖的数据, 造成一些 不必要的麻烦, 时间开销 等等 

我们这里会 介绍一些场景来尽可能的减少发布所需要的一些数据, 将一些稳定的数据 一直保存在发布服务器上面就好 

 

但是依然会存在一些问题, 希望您看完之后 有所收获 

1. 如何更加 轻量级 的发布 java application 

1. 比如 $classpath 太长的情况下, 怎么处理, 命令行支持的命令的长度是有限的, 应该怎么处理 ? 

2. spring boot 的包包括了依赖, 应该怎么 更加轻量级的发布 ? 

 

 

java application 启动的一些方式

抽象的来说又如下几种启动方式 

1. java -classpath $classpath $mainClazz

2. java -classpath $classpath -jar $jar 

 

但是我们这里要讨论如下几种情况, 当然 都可以抽象为上面两种方式, 但是 在一些特殊的场景有一些特殊的使用, 因此我们单独拎出来 

1. java -classpath $classpath $mainClazz
2. java -jar $jar
3. java  -classpath $classpath -jar $jar
4. java CommandlineRunner $classpathFile $mainClazz
5. java -jar $shortenJar $mainClazz
6. java -jar $springbootJar

 

1. java -classpath $classpath $mainClazz

这个就是我们最常见的了, 通过 -classpath 选项指定 classpath, 然后 $mainClazz 是启动类, 寻找 classpath 中的 $mainClazz, 然后调用 $mainClazz 的 main 方法 

不多赘述 

 

2. java -jar $jar

这个就是 直接通过 jar 来启动, 清单文件中包含了需要的 $classpath 和 $mainClazz 

寻找 classpath 中的 $mainClazz, 然后调用 $mainClazz 的 main 方法 

不多赘述 

 

3. java -classpath $classpath -jar $jar

在 2 的基础上增加了 指定 -classpath 

不多赘述 

 

4. java CommandlineRunner $classpathFile $mainClazz

这个就是 idea 提供的缩短 classpath 的方案之一 

通过 CommandlineRunner 代理一次, 从外部读取 classpath, 放入 classloader, 然后再 查找 $mainClazz, 调用 main 方法 

具体的实现, 请参见  idea 的 CommandlineRunner 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

然后启动的方式大致如下, 抽象的来说可以归类为 java -classpath $classpath $mainClazz 

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 com.intellij.rt.execution.CommandLineWrapper /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/idea_classpath880125671 com.hx.test12.Test02WechatJson

然后 $claspathFile 中的内容大致如下 

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/jconsole.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/packager.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/sa-jdi.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar
/Users/jerry/IdeaProjects/HelloWorld/target/classes
/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar
/Users/jerry/.m2/repository/com/hx/HXLog/0.0.2/HXLog-0.0.2.jar
/Users/jerry/.m2/repository/com/hx/HXCommon/0.0.2/HXCommon-0.0.2.jar
/Users/jerry/.m2/repository/com/hx/HXJson/0.0.2/HXJson-0.0.2.jar

 

5. java -jar $shortenJar $mainClazz 

这个就是 idea 提供的缩短 classpath 的方案之一 

idea 生成一个 $classpathJar 里面通过 清单文件 指定了所有的 classpath, 然后搜索 $mainClazz, 调用 main 方法 

 

然后启动的方式大致如下, 抽象的来说可以归类为 java -classpath $classpath $mainClazz 

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/classpath298101813.jar com.hx.test12.Test02WechatJson

$shortenJar 里面仅仅包含一个 清单文件, 里面的 classpath 如下

注意清单文件是有规范的, 比如这里一行多少字符, 换行之后几个空格, 这些都是有约束的 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

6. java -jar $springbootJar

我们做 spring boot 项目, 打包的话 可以直接生成一个可执行的 jar

直接 java -jar $springbootJar 就可以启动服务了, 非常方便 

当然 也是 spring 代理了一次, 后面将执行工作交给了我们的 XXXApplication 

里面的查询 类 spring 自己封装了一套 seach 体系 

 

 

如何更加 轻量级 的发布 java application 

呵呵 这里主要介绍一些 我们平时项目中应该怎么更加轻量级的发布 普通的 java application 

首先 打包只需要打包 我们经常变化的部分 

其他的相对比较固定的依赖 等等, 可以直接上传到服务器 我们通过 classpath 来关联 

 

$classpath 太长的情况我们应该怎么处理?, idea 提供了两种解决方式 

但是 我们这里显然是更加适合 CommandlineRunner 的处理方式, 因此 需要自己吧 CommandlineRunner dump 出来, 可能需要稍微做一些调整, 原有的 CommandlineRunner 在读取了 $classpathFile 之后就删除了该文件, 我们这里 显然是不想删除 $classpathFile 

思路 大体就这些, 接下来 分享一些 发布相关脚本  

 

总体分为三类文件, 一类是 common 脚本, 一类是应用脚本, 一类是 CommandlineRunner 所在的包 

common 这边主要是提供一些公共的服务, 比如 启动, 关闭, 备份 等等 

应用这边主要提供 启动服务, 关闭服务, 备份服务, 重启服务, 发布服务 等等 

CommandlineRunner 主要是提供 shorten $classpath 的服务 

CommandlineRunner 我们这里就不多赘述了, 自己参见 idea 的 CommandlineRunner 即可, 我这里也只是封装了一个 bootstrap/CommandlineRunner.jar 而已 

 

common/backup.sh 


echo " backup start ... "SCRIPT_DIR=$(cd $(dirname $0); pwd)
MY_BASE_DEFAULT=$(cd $SCRIPT_DIR; cd ..; pwd)
PWD=`pwd`
MY_BASE=${MY_BASE-$MY_BASE_DEFAULT}
project=$1
mainClazz=$2echo -e " \
env as follows \n \
SCRIPT_DIR : $SCRIPT_DIR \n pwd : $PWD \n MY_BASE : $MY_BASE \n project : $project \n \
mainClazz : $mainClazz \
"if [ "$project" = "" ]; thenecho " please specify project at \$1 "exit
fi
if [ "$mainClazz" = "" ]; thenecho " please specify main clazz file at \$2 "exit
fiprojectFolder=$MY_BASE/$project
if [ ! -d "$projectFolder" ]; thenecho " project folder $projectFolder does not exists, please check that "exit
fi# do business
curDate=$(date "+%Y-%m-%d")
curTime=$(date "+%H-%M-%S")bakDir="$MY_BASE/bak/$curDate/$project/$curTime"
mkdir -p "$bakDir"echo " backup project $project to $bakDir "# 1. zip dev/bak first, then transfer bak.zip 
zip -r $projectFolder/dev/bak.zip $projectFolder/dev/bak/* 
rm -rf $projectFolder/dev/bak/*
mv $projectFolder/dev/bak.zip $projectFolder/dev/bak/bak.zip
cp -r $projectFolder/dev/bak/* $bakDir/ 2>/dev/null
echo " copied /dev/bak/* in project $project to $bakDir "echo " backup end ... "

 

common/commandLineWrapperStartUp.sh


echo " startup start ... "SCRIPT_DIR=$(cd $(dirname $0); pwd)
MY_BASE_DEFAULT=$(cd $SCRIPT_DIR; cd ..; pwd)
PWD=`pwd`
MY_BASE=${MY_BASE-$MY_BASE_DEFAULT}
project=$1
ideaClasspathFile=$2
mainClazz=$3
mainArgs=$4echo -e " \
env as follows \n \
SCRIPT_DIR : $SCRIPT_DIR \n pwd : $PWD \n MY_BASE : $MY_BASE \n project : $project \n \
ideaClasspathFile : $ideaClasspathFile \n mainClazz : $mainClazz \n mainArgs : $mainArgs \
"if [ "$project" = "" ]; thenecho " please specify project at \$1 "exit
fi
if [ "$ideaClasspathFile" = "" ]; thenecho " please specify idea classpath file at \$2 "exit 
fi
if [ "$mainClazz" = "" ]; thenecho " please specify main clazz file at \$3 "exit
fiprojectFolder=$MY_BASE/$project
ideaClasspathFileFullpath=$MY_BASE/$project/$ideaClasspathFile
if [ ! -d "$projectFolder" ]; thenecho " project folder $projectFolder does not exists, please check that "exit
fi
if [ ! -f "$ideaClasspathFileFullpath" ]; thenecho " idea classpath file $ideaClasspathFileFullpath does not exists, please check that "exit
fiEXISTS_PID=`jps -lvm | grep $mainClazz | grep -v grep | awk '{print $1}'`
if [ "$EXISTS_PID" = "" ]; then
#    nohup java -cp $MY_BASE/common/Bootstrap.jar com.hx.idea.CommandLineWrapper $ideaClasspathFile $mainClazz $mainArgs > ./logs/nohup.log 2>&1 &java -jar /meiya/bootstrap/CommandLineWrapper.jar $ideaClasspathFileFullpath $mainClazz $mainArgs > logs/nohup.log  2>&1 &# tail logsleep 3sEXISTS_PID=`jps -lvm | grep $mainClazz | grep -v grep | awk '{print $1}'`echo " the main class $mainClazz startup succeed, running at $EXISTS_PID "tail -f logs/nohup.log
elseecho " the main class $mainClazz already running at $EXISTS_PID "
fiecho " startup end ... "

 

common/commandLineWrapperShutdown.sh


echo " shutdown start ... "SCRIPT_DIR=$(cd $(dirname $0); pwd)
MY_BASE_DEFAULT=$(cd $SCRIPT_DIR; cd ..; pwd)
PWD=`pwd`
MY_BASE=${MY_BASE-$MY_BASE_DEFAULT}
project=$1
mainClazz=$2echo -e " \
env as follows \n \
SCRIPT_DIR : $SCRIPT_DIR \n pwd : $PWD \n MY_BASE : $MY_BASE \n project : $project \n \
mainClazz : $mainClazz \
"if [ "$project" = "" ]; thenecho " please specify project at \$1 "exit
fi
if [ "$mainClazz" = "" ]; thenecho " please specify main clazz file at \$2 "exit
fiprojectFolder=$MY_BASE/$project
if [ ! -d "$projectFolder" ]; thenecho " project folder $projectFolder does not exists, please check that "exit
fiEXISTS_PID=`jps -lvm | grep $mainClazz | grep -v grep | awk '{print $1}'`
if [ "$EXISTS_PID" = "" ]; thenecho " the main class $mainClazz does not startup "
elsekill -9 $EXISTS_PIDecho " the main class $mainClazz shutdown succeed, kill -9 $EXISTS_PID "
fiecho " shutdown end ... "

 

 

$appHome/startUp.sh 


../common/commandLineWrapperStartUp.sh $APP_NAME ./dev/conf/gen_idea_classpath.txt org.springframework.boot.loader.JarLauncher

 

$appHome/shutdown.sh 


../common/commandLineWrapperShutdown.sh $APP_NAME org.springframework.boot.loader.JarLauncher

 

$appHome/restart.sh 


# 1. shutdown
echo ""
./shutdown.shsleep 3s# 2. startup
echo ""
./startUp.sh

 

$appHome/backup.sh 


bakDir="./dev/bak"
rm -rf $bakDir
mkdir -p $bakDirecho " prepare copy files to /dev/bak "cp *.properties $bakDir/ 2>/dev/null
echo " copied *.properties to $bakDir "
cp *.txt $bakDir/ 2>/dev/null
echo " copied *.txt to $bakDir "
cp *.jar $bakDir/ 2>/dev/null
echo " copied *.jar to $bakDir "
cp *.xml $bakDir/ 2>/dev/null
echo " copied *.xml to $bakDir "
cp *.sh $bakDir/ 2>/dev/null
echo " copied *.sh to $bakDir "cp -r resources $bakDir/ 2>/dev/null
echo " copied /resources to $bakDir "echo " copied files to /dev/bak "
echo ""
../common/backup.sh $APP_NAME org.springframework.boot.loader.JarLauncher

 

$appHome/release.sh 


mainJar="$APP_NAME-0.0.1.jar"
updatedMainJar="$APP_NAME-0.0.1.jar.0"# 0. sanity check
# ifs update for filename with blank
echo ""
SAVED_IFS=$IFS
IFS=$(echo -en "\n\b")if [ ! -f "$updatedMainJar" ]; thenecho " the newMainJar $updatedMainJar does not exists, please check that "exit
fi# 1. backup first
./backup.sh# 2. shutdown
echo ""
./shutdown.sh# 3. release jar
echo ""
rm -rf $mainJar
echo " removed oldMainJar $mainJar "
move $updatedMainJar $mainJar
echo " rebuild $mainJar succeed "sleep 3s# 4. startup
echo ""
./startUp.sh# restore ifs
IFS=$SAVED_IFS

 

新增一个项目, 需要拷贝一套 应用脚本, 然后需要调整一些配置 

        1. startUp.sh 需要调整 $APP_NAME, $classpathFIle, $mainClazz 

        2. shutdown.sh 需要调整 $APP_NAME, $mainClazz 

        3. restart.sh 不需要调整 

        4. backup.sh 需要调整 备份的业务, $APP_NAME, $mainClazz 

        5. release.sh 需要调整 $mainJar, $updatedMainJar, 发布的业务 

 

 

spring boot 的包包括了依赖, 应该怎么 更加轻量级的发布 ? 

这里的思路也很简单, 发布的服务器上面存放一份完整的 $springbootJar 的解压的版本 deflatedJar, 里面包含了 项目的 class, 配置文件, 依赖信息, spring 的代理信息 等等 

然后我们通过 maven 打包 spring boot 项目之后, 清理掉较大的 依赖 这部分 jar, 这时候 整个 jar 包就比较小了 

然后 上传到发布服务器, 然后 解压待发布的 jar, 覆盖 deflatedJar 里面的已有的内容, 然后再重新打 jar 包, 然后替换掉之前的 发布包, 然后启动服务即可 

 

主要是 release.sh 中的 发布的这一部分需要做一些调整 

# 3. release jar
echo ""
rm -rf $mainJar
echo " removed oldMainJar $mainJar "
# unzip -o -d deflatedJar/ $APP_NAME-0.0.1.jar.0
unzip -o -q -d deflatedJar/ $updatedMainJar
echo " deflated lastest jar into defaltedJar/ "
rm -rf $updatedMainJar
echo " removed updatedMainJar $updatedMainJar "
rm -rf deflatedJar/BOOT-INF/classes/application.yml
cp application.yml deflatedJar/BOOT-INF/classes/application.yml
echo " replace application.yml to BOOT-INF/classes/application.yml "
cd deflatedJar
# zip -r -0 ../$APP_NAME-0.0.1.jar .
zip -r -q -0 ../$mainJar .
cd .. 
echo " rebuild $mainJar succeed "

 

 

完 

 

 

 

相关文章:

85 总结一下最近遇到的一些 jar发布 相关的知识

前言 呵呵 最近有一些构建服务, 发布服务的一些需求 我们这里的服务 一般来说是 java application, spring boot application 针对发布, 当然最好是 增量发布, 尽量的减少需要传递给 发布服务器 的资源的大小 比如 我的这个 java application, 可能会存在很多依赖, 常规…...

Vue组件之间的通信方式都有哪些

Vue组件之间的通信方式 组件间通信的概念组件间通信解决了什么组件间通信的分类 父子组件之间的通信兄弟组件之间的通信祖孙与后代组件之间的通信非关系组件间之间的通信 组件间通信的方案 props传递数据$emit 触发自定义事件refEventBusparent、rootattrs与listenersprovide …...

C# 只读文件删除提示失败,给文件修改属性

需求背景:处理文件后,删除源文件信息,但不能确保源文件是只读文件,因此需要修改文件属性 //设置文件属性 string path "文件路径"; File.SetAttributes(path, FileAttributes.Normal); //删除文件 File.Delete(path);参…...

Redis 实际项目中的整合,记录各种用法

Redis缓存餐厅数据 我们来看主要的流程 很简单,就是在数据库和接口之间加了一层缓冲,在redis之前其实还可以加其他的缓存 例如 nginx的缓存 接下来,就是结合我的业务,来做缓存 我这里的业务逻辑是,按了分类的按钮,分别以不同的 分类为一组缓存数据 所以,这里的缓存粒度是分类…...

iOS推送通知

文章目录 一、推送通知的介绍1. 简介2. 通知的分类 二、本地通知1. 本地通知的介绍2. 实现本地通知3. 监听本地通知的点击 三、远程通知1. 什么是远程通知2. 为什么需要远程通知3. 远程通知的原理4. 如何做远程通知5. 远程通知证书配置6. 获取远程推送要用的 DeviceToken7. 测试…...

安全产品与等级保护:匹配与选择指南

基本要求项测评项基本措施对应产品网络架构应保证网络各个部分的带宽满足业务高峰期需要;带宽管理流量控制系统应避免将重要网络区域部署在边界处,重要网络区域与其他网络区域之间应采取可靠的技术隔离手段;网络及安全设备配置访问控制策略防…...

网络分层和网络原理之UDP和TCP

温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本). http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…...

软件包管理:在CentOS 7中部署Tengine

目录 下载: 方法一: 方法二: 部署: 实验操作 下载: 方法一: 1、打开浏览器搜索tengine并点击官网 2、选择需要安装的版本并复制链接链接 标题栏处可以更改为中文界面 下滑选择版本单击下载 在远程连…...

爬取A站视频,涉及m3u8格式的处理

一、抓包分析 1.进入A站进行抓包分析 进入一个页面,右点击鼠标按钮,点击检查 接着点击network,点击Fetxh/XHR,然后刷新网页,得到下面的页面 发现其中有许多d595开头的文件,它们是ts文件,点击其中一个。在…...

《微信小程序开发从入门到实战》学习九十四

7.1 视图容器组件 7.1.4 movable-view和movable-area组件 movable-view是一个可移动的视图容器,它需要与movable-area组件结合使用。movabke-view只能放在movable-area组件中,在movable-area组件的范围内拖曳滑动。 movable-view组件属性如下&#xf…...

深度学习记录--Batch Norm

Batch Norm 与Input Norm对输入层进行归化不同,Batch Norm是对隐藏层进行归化 实现 ,其中、调节均值和方差 ,...

svn和git的本质区别是什么

参考: https://blog.csdn.net/feiying0canglang/article/details/126550676 上边图中,跨越了区的箭头,它中间的区数据都会同步。例如:git checkout ,它是将本地仓库数据更新到暂存区和工作区的。\ 理解 gitlab和svn都…...

Redis面试

1.说说什么事redis Redis是一种基于键值对的NoSql数据库。 Redis中的value支持string(字符串)、hahs(哈希)、list、set、zset(有序集合)、bitmaps(位图),HyperLoglog等数…...

贪吃蛇(C)

游戏背景:贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 总: 游戏设计大纲: 使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇。 实现的基本功能: 1、贪吃蛇地图绘制。 2、蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作)。 …...

【云原生】Docker基于Dockerfile多级构建,实现缩小镜像体积

目录 一、基于上次的nginx的Dockerfile做多级构建 二、基于上次的php的Dockerfile修改做多级构建 三、基于上次的mysql的Dockerfile修改做多级构建 基于以上三个镜像构建 四、镜像体积是不是越小越好?为什么要缩减镜像体积? 五、缩小镜像体积的方法…...

第七十一周周报

学习目标: 一、实验 二、小程序 学习时间: 2024.1.20-2024.1.26 学习产出: 一、小程序 这周花了两天根据陈勇和纪行之的代码优化了小程序的代码 二、实验 根据stylegan2仓库的redeme文件重新跑了stylegan2和diffusion-stylegan2 DV…...

绿色制造的行业标杆OEKO-TEX STeP认证

STeP是“OEKO-TEX国际环保纺织协会”推出的一个独立的第三方认证体系。STeP全称Sustainable Textile & Leather Production(可持续纺织和皮革生产),是面向纺织和皮革供应链中环保且负有社会责任的生产工厂推出的透明认证体系。 STeP认证的…...

第3章:Python 的函数和模块(基于最新版 Python3.12 编写)

文章目录 3.1 函数:编写你的代码乐曲3.1.1 什么是函数?3.1.2 如何定义函数?3.1.3 如何调用函数?3.1.4 函数的返回值3.1.5 函数的文档字符串3.1.6 默认参数值3.1.7 可变数量的参数3.1.8 局部变量和全局变量3.1.9 递归函数 3.2 模块…...

网络安全产品之认识漏洞扫描设备

文章目录 一、什么是漏洞扫描设备二、漏洞扫描设备的主要功能三、漏洞扫描设备的主要技术四、漏洞扫描设备的主要类型五、漏洞扫描设备的使用方式六、漏洞扫描设备如何与其他安全设备联动七、漏洞扫描设备的应用场景 漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在…...

Hadoop增加新节点环境配置(自用)

完成Hadoop集群增添一个新的节点配置(文中命名为)Hadoop106,没有进行继续为该节点分配身份职能的步骤 1.在VMware中安装CentOS 7 新建虚拟机 1.⾸先我们创建⼀个新的虚拟机,也可以点⽂件-新建虚拟机。 2.选择⾃定义&#xff0c…...

Apache Shiro 安全框架

前言 Apache Shiro 是一个强大且容易使用的Java安全矿建,执行身份验证,授权,密码和会话管理。使用Shiro的易于理解的API您可以快速轻松的获得任何应用程序直到大的项目。 一丶什么是Shiro 1.Shiro是什么 Apache Shiro是一个强大且易于使用…...

防火墙的NAT

目录 1. NAT 概念解析 2. 配置NAT策略: 1. NAT 概念解析 静态NAT --- 一对一 动态NAT --- 多对多 NAPT --- 一对多的NAPT --- easy ip --- 多对多的NAPT 服务器映射 源NAT --- 基于源IP地址进行转换。我们之前接过的静态NAT,动态NAT,NAPT都属…...

Java基础进阶03-注解和单元测试

目录 一、注解 1.概述 2.作用 3.自定义注解 (1)格式 (2)使用 (3)练习 4.元注解 (1)概述 (2)常见元注解 (3)Target &#x…...

Mac+Android Studio配置 Flutter环境

Fluttrer中文下载官网 Flutter下载官网 1、环境变量 .zshrc #Flutter export PUB_HOSTED_URL"https://pub.flutter-io.cn" export FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn" export FLUTTER_HOME/Users/leon/Flutter/flutter_3_10_4/f…...

架构整洁之道-设计原则

4 设计原则 通常来说,要想构建一个好的软件系统,应该从写整洁的代码开始做起。这就是SOLID设计原则所要解决的问题。 SOLID原则的主要作用就是告诉我们如何将数据和函数组织成为类,以及如何将这些类链接起来成为程序。请注意,这里…...

数据结构(队列)

一.什么是队列 1.队列定义 队列是一种特殊的线性表,特殊之处在于他只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。和栈一样,队列也是一种操作受限制的线性表。进行插入操作的一端称为队尾,进行删除操作的…...

docker容器启动后修改或添加端口 nacos容器 版本2.x需要额外开放9848、9849

1.输入docker ps -a查看需要修改的容器ID: 记录下、 docker ps -a 2.停止docker systemctl stop docker 3.进入docker 容器文件夹,找到对应容器的位置: docker的默认文件夹应该是/var/lib/docker 如果不是root用户查看的话,可能会出现权限…...

C语言实现归并排序算法(附带源代码)

归并排序 把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。 可从上到下或从下到上进行。 动态效果过程演示: 归并排序(Merge Sort)是一种分治算法,它将一个数组分为两个子数组,分别对这两个…...

考研C语言刷题基础篇之分支循环结构基础(二)

目录 第一题分数求和 第二题:求10 个整数中最大值 第三题:在屏幕上输出9*9乘法口诀表 第四题:写一个代码:打印100~200之间的素数 第五题:求斐波那契数的第N个数 斐波那契数的概念:前两个数相加等于第三…...

Scala基础知识

scala 1、scala简介 ​ scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数式编程。 2、scala解释器 要启动scala解释器,只需要以下几步: 按住windows键 r输入scala即可 在scala命令提示窗口中执行:quit,即可退…...

中国银行建设网站首页/专业seo优化公司

2019独角兽企业重金招聘Python工程师标准>>> 本教程在Ubuntu10.10及11.04测试通过,其它Ubuntu版本仅供参考。 1.在Ubuntu的软件中心的菜单栏中的编辑下面打开软件源-》其他软件-》添加,输入: deb http://ppa.launchpad.net/wine…...

微信开发小程序开发网站建设/网络营销的培训课程

抽时间研究了一下 ExtJS 3.0 内置的图表功能, 感觉还是挺不错的,于是就做了这个类图,有兴趣的可以看一下。 ExtJS 的 SDK 文档这样描述这个包: The Ext.chart package provides the capability to visualize data with flash base…...

手机网站做安卓客户端/互联网销售是做什么的

1:获得.png图片,可以截图获得,千万注意图片不能大于lcd屏幕,最好小点,大了有时显示不了。我几次没有显示就是图片原因。2 使用Linux命令将图片转换为ppm图片:也可以使用logomaker或…...

移动端网站构成要素/重庆森林经典台词图片

本期特别推荐两个优质的开源项目,一个是口吐芬芳助手,另一个是海外爆火产品 Airtable 的开源替代品。什么叫口吐芬芳助手?它能帮助你快速修正你输入错误的命令。除此之外,本文还会推荐 5 个本周获得 Star 最多的开源项目&#xff…...

四川酒店网站建设/google推广妙招

在前面的文章中,我们了解CoreData据是什么。本文我们将深入到Core Data框架的内部,掌握一下Core Data Stack的重要组成部分 managed object modelmanaged object contextpersistent store coordinatorJietu20200407-1932362x.jpg文章推荐 SwiftUI CoreD…...

网站备案号 脱离服务商/免费seo在线优化

参考 PATH变量 win系统从左至右在PATH(;分隔)中寻找对应命令 运行java可执行文件不需要输入全路径,即JDK的bin目录下存放可执行命令 win下一般在PATH中添加%JAVA_HOME%\bin,并另外设置一个JAVA_HOME环境变量,值为JDK路径,此后…...