Jenkins(超详细的Docker安装Jenkins教程!!!)

Jenkins

Jenkins,原名 Hudson,2011 年改为现在的名字。它是一个开源的实现持续集成的软件工具。

官方网站:https://www.jenkins.io/

中文文档:https://www.jenkins.io/zh/

为什么需要Jenkins?

我们以前写完代码,如果要将项目部署到服务器中,那么我们需要经过一系列的更改、打包、上传等繁杂的操作。这些操作很浪费我们的时间,并且基本没什么技术含量。那么jenkins应运而生。jenkins只需要我们将写好的项目上传到我们的代码管理仓库中,例如gitlab,然后jenkins会自动进行拉取,打包,上传一系列操作,这样就让我们的工作量大大减少,我们只需要专注于业务的操作即可

什么是CI/CD?

CI、CD 其实是三个概念,包含了一个 CI 和两个 CD,CI全称 Continuous Integration,表示持续集成,CD包含 Continuous Delivery和 Continuous Deployment,分别是持续交付和持续部署。这三个概念之间是有前后依赖关系的。
CI/CD 并不是一个工具,它是一种软件开发实践,核心是通过引入自动化的手段来提高软件交付效率。CI/CD 最终目的:让工程师更快 & 更高质量 & 更简单的交付软件!

具体大家可以看这篇文章:什么是 CI/CD ?

安装Jenkins

环境需要:Linux虚拟机硬盘20G,内存4G以上

安装JDK

官网下载地址:https://www.oracle.com/cn/java/technologies/javase/javase8u211-later-archive-downloads.html

现在下载java8JDK需要注册Oracle账户,下载即可,或者联系博主可以给安装包

我们Linux下记得一定要下载类似这样的包:jdk-8u261-linux-x64.tar.gz

  1. 将下载好的tar包上传到Linux中/usr/java目录中,如果没有java文件夹,请创建一个

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 使用解压命令解压我们的tar包

    tar -zxvf jdk-8u261-linux-x64.tar.gz
    
  3. 创建一个挂载目录,用于存放jenkins数据

    //创建目录
    mkdir -p /usr/docker/jenkins_data
    
    mkdir /var/jenkins_home
    //授权权限
    chmod 777 jenkins_home
    
  4. 将我们刚才解压的jdk移动到jenkins_home目录下并且改一个比较简短的名字(也可以不改)

    mv /usr/java/jdk1.8.261 /var/jenkins_home/jdk1.8
    
  5. 配置JAVA_HOME环境变量

    // 打开profile文件
    vim /etc/profile
    
    // 配置java环境
    JAVA_HOME=/var/jenkins_home/jdk1.8
    CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    PATH=$JAVA_HOME/bin:$PATH
    export JAVA_HOME CLASSPATH PATH
    :wq保存退出
    // 使用更新配置文件
    source /etc/profile
    
  6. 执行java -version命令,出现以下内容即成功

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安装Maven

下载官网:https://maven.apache.org/download.cgi

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 将下载后的tar包一样上传到我们的Linux的/usr/local/中,这块的目录大家可以自己定,也可以为了省事和博主一样

  2. 解压我们的tar

    tar -zxvf apache-maven-3.9.6-bin.tar.gz
    
  3. 将解压后的文件夹移到jenkins_home目录下并且改一个比较简短的名字(也可以不改)

    mv /usr/local/apache-maven-3.9.6 /var/jenkins_home/apache-maven-3.9.6
    
    1. 进入到/var/jenkins_home/apache-maven-3.9.6/conf中找到settings.xml文件,将镜像源换成国内的,这是为了保证我们拉取依赖的速度

      <?xml version="1.0" encoding="UTF-8"?>
      
      <!--
      Licensed to the Apache Software Foundation (ASF) under one
      or more contributor license agreements.  See the NOTICE file
      distributed with this work for additional information
      regarding copyright ownership.  The ASF licenses this file
      to you under the Apache License, Version 2.0 (the
      "License"); you may not use this file except in compliance
      with the License.  You may obtain a copy of the License at
      
          http://www.apache.org/licenses/LICENSE-2.0
      
      Unless required by applicable law or agreed to in writing,
      software distributed under the License is distributed on an
      "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
      KIND, either express or implied.  See the License for the
      specific language governing permissions and limitations
      under the License.
      -->
      
      <!--
       | This is the configuration file for Maven. It can be specified at two levels:
       |
       |  1. User Level. This settings.xml file provides configuration for a single user,
       |                 and is normally provided in ${user.home}/.m2/settings.xml.
       |
       |                 NOTE: This location can be overridden with the CLI option:
       |
       |                 -s /path/to/user/settings.xml
       |
       |  2. Global Level. This settings.xml file provides configuration for all Maven
       |                 users on a machine (assuming they're all using the same Maven
       |                 installation). It's normally provided in
       |                 ${maven.conf}/settings.xml.
       |
       |                 NOTE: This location can be overridden with the CLI option:
       |
       |                 -gs /path/to/global/settings.xml
       |
       | The sections in this sample file are intended to give you a running start at
       | getting the most out of your Maven installation. Where appropriate, the default
       | values (values used when the setting is not specified) are provided.
       |
       |-->
      <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
         | The path to the local repository maven will use to store artifacts.
         |
         | Default: ${user.home}/.m2/repository
        <localRepository>/path/to/local/repo</localRepository>
        -->
        <localRepository>${user.home}/.m2/repository</localRepository>
        <!-- interactiveMode
         | This will determine whether maven prompts you when it needs input. If set to false,
         | maven will use a sensible default value, perhaps based on some other setting, for
         | the parameter in question.
         |
         | Default: true
        <interactiveMode>true</interactiveMode>
        -->
      
        <!-- offline
         | Determines whether maven should attempt to connect to the network when executing a build.
         | This will have an effect on artifact downloads, artifact deployment, and others.
         |
         | Default: false
        <offline>false</offline>
        -->
      
        <!-- pluginGroups
         | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
         | when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
         | "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
         |-->
        <pluginGroups>
          <!-- pluginGroup
           | Specifies a further group identifier to use for plugin lookup.
          <pluginGroup>com.your.plugins</pluginGroup>
          -->
          <pluginGroup>org.mortbay.jetty</pluginGroup>
        </pluginGroups>
      
        <!-- proxies
         | This is a list of proxies which can be used on this machine to connect to the network.
         | Unless otherwise specified (by system property or command-line switch), the first proxy
         | specification in this list marked as active will be used.
         |-->
        <proxies>
          <!-- proxy
           | Specification for one proxy, to be used in connecting to the network.
           |
          <proxy>
            <id>optional</id>
            <active>true</active>
            <protocol>http</protocol>
            <username>proxyuser</username>
            <password>proxypass</password>
            <host>proxy.host.net</host>
            <port>80</port>
            <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
          </proxy>
          -->
        </proxies>
      
        <!-- servers
         | This is a list of authentication profiles, keyed by the server-id used within the system.
         | Authentication profiles can be used whenever maven must make a connection to a remote server.
         |-->
        <servers>
          <!-- server
           | Specifies the authentication information to use when connecting to a particular server, identified by
           | a unique name within the system (referred to by the 'id' attribute below).
           | 
           | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are 
           |       used together.
           |
          <server>
            <id>deploymentRepo</id>
            <username>repouser</username>
            <password>repopwd</password>
          </server>
          -->
          
          <!-- Another sample, using keys to authenticate.
          <server>
            <id>siteServer</id>
            <privateKey>/path/to/private/key</privateKey>
            <passphrase>optional; leave empty if not used.</passphrase>
          </server>
          -->
          <server>
              <id>releases</id>
              <username>ali</username>
              <password>ali</password>
            </server>
            <server>
              <id>Snapshots</id>
              <username>ali</username>
              <password>ali</password>
            </server>
        </servers>
      
        <!-- mirrors
         | This is a list of mirrors to be used in downloading artifacts from remote repositories.
         |
         | It works like this: a POM may declare a repository to use in resolving certain artifacts.
         | However, this repository may have problems with heavy traffic at times, so people have mirrored
         | it to several places.
         |
         | That repository definition will have a unique id, so we can create a mirror reference for that
         | repository, to be used as an alternate download site. The mirror site will be the preferred
         | server for that repository.
         |-->
        <mirrors>
          <!-- mirror
           | Specifies a repository mirror site to use instead of a given repository. The repository that
           | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
           | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
           |
          <mirror>
            <id>mirrorId</id>
            <mirrorOf>repositoryId</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://my.repository.com/repo/path</url>
          </mirror>
           -->
          <mirror>
            <!--This sends everything else to /public -->
            <id>nexus</id>
            <mirrorOf>*</mirrorOf> 
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          </mirror>
          <mirror>
            <!--This is used to direct the public snapshots repo in the 
                profile below over to a different nexus group -->
            <id>nexus-public-snapshots</id>
            <mirrorOf>public-snapshots</mirrorOf> 
            <url>http://maven.aliyun.com/nexus/content/repositories/snapshots/</url>
          </mirror>
          <mirror>
            <!--This is used to direct the public snapshots repo in the 
                profile below over to a different nexus group -->
            <id>nexus-public-snapshots1</id>
            <mirrorOf>public-snapshots1</mirrorOf> 
            <url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
          </mirror>
        </mirrors>
      
        <!-- profiles
         | This is a list of profiles which can be activated in a variety of ways, and which can modify
         | the build process. Profiles provided in the settings.xml are intended to provide local machine-
         | specific paths and repository locations which allow the build to work in the local environment.
         |
         | For example, if you have an integration testing plugin - like cactus - that needs to know where
         | your Tomcat instance is installed, you can provide a variable here such that the variable is
         | dereferenced during the build process to configure the cactus plugin.
         |
         | As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
         | section of this document (settings.xml) - will be discussed later. Another way essentially
         | relies on the detection of a system property, either matching a particular value for the property,
         | or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
         | value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
         | Finally, the list of active profiles can be specified directly from the command line.
         |
         | NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
         |       repositories, plugin repositories, and free-form properties to be used as configuration
         |       variables for plugins in the POM.
         |
         |-->
         <profiles> 
          <profile>
            <id>development</id>
            <repositories>
              <repository>
                <id>central</id>
                <url>http://central</url>
                <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
                <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
              </repository>
            </repositories>
           <pluginRepositories>
              <pluginRepository>
                <id>central</id>
                <url>http://central</url>
                <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
                <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
              </pluginRepository>
            </pluginRepositories>
          </profile>
          <profile>
            <!--this profile will allow snapshots to be searched when activated-->
            <id>public-snapshots</id>
            <repositories>
              <repository>
                <id>public-snapshots</id>
                <url>http://public-snapshots</url>
                <releases><enabled>false</enabled></releases>
                <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
              </repository>
            </repositories>
           <pluginRepositories>
              <pluginRepository>
                <id>public-snapshots</id>
                <url>http://public-snapshots</url>
                <releases><enabled>false</enabled></releases>
                <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
              </pluginRepository>
            </pluginRepositories>
          </profile>
        </profiles>
       
         <activeProfiles>
          <activeProfile>development</activeProfile>
          <activeProfile>public-snapshots</activeProfile>
         </activeProfiles>
      
        <!-- activeProfiles
         | List of profiles that are active for all builds.
         |
        <activeProfiles>
          <activeProfile>alwaysActiveProfile</activeProfile>
          <activeProfile>anotherAlwaysActiveProfile</activeProfile>
        </activeProfiles>
        -->
      </settings>
      
      
  4. 配置maven环境

    // 打开profile文件
    vim /etc/profile
    
    // 配置java环境
    export MAVEN_HOME=/var/jenkins_home/apache-maven-3.9.6
    export PATH=${MAVEN_HOME}/bin:${PATH}
    :wq保存退出
    // 使用更新配置文件
    source /etc/profile
    
  5. 执行mvn -v命令,出现以下内容即成功

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker下载安装Jenkins

首先我们需要安装Docker,这里不再进行赘述,关于Docker的安装我在之前的博客中多次提到,不会的同学可以去看之前的文章,有详细的Docker教程

  1. docker拉取镜像,注意指定版本号,否则拉取的是比较旧的版本

    docker pull jenkins/jenkins:2.426.2-lts
    
  2. 我们刚才已经创建了挂载目录,所以这里直接执行创建容器

    docker run -d -p 8082:8080 -p 50000:50000 -v /usr/docker/jenkins_data:/var/jenkins_home  -v /etc/localtime:/etc/localtime -v /usr/bin/docker:/usr/bin/docker     -v /var/run/docker.sock:/var/run/docker.sock   --restart=on-failure  -u 0 --name myjenkins jenkins/jenkins:2.426.2-lts
    

    指令解析:

    • -d :后台运行容器

    • -p:端口映射, 左边是本地端口,右边是docker容器端口 ,8080是Jenkins Web 界面的工作端口,50000是JNLP(Java Network Launch Protocol)工作端口。这个端口用于 Jenkins 节点和主控节点之间的通信。

    • -v :目录挂载,将主机上的 /usr/docker/jenkins_data 目录挂载到容器内的 /var/jenkins_home 目录,用于持久化 Jenkins 的数据。/etc/localtime:/etc/localtime:将本地主机上的时区信息文件挂载到容器内的 /etc/localtime 文件中,确保容器内的时间与主机上的时间一致

    • -v /usr/bin/docker:/usr/bin/docker: 将主机上的 /usr/bin/docker 文件挂载到容器中的 /usr/bin/docker,这样容器内的 Jenkins 可以直接使用宿主机上的 Docker 命令。在使用 GitLab/Jenkins 等 CI 软件的时候需要使用 Docker 命令来构建镜像,需要在容器中使用 Docker 命令;通过将宿主机的 Docker 共享给容器

    • -v /var/run/docker.sock:/var/run/docker.sock: 将主机上的 Docker socket 文件挂载到容器中的相同位置,这样容器内的 Jenkins 可以与宿主机上的 Docker 引擎进行通信。

    • –restart=on-failure:设置容器的重启策略为在容器以非零状态退出(异常退出)时重启。

    • -u 0:将容器内进程的用户身份设置为 root 用户,等同于-u root。

    • –name myjenkins:给容器指定一个名称为 myjenkins。

  3. 极其重要!!!!!!!!!!刚才我们将jdk、maven放到了jenkins_home下,这里我们需要将其放到我们的数据卷中,也就是刚才创建的/usr/docker/jenkins_data目录下

    cp -r /var/jenkins_home/jdk1.8 /usr/docker/jenkins_data
    cp -r /var/jenkins_home/apache-maven-3.9.6 /usr/docker/jenkins_data
    

    这是因为docker和我们的主机是有环境隔离的,我们要将其映射到docker中,这样jenkins才能找到jdkmaven

  4. 验证Jenkins容器是否启动成功

    docker ps
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  5. 获取管理员密码

    查看日志

    docker logs myjenkins
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  6. 开始使用

    在浏览器中输入192.168.48.133:8082这里的ip地址是和自己的虚拟机ip地址一样的,端口号是刚才创建容器时指定的端口号

    然后稍等一会,就会出现以下样式,然后输入进去我们的密码

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    然后出现新手入门,选择推荐插件

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    等一会基本就下载完毕了,随后让我们创建一个账户,正常创建即可,然后就下一步最后我们的jenkins页面就出来了

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

温馨提示

为什么不去官网下载jenkins.war包进行安装?

这里我们下载的还是比较旧的jenkins,这样会导致我们在下载插件的时候,很多插件由于版本的问题,下载不了,会报错。经过多方面尝试,实际上我们用docker部署jenkins更为方便快捷

jenkins页面一直没有出现,为什么?

有可能你没有关闭防火墙,或者可以不关闭,开放8080端口即可,或者也有可能你此时此刻某一个进程占用了8080端口

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

使用Jenkins

因为我们要构建的是一个Maven项目,jenkins默认插件没有maven,所以我们需要去下载

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里搜索安装maven,选择第一个安装即可,这里因为我安装过了,所以无法再次安装

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Git安装

yum install -y git

随后回到首页,点击新建item

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入一个名称,选择maven项目,点击确定即可

Git配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你是gitlab,接下来需要更换你的分支名称,因为gitlab默认分支名称是main

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Maven配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

JDK配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Build配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里的Root POM中填写自己在代码仓库中项目中pom.xml文件在哪里,就填写哪里,我的就在java-project下,就直接pom.xml就可以了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意

这里Git、Build配置都在创建的项目item中的配置中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Maven、JDK配置在系统管理中的全局工具配置中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果

都准备好,我们点击构建

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以在控制台看到输出效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里可以看到是在/var/jenkins_home/workspace/first/target/下生成了一个jar包,但是这里这个目录是jenkins容器中的,实际上映射到了/usr/docker/jenkins_data/workspace/first/target

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入到jenkins容器中就可以看到日志上打印出来的结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

执行以下命令,在页面访问即可出现项目中的结果

java -jar SpringBootHelloWord-1.0-SNAPSHOT.jar

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/590667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音视频0粉营销推广墙纸,当日收益,第二天提现,日入300

项目简介&#xff1a; 这个项目非常易于执行&#xff0c;主要涉及在抖音平台上分享爱国主题的壁纸&#xff0c;并通过推广相关的小程序来实现盈利。 下 载 地 址 &#xff1a; laoa1.cn/1849.html 项目操作简便&#xff0c;一般只需花费1个小时即可完成&#xff0c;一旦掌…

JAVASCRIPT+PHP+GB2312字库文件实现浏览器LED滚动效果

一、效果 二、源码 1、test_led.html <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>MATRIX LED</title> <script src"https://cdn.staticfile.net/jquery/1.10.2/jquery.min.js"></script…

VSCode连接远程服务器时卡在审核(check)log.txt和pid.txt

诸神缄默不语-个人CSDN博文目录 VSCode就NM跟SB一样天天搁那儿更新&#xff0c;瞎JB更新&#xff0c;每次更新都要出一次兼容性问题&#xff0c;远程服务器不能连公网就上不去了&#xff0c;也没有显式提示&#xff0c;错误很明显就是在下载不了文件&#xff0c;用VSCode内置的…

Xamarin.Android项目使用ConstraintLayout约束布局

Xamarin.AndroidX.ConstraintLayout Xamarin.Android.Support.Constraint.Layout Xamarin.AndroidX.ConstraintLayout.Solver Xamarin.AndroidX.DataBinding.ViewBinding Xamarin.AndroidX.Legacy.Support.Core.UI Xamarin.AndroidX.Lifecycle.LiveData ![在这里插入图片描述]…

【软件工程】需求分析

目录 前言需求分析需求获取UML概述用例图用例图的组成用例图中的符号和含义包含的两种使用场景 用例图补充&#xff1a;“系统”用例模型建模确定系统参与者确定系统用例 用例文档用例文档组成部分 活动图组成元素初始节点和终点活动节点转换决策与分支、合并分岔与汇合 类图类…

JavaScript:Web APIs(三)

本篇文章的内容包括&#xff1a; 一&#xff0c;事件流 二&#xff0c;移除事件监听 三&#xff0c;其他事件 四&#xff0c;元素尺寸与位置 一&#xff0c;事件流 事件流是什么呢&#xff1f; 事件流是指事件执行过程中的流动路径。 我们发现&#xff0c;一个完整的事件执行…

MySQL技能树学习——数据库组成

数据库组成&#xff1a; 数据库是一个组织和存储数据的系统&#xff0c;它由多个组件组成&#xff0c;这些组件共同工作以确保数据的安全、可靠和高效的存储和访问。数据库的主要组成部分包括&#xff1a; 数据库管理系统&#xff08;DBMS&#xff09;&#xff1a; 数据库管理系…

围绕伦理困境进行深入讨论伦理困境分析与解决方案提出及个人反思

遵循一般咨询伦理的六原则&#xff08;自主、有益、无害、公正、诚信、诚实&#xff09;对五个选项&#xff08;A 评估&#xff0c;B 收益&#xff0c;C 后果&#xff0c;D 责任&#xff0c;E 教育&#xff09;进行评估&#xff0c;可以得出以下结论&#xff1a; A. 评估&…

数据结构与算法-单向环形链表与约瑟夫问题

1.简介 单向环形链表&#xff0c;闭合的形成一个环。 单向环形链表的一个应用场景是约瑟夫问题。 约瑟夫问题为&#xff1a;设编号为1&#xff0c;2&#xff0c;…&#xff0c;n的n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人…

C语言-------实现贪吃蛇小游戏

目录 一、预备知识 1.1 Win32 API介绍 Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外&#xff0c; 它同时也是一个很大的服务中心&#xff0c;调用这个服务中心的各种服务&#xff08;每一种服务就是一个函数&#xff09;&#xff0c;可以帮应用程…

如何在latex中使用第三方字体

最近想到一个问题&#xff1a;如何在 LaTeX \LaTeX LATE​X中使用第三方字体。 这个问题其实挺基础的&#xff0c;但是因为小白的 LaTeX \LaTeX LATE​X水平&#xff0c;应该说五六年了&#xff0c;毫无进步。 所以确实还是需要解决一下这个基础的问题。 小白最近使用的是TeXs…

Python | Leetcode Python题解之第65题有效数字

题目&#xff1a; 题解&#xff1a; from enum import Enumclass Solution:def isNumber(self, s: str) -> bool:State Enum("State", ["STATE_INITIAL","STATE_INT_SIGN","STATE_INTEGER","STATE_POINT","STATE_…

基于 Spring Boot 博客系统开发(五)

基于 Spring Boot 博客系统开发&#xff08;五&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;四&#xff09;&#x1f…

408数据结构-二叉树的概念、性质与存储结构 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 二叉树的定义 二叉树是一种特殊的树形结构&#xff0c;其特点是每个结点至多只有两棵子树&#xff08;即二叉树中不存在度大于 2 2 2的结点&#xff09;&#xff0c;并且二叉树是有序树&#xff0c;左右子树不能互换。 与树类似&#…

fastdfs安装

fastdfs安装步骤 一 、原理 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;由跟踪服务器&#xff08;tracker server&#xff09;、存储服务器&#xff08;storage server&#xff09;和客户端&#xff08;client&#xff09;三个部分组成&#xff0c;主要解决了海量数…

Flutter笔记:Widgets Easier组件库(10)快速处理承若型对话

Flutter笔记 使用Widgets Easier组件库快速处理承若型对话 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…

光固化打印--问题记录

平面翘起 原因&#xff1a;角度平&#xff0c;缺支持 解决&#xff1a; 45度角度摆放底部平面起皮 原因&#xff1a;缺少支撑&#xff0c;原始结构支持无法支撑平面。 解决&#xff1a;增加支撑

【数学 排列组合】1643. 第 K 条最小指令

本文涉及知识点 数学 排列组合 LeetCode1643. 第 K 条最小指令 Bob 站在单元格 (0, 0) &#xff0c;想要前往目的地 destination &#xff1a;(row, column) 。他只能向 右 或向 下 走。你可以为 Bob 提供导航 指令 来帮助他到达目的地 destination 。 指令 用字符串表示&am…

Mybatis之Sqlsession、Connection和Transaction三者间的关系

前言 最近在看Mybatis的源码&#xff0c;搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系&#xff0c;debug之后发现有不少疑惑&#xff0c;于是按照原文整理了一下&#xff0c;记录下debug中的一些困惑点。 对于我们开发来讲&#xff0c;不管跟任何关系…

2024五一数学建模C题完整论文讲解(含完整python代码及几十个特征表、处理表、结果表)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024五一数学建模C题煤矿深部开采冲击地压危险预测完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 C题论文…