Jenkins教程(自動化部署)

Jenkins教程(自動化部署)

1. Jenkins是什么?

Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具,廣泛用于項目開發,具有自動化構建、測試和部署等功能。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中運行,也可獨立運行。通常與版本管理工具(SCM)、構建工具結合使用。

2.?什么是持續集成(CICD)

因為開發部門同時維護多個版本,多個版本的發布,測試需要大量人力,所以要有一個專業的持續集成工具來管理持續重復的工作。

個人理解,說白了就是把代碼測試、打包、發布等工作交給一些工具來自動完成。這樣可以提高效率,減少失誤,開發人員只需要關心開發和提交代碼到Git就可以了。

3. Jenkins的安裝

夸克網盤分享夸克網盤是夸克推出的一款云服務產品,功能包括云存儲、高清看劇、文件在線解壓、PDF一鍵轉換等。通過夸克網盤可隨時隨地管理和使用照片、文檔、手機資料,目前支持Android、iOS、PC、iPad。https://pan.quark.cn/s/631fd86feeda

夸克網盤分享:https://pan.quark.cn/s/631fd86feeda

鏈接里包含jenkins.war? maven? jdk17? ? ?jenkins-start.sh簡易shell命令

maven正常解壓配置環境變量 ,記得修改maven目錄里config的settings.xml配置

jdk如果系統jdk就為17? 可以不用下載,不是的話就將jdk壓縮包解壓,將Jenkins-start.sh里面的java路徑換成所解壓的文件夾就行? ? ? ?

(1)準備條件

安裝JDK

下載JDK壓縮包,并上傳至Linux某個目錄下解壓。

. 配置jdk的環境變量

#進入/etc/profile配置文件
vim /etc/profile

. 將以下代碼填入到profile文件內底

export JAVA_HOME=/usr/wubin/jdk11
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

. 使配置生效

source /etc/profile

. 檢測java環境信息

javac

輸入javac后出現以下信息則安裝jdk成功!

ps:jenkins不同版本對jdk版本有不同要求,如果系統里面是jdk8,但是想在不升級jdk版本情況下使用更高版本的jenkins(比如要求jdk17),也可直接在jenkins啟動時指定jdk路徑,就不用修改系統里配置的jdk版本

(2)安裝Jenkins

1. 下載jenkins

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war 

2. 啟動jenkins

# 使用nohup命令啟動 nohup 當虛擬機黑屏時 也會運行 日志—>輸出到jenkins.log & 后臺運行

nohup java -jar /usr/wubin/jenkins.war  --httpPort=8777 --httpsPort=8778 > /usr/wubin/jenkins.log 2>&1 &

3. 使用tail命令查看啟動日志,日志中會輸出jenkins密碼

4. 通過瀏覽器訪問jenkins(端口號必須為8777)

http://你的ip:8777

點擊安裝推薦的插件

(3)Jenkins中配置JDK路徑

jenkins-》全局工具配置-》JDK-》新增JDK

(4)Jenkins忘記密碼的解決方案

4. 集成Git

為了Jenkins能夠拉取代碼,需要安裝Git環境和jenkins對應的Git插件

(1) CentOS 7 上安裝Git環境

# 安裝
$ yum install git -y
# 查看版本
$ git --version

復制

(2) Jenkins安裝Git插件

(3) Jenkins配置Git環境

此處無需在jenkins中配置Git環境,采用默認生成的即可

(4) Gitee上任意建一個倉庫

(5) 測試憑據是否能夠使用

jenkins-》新建任務-》自由風格項目

進入jenkins的工作空間查看文件是否拉取下來,所有拉取的文件都會存放在jenkins工作空間中

到這一步用戶名和密碼方式的憑證已經打通Git

5. 憑證配置

憑據就是用來存儲需要密文保護的數據庫密碼、Gitee密碼信息、Docker私有倉庫密碼等,以便 Jenkins可以和這些第三方的應用進行交互。

1. 憑證插件安裝Credentials Binding

該插件默認在一開始就會被安裝,安裝后在jenkins-》系統管理-》安全欄目會出現Manage Credentials選項,若沒有需要安裝插件并重啟。

6. Maven集成

jenkins上發布Java項目時需要使用Maven來進行構建打包(Gradle項目則需要安裝配置Gradle)

回到頂部

(1) 下載安裝

# 找一個目錄存放maven
cd /usr/wubin/# 從阿里云上下載maven安裝包
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz# 解壓
tar -zxvf apache-maven-3.6.3-bin.tar.gz# 當前maven的安裝目錄為:
/usr/wubin/
apache-maven-3.6.3

回到頂部

(2) 環境配置

vi /etc/profile在最后面JDK配置上作出一些更改
export MAVEN_HOME=
/usr/wubin/
apache-maven-3.6.3
 export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

復制

回到頂部

(3) 使配置生效并查看安裝情況

source /etc/profile
mvn -version

回到頂部

(4) Jenkins配置Maven

(5) 安裝Maven插件

(6) 在/data/software目錄下新建一個repository文件夾,用來作為maven的倉庫

$ cd /usr/wubin
$ mkdir repository

復制

(7) 使用root賬戶修改Maven的settings.xml文件(指定倉庫目錄和阿里云鏡像)

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><!--本地倉庫-->          <localRepository>/data/software/repository</localRepository><mirrors><!--阿里云鏡像--><mirror><id>aliyun-maven</id><mirrorOf>central</mirrorOf><name>aliyun maven mirror</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url></mirror></mirrors>......
</settings>

(8) Maven測試項目構建

接下來的步驟是將java項目傳到Gitee上供jenkins拉取打包,如果運維同學不懂Java代碼,可以直接將我的Git項目fork或采用gitlab 等其他方式進行拉取。

新建Maven項目

在碼云上建一個同名的git項目

使用Git上傳到碼云

使用git bash命令將項目初始化,無論是傳到Gitee、GitHub、GitLab、Codeup步驟一樣,如果對Git的安裝部署不熟悉

# 進入到本地的項目文件夾
$ cd existing_folder
# 初始化倉庫
$ git init# 添加文件至工作區并提交
$ git add .
$ git commit -m "first commit"# 關聯Gitee遠程倉庫
$ git remote add origin https://gitee.com/nobug8/it235-jenkins-jar.git# 將本地倉庫推送到遠程倉庫的master分支,此處會彈出用戶名密碼交互
$ git push -u origin master## 如果push報錯可以先拉取一下,會有新的gitee生成的文件拉下來,然后重新添加提交并push
$ git pull origin master --allow-unrelated-histories
$ git add .
$ git commit -m "拉取下來合并后再次提交"
$ git push -u origin master

復制

(9) Jenkins添加Maven項目任務

①. 新建任務

②. 編寫Maven編譯命令

③. 構建并查看控制臺日志

保存后,點擊立即構建,然后進入日志控制臺查看日志

從日志可以看到代碼已經在拉取了,而且走的事阿里云倉庫,第一次拉取過程會比較長。

通過查看/data/software/repository可以看到有存放拉取的jar包,通過這2個證據可以證明settings.xml文件配置成功且有效

ps:如果使用git賬號密碼拉取代碼即使權限都已經給夠了還是出現403等等一些問題,可以考慮使用ApiToken方式拉去代碼,在git/gitlab創建apiToken,在憑證管理地方加上憑證

構建成功后查看jenkinsworkspace目錄下的jar包

到此Maven集成完畢

配置Post Steps,選中執行shell

7. 配置SSH免密登錄

由于jenkins構建消耗內存極大,一般jenkins是一臺單獨的工具機器,Java項目一般在其他的機器上,這里我重新安裝一臺虛擬機

應用服務器信息

  • IP:192.168.223.129
  • JDK:1.8
  • user:root
  • 部署路徑:/data/app/my-boot
  • 端口:9010

免密登錄主要是方便jenkins服務器192.168.223.128的root用戶—》應用服務器192.168.223.129的root用戶上的jar包拷貝,部署本就是jar包拷貝的過程

在192.168.223.128機器上使用root用戶生成秘鑰注意此處是root用戶

$ ssh-keygen -t rsa
# 3次回車

復制

運行后會在當前用戶的根目錄生成一個.ssh文件夾

ssh文件夾中的文件描述

  • id_rsa?: 生成的私鑰文件
  • id_rsa.pub?: 生成的公鑰文件

接下來需要將公鑰導入到認證文件中

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

復制

如果希望ssh公鑰生效需滿足至少下面兩個條件:

  • .ssh目錄的權限必須是700
  • .ssh/authorized_keys文件權限必須是600

給對應文件授權

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

復制

authorized_keys文件拷貝到另一臺應用服務器的root用戶.ssh目錄下

# 在應用服務器(192.168.223.129)上用root用戶創建/root/.ssh文件夾  mkdir -p /root/.ssh# 在jenkins服務器(192.168.223.128)上將pub公鑰文件拷貝到應用服務器的.ssh目錄下scp -p ~/.ssh/id_rsa.pub root@192.168.223.129:/root/.ssh/authorized_keys

復制

在jenkins192.168.223.128服務器上進行免密連接測試

# 在jenkins服務器的/root/目錄下創建filetest文件,并拷貝到應用服務器
$ cd ~/
$ touch filetest
$ scp -p filetest root@192.168.223.129:/root/filetest
# 進入到應用服務器(192.168.223.129),檢查/root目錄下是否出現filetest# 在jenkins服務器上使用ssh進行免密連接測試,成功后會出現Last Login的提示
$ ssh root@192.168.223.129
Last login: Sun Sep 20 21:53:03 2020
$ exit

復制

到此免密登錄和拷貝實現成功,為接下來jar包部署提供了快捷的幫助

8. 編寫Jenkins發布腳本

注意下面代碼第6行代碼server_ips=”需要部署到的機器ip”

#!/bin/bashecho "部署的目錄和項目名稱"
DIR="/data/app"
projectName="my-boot"echo "待部署的應用服務器,可多臺"
server_ips="192.168.223.139"
for server_ip in ${server_ips[@]}
doecho "ssh連接進行備份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
mkdir -p $DIR/${projectName}
if [ -f "$DIR/${projectName}/${projectName}.jar" ];thenmv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar 
fi
EOFecho "拷貝jar包到目標服務器的tmp目錄"
scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jarecho "ssh遠程連接進行發布操作"
ssh -q -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jarEOFdoneecho "success"

最新腳本,以端口kill進程

#!/bin/bash# 配置變量
LOG_FILE="/home/xxx/.jenkins/workspace/whale-mgnt-service/startup.log"
JAR_PATH="/home/xxx/.jenkins/workspace/whale-mgnt-service/whale-mgnt-service/target/whale-mgnt-service.jar"
APP_PORT=8081
MAX_ATTEMPTS=60
INTERVAL=5# 清空之前的日志
echo "" > $LOG_FILE# 使用多種方式查找和終止進程
kill_process_by_port() {local port=$1echo "Checking for processes using port $port..."# 方法1: 使用netstat查找local pid=$(sudo netstat -tlnp | grep ":${port}" | awk '{print $7}' | cut -d'/' -f1)# 方法2: 如果方法1失敗,使用另一種方式if [ -z "$pid" ]; thenpid=$(sudo ss -tlnp | grep ":${port}" | awk '{print $6}' | cut -d',' -f2 | cut -d'=' -f2)fi# 方法3: 如果還是失敗,嘗試使用 ps 和 grepif [ -z "$pid" ]; thenpid=$(ps aux | grep "whale-mgnt-service" | grep -v grep | awk '{print $2}')fiif [ ! -z "$pid" ]; thenecho "Found process(es) with PID: $pid"for single_pid in $pid; doecho "Stopping process $single_pid"sudo kill -15 $single_pid 2>/dev/null || truesleep 3if ps -p $single_pid > /dev/null 2>&1; thenecho "Force killing process $single_pid"sudo kill -9 $single_pid 2>/dev/null || truesleep 2fidoneelseecho "No process ID found, trying alternative methods..."# 嘗試直接通過應用名稱終止sudo pkill -f "whale-service" || truefi# 等待端口釋放sleep 5# 檢查端口是否已釋放if sudo netstat -tlnp | grep ":${port}" > /dev/null; thenecho "Warning: Port $port is still in use"return 1fiecho "Port $port is now available"return 0
}# 確保端口可用
echo "Ensuring port $APP_PORT is available..."
for i in {1..3}; doecho "Attempt $i to free port $APP_PORT"kill_process_by_port $APP_PORTif ! sudo netstat -tlnp | grep ":${APP_PORT}" > /dev/null; thenecho "Port successfully freed"breakfiecho "Current processes using port $APP_PORT:"sudo netstat -tlnp | grep ":${APP_PORT}"sleep 5
done# 最終檢查端口
if sudo netstat -tlnp | grep ":${APP_PORT}" > /dev/null; thenecho "Failed to free port $APP_PORT after multiple attempts"echo "Current processes using port $APP_PORT:"sudo netstat -tlnp | grep ":${APP_PORT}"# 最后的緊急措施echo "Attempting emergency measures..."sudo fuser -k ${APP_PORT}/tcp 2>/dev/null || truesudo pkill -9 -f "whale-mgnt-service" 2>/dev/null || truesleep 5if sudo netstat -tlnp | grep ":${APP_PORT}" > /dev/null; thenecho "All attempts to free port failed. Please check manually."exit 1fi
fi# 啟動服務
echo "Starting service..."
sudo nohup java -jar \-Xms256m \-Xmx512m \-XX:MaxMetaspaceSize=256m \-XX:+HeapDumpOnOutOfMemoryError \-XX:HeapDumpPath=/tmp/ \-XX:+UseG1GC \-XX:MaxGCPauseMillis=200 \$JAR_PATH \--spring.profiles.active=test \--server.port=$APP_PORT \--spring.jpa.open-in-view=false \--server.tomcat.max-threads=50 \--server.tomcat.min-spare-threads=20 \--spring.task.execution.pool.core-size=5 \--spring.task.execution.pool.max-size=10 \--spring.task.execution.pool.queue-capacity=100 \> $LOG_FILE 2>&1 &PID=$!echo "Starting service with PID: $PID"
echo "Waiting for service to start..."# 給予初始化時間
sleep 15attempt=1
while [ $attempt -le $MAX_ATTEMPTS ]; do# 檢查進程是否存在if ! ps -p $PID > /dev/null; thenecho "Process died unexpectedly. Check logs:"tail -n 50 $LOG_FILEexit 1fi# 檢查端口和應用狀態if netstat -tunlp 2>/dev/null | grep ":$APP_PORT" > /dev/null; thenif grep -q "Started WhaleManagementApplication" $LOG_FILE; thenecho "Application started successfully"sleep 5if ps -p $PID > /dev/null; thenecho "Service is running stably"echo "Final memory usage:"free -mecho "Process memory usage:"ps -o pid,ppid,%mem,rss,command -p $PIDexit 0elseecho "Process died after startup"tail -n 50 $LOG_FILEexit 1fififiecho "Attempt $attempt of $MAX_ATTEMPTS - Service still starting..."# 檢查啟動日志中的錯誤if grep -q "Port $APP_PORT was already in use" $LOG_FILE; thenecho "Port conflict detected!"echo "Current port status:"sudo netstat -tunlp | grep ":$APP_PORT"[ -n "$PID" ] && kill -9 $PID 2>/dev/null || trueexit 1fiecho "Recent log entries:"tail -n 10 $LOG_FILEsleep $INTERVALattempt=$((attempt+1))
doneecho "Service failed to start within timeout. Last 50 lines of log:"
tail -n 50 $LOG_FILE
[ -n "$PID" ] && kill -9 $PID 2>/dev/null || true
exit 1

9. 編寫應用啟動腳本

/data/app/my-boot目錄下創建啟動腳本start.sh

$ touch start.sh
$ vi start.sh
# 將下面代碼粘貼到start.sh中
#!/bin/bash
set -e #任何命令出錯就退出
set -o pipefailAPP_ID=my-boot
APP_DIR="/data/app"nohup java -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log &
start_ok=false
if [[ $? = 0 ]];thensleep 3tail -n 10 release_out.logsleep 5tail -n 50 release_out.log
fi
aaa=`grep "Started" release_out.log | awk '{print $1}'`
if [[ -n "${aaa}" ]];thenecho "Application started ok"exit 0
elseecho "Application started error"exit 1
fi

/data/app/my-boot目錄下創建停止腳本stop.sh

$ touch stop.sh
$ vi stop.sh
# 將下面代碼粘貼到stop.sh中
#!/bin/bashAPP_ID=my-boot
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh

并進行啟動和停止測試,查看日志輸出是否正常

將下述啟動代碼配置jenkins

sh $DIR/${projectName}/stop.sh
sh $DIR/${projectName}/start.sh

訪問并測試代碼是否生效

如果是虛擬機則需要給防火墻添加9010端口

$ su root
# 開啟防火墻9010端口
$ firewall-cmd --zone=public --add-port=9010/tcp --permanent
# 使配置生效
$ firewall-cmd --reload

修改代碼返回值,提交至Gitee,并再次進行構建發布,訪問http://192.168.223.129:9010查看結果是否更新

PS:異常修復? ?如出現jenkins內存占用異常,重啟等方法都不能解決時? 創建一個新的jenkins_home

mkdir -p /mnt/data/jenkins_home_bak/secrets /mnt/data/jenkins_home_bak/users /mnt/data/jenkins_home_bak/jobscp -a jobs users credentials.xml config.xml plugins tools /mnt/data/jenkins_home_bak/
cp -a secrets/hudson.util.Secret /mnt/data/jenkins_home_bak/secrets/
cp -a jenkins.model.*.xml hudson.tasks.*.xml /mnt/data/jenkins_home_bak/
cp -a hudson.plugins.git.GitTool.xml /mnt/data/jenkins_home_bak/
cp -a io.jenkins.plugins.gitlabserverconfig.servers.GitLabServers.xml /mnt/data/jenkins_home_bak/
cp -a jenkins.plugins.nodejs.tools.NodeJSInstallation.xml /mnt/data/jenkins_home_bak/
cp -a hudson.plugins.gradle.Gradle.xml /mnt/data/jenkins_home_bak/cp /mnt/data/jenkins_home/jenkins.install.InstallUtil.lastExecVersion /mnt/data/jenkins_home_bak/
cp /mnt/data/jenkins_home/jenkins.install.UpgradeWizard.state /mnt/data/jenkins_home_bak/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux 驅動驗證是否成功 之 查看moudle信息

這些是 Linux 內核模塊&#xff08;.ko&#xff09;中的元信息&#xff08;metadata&#xff09;&#xff0c;可以通過如下方式查看&#xff1a;? 1. 使用 modinfo 命令查看已加載或已編譯模塊信息 示例&#xff1a; modinfo aw2013.ko輸出內容大概如下&#xff1a; filename:…

瀏覽器關閉之前請求接口到后端

2025.07.24今天我學習了如何在瀏覽器關閉之前請求一個接口返回到后端。可以用performance.navigation判斷是瀏覽器關閉&#xff0c;還是瀏覽器刷新&#xff0c;因為我這邊只需要瀏覽器關閉的時候才去觸發1. 利用performance API&#xff08;刷新檢測&#xff09; 刷新頁面時&am…

MySQL批量數據處理與事務管理

MySQL是一種廣泛應用的關系型數據庫管理系統&#xff0c;尤其在數據分析和業務邏輯處理方面具有重要地位。在數據量龐大的業務場景中&#xff0c;批量數據處理和事務管理是提高效率和保障數據一致性的重要手段。掌握高效的批量數據操作方法與事務管理技巧&#xff0c;不僅能夠提…

iOS網絡之異步加載

為什么你的圖片要異步加載&#xff1f;在仿寫天氣預報時&#xff0c;我們常常需要從網絡加載天氣圖標&#xff0c;例如顯示某個小時的天氣狀態圖標。這看似簡單的事情&#xff0c;如果處理不當&#xff0c;卻很容易造成界面卡頓&#xff0c;甚至影響整個 App 的用戶體驗。錯誤做…

C#值類型屬性的典型問題

問題復現&#xff1a;值類型屬性的副本問題以下代碼展示了值類型屬性的典型問題&#xff1a;struct Point {public int X;public int Y; }class MyClass {public Point Position {get; set;} }// 使用屬性修改結構體&#xff08;無效&#xff01;&#xff09; var obj new MyC…

機器學習基礎-k 近鄰算法(從辨別水果開始)

一、生活中的 "分類難題" 與 k 近鄰的靈感 你有沒有這樣的經歷&#xff1a;在超市看到一種從沒見過的水果&#xff0c;表皮黃黃的&#xff0c;拳頭大小&#xff0c;形狀圓滾滾。正當你猶豫要不要買時&#xff0c;突然想起外婆家的橘子好像就是這個樣子 —— 黃色、圓…

【WPF】NumericUpDown的用法

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;NumericUpDown 控件并不是內置的標準控件之一&#xff0c;但它是一個非常常用的控件&#xff0c;用于讓用戶輸入一個數值&#xff08;整數或浮點數&#xff09;&#xff0c;并提供上下箭頭來遞增或…

Kotlin位運算

Kotlin 提供了幾種用于操作整數各個位&#xff08;bit&#xff09; 的運算符。這些操作是由處理器直接支持的&#xff0c;速度快且操作簡單。在底層編程中非常重要&#xff0c;比如設備驅動、低級圖形處理、網絡通信、加密和壓縮等。 盡管計算機通常都有高效的硬件指令來執行算…

墨者:通過手工解決SQL手工注入漏洞測試(MongoDB數據庫)

一、SQL手工注入漏洞測試(MongoDB數據庫) 本文以墨者學院靶場為例&#xff0c;演示MongoDB數據庫的手工SQL注入全過程。靶場以自己的地址為準&#xff1a;http://124.70.71.251:42286/new_list.php?id1 二、注入原理說明 MongoDB作為NoSQL數據庫&#xff0c;其注入方式與傳…

Kafka——CommitFailedException異常處理深度解析

引言在分布式消息系統Kafka的生態中&#xff0c;消費者組&#xff08;Consumer Group&#xff09;機制是實現高吞吐量和負載均衡的核心設計。然而&#xff0c;消費過程中位移提交&#xff08;Offset Commit&#xff09;的穩定性始終是開發者面臨的最大挑戰之一。當消費者嘗試提…

kafka的部署和jmeter連接kafka

zookeeper的安裝 kafka依賴Zookeeper所以要先安裝Zookeeper kafka的安裝文章引用來源:Kafka下載和使用&#xff08;linux版&#xff09;-CSDN博客 通過wget命令安裝 # 安裝wget https://downloads.apache.org/zookeeper/stable/apache-zookeeper-3.7.1-bin.tar.gz# 解壓tar…

Android UI 組件系列(八):ListView 基礎用法與適配器詳解

博客專欄&#xff1a;Android初級入門UI組件與布局 源碼&#xff1a;通過網盤分享的文件&#xff1a;Android入門布局及UI相關案例 鏈接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd4k9n 提取碼: 4k9n 一、引言 在上一篇文章《Android UI 組件系列&#xff08;…

Android學習專題目錄(持續更新)

1.Android 調試 1.1&#xff1a;Logcat日志分析 2.Android編譯 2.1&#xff1a;android編譯過程中的mk文件和bp文件的掃描機制 2.2&#xff1a;Android 構建系統中常見的 .mk 文件及其作用 2.3&#xff1a;Android構建系統中的mk文件語法函數 2.4&#xff1a;安卓中定…

c#Lambda 表達式與事件核心知識點整理

一、Lambda 表達式1. 概念 Lambda 表達式是一種匿名函數&#xff08;無名稱的函數&#xff09;&#xff0c;簡化了委托和匿名方法的寫法&#xff0c;格式為&#xff1a; (參數列表) > 表達式或語句塊 它可以作為參數傳遞&#xff0c;或賦值給委托類型變量。2. 基本語法與簡寫…

Springboot+Layui英語單詞學習系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBootLayUI框架持久層框架MyBaits成功系統案例&#xff1a;參考代碼數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸…

主要分布于內側內嗅皮層的層Ⅲ的邊界向量細胞(BVCs)對NLP中的深層語義分析的積極影響和啟示

邊界向量細胞&#xff08;Boundary Vector Cells, BVCs&#xff09;主要分布于內側內嗅皮層&#xff08;MEC&#xff09;層Ⅲ&#xff0c;通過編碼環境邊界&#xff08;如墻壁、障礙物&#xff09;的距離和方向信息&#xff0c;為空間導航提供幾何參考框架。這一神經機制對自然…

Selenium是解決了什么問題的技術?

Selenium 是一種用于自動化瀏覽器操作的技術&#xff0c;主要解決了以下問題&#xff1a;1. 自動化測試 Selenium 最初是為了解決 Web 應用程序的自動化測試 問題而設計的。它可以幫助開發者和測試人員&#xff1a; 模擬用戶操作&#xff1a;如點擊按鈕、填寫表單、選擇下拉菜單…

JavaSE知識點(2)

目錄 訪問修飾符的區別 this關鍵字的作用 抽象類和接口有什么區別 抽象類可以定義構造方法嗎 但是接口不可以定義構造方法 Java支持多繼承嗎 接口可以多繼承嗎 繼承和抽象的區別&#xff1f; 抽象類和普通類的區別 成員變量和局部變量的區別&#xff1f; staic關鍵字…

(實用教程)Linux操作系統(二)

centos配置靜態ip 注意&#xff1a; 1.系統中的網關要與虛擬機編輯器中的網關保持一致 2.如果配置虛擬機編輯器后發現ping不通外網的時候&#xff0c;就要還原默認設置再進行配置 總結&#xff1a; 虛擬機編輯器需要配置ip&#xff0c;網關&#xff0c;其中ip網段以及最后一…

ThinkPHP8集成RabbitMQ的完整案例實現

ThinkPHP8集成RabbitMQ的完整案例實現一、安裝依賴&#xff1a;需通過Composer安裝php-amqplib庫?二、配置RabbitMQ三、生產者1、發送一個郵件&#xff0c;將任務發送到RabbitMQ隊列中。2、運行結果展示四、啟動消費者&#xff1a;命令行執行php think rabbitmq:consumer1&…