centos8搭建maven私服

  • 简介
    • maven
    • maven私服
    • 仓库简介
      • Nexus仓库类型介绍
  • 私服搭建
    • 环境
    • 安装nexus
      • 创建目录
      • 下载
      • 拷贝压缩文件至/usr/local目录下
      • 解压
      • 创建用户
      • 修改属组和属主
      • 配置环境变量
      • 启动
      • 验证
      • Repositories介绍
      • 私服配置
        • 指定本地仓库
        • 配置私服镜像地址
        • 配置阿里镜像地址
        • 配置认证信息
        • 配置profile
        • 配置activeProfile
        • 添加阿里云仓库
      • 在项目中的使用
        • 获取依赖包
        • 发布包
  • 加入systemctl管理并设置开机自启动
    • 将nexus加入systemctl管理
      • 创建nexus.service服务文件
      • 重新加载服务列表
      • 启动服务
    • 将nexus设置为开机自启动

简介

maven

Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具,它包含了一个项目对象模型 (Project Object Model)、一组标准集合、一个项目生命周期(Project Lifecycle)、一个依赖管理系统(Dependency Management System)和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven是优秀的依赖管理工具,能轻松地解决繁杂的Java类库的依赖关系。Maven是标准化的构建流程,暴露了一组一致、简洁的操作接口,能帮助团队成员从原来的高度自定义的、复杂的构建系统中解脱出来,使用maven现有的成熟的、稳定的组件也能简化构建系统的复杂度。
Maven是项目信息管理工具,能有效管理原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址等,另外还能通过Maven自动生成项目站点、项目文档、测试报告等非常具有价值的项目信息。

maven私服

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
私服的好处:

  • 节省自己的外网带宽
  • 加速Maven构建
  • 部署自己内部的第三方构件
  • 提高稳定性,增强控制
  • 降低中央仓库的负荷
  • 控制和审计
  • 建立本地内部公用仓库

仓库简介


如上图所示:
对于Maven来说,仓库只分为两类:本地仓库和远程仓库
当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果 本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,Maven就会去远程仓库查找,发现需要的构件,下载到本地仓库再使用。如果本地仓库和远程仓库都没有,Maven就会报错。 私服仓库的工作流程如图:

Nexus仓库类型介绍

  • hosted本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
  • proxy代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
  • group仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。

Nexus预定义了3个本地仓库,分别是Releases、Snapshots和3rd Party。 分别讲一下这三个预置的仓库都是做什么用的:

  • Releases:这里存放我们自己项目中发布的构建,通常是Release版本的,比如我们自己做了一个FTP Server的项目,生成的构件为ftpserver.war,我们就可以把这个构建发布到Nexus的Releases本地仓库。
  • Snapshots这个仓库非常的有用,它的目的是让我们可以发布那些非release版本,非稳定版本,比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用,因为你的同伴正在依赖你的模块开发,那么这个时候我们就可以发布Snapshot版本到这个仓库,你的同伴就可以通过简单的命令来获取和使用这个临时版本。
  • 3rd Party:顾名思义,第三方库,你可能会问不是有中央仓库来管理第三方库吗,没错,这里的是指可以让你添加自己的第三方库,比如有些构件在中央仓库是不存在的,比如你在中央仓库找不到Oracle的JDBC驱动,这个时候我们就需要自己添加到3rdparty仓库。

私服搭建

这里简单说明 Linux 下的安装方式,如果下载的是最新版本,它对系统内存和 jdk 版本是有要求的,要求内存大于4G,jdk 最低是1.8版本。

环境

jdk:1.8.0_271
maven:Apache Maven 3.6.3

本机是安装好了jdk和maven的,如果是未安装可以参考centos8使用war包安装部署jenkins以及初始化配置 这篇文章,这个里面有详细的安装配置过程。

安装nexus

创建目录

[root@dxm28 ~]# mkdir -p /data/nexus
[root@dxm28 ~]# cd /data/nexus/

下载

从sonatype上下载特别慢,所以我把下载好的包放在了百度网盘,分享一下,有需要的可以自取。

链接: https://pan.baidu.com/s/1NZPuzDQefsCa-zwc2wHKHA
密码: 5n2t

latest-unix.tar.gz就是nexus-3.28.1-01-unix.tar.gz。

[root@dxm28 nexus]# wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
[root@dxm28 nexus]# ll -h

拷贝压缩文件至/usr/local目录下

[root@dxm28 nexus]# cp latest-unix.tar.gz /usr/local/

解压

[root@dxm28 nexus]# cd /usr/local/
[root@dxm28 local]# tar -zxvf latest-unix.tar.gz

创建用户

# 创建nexus用户
[root@dxm28 ~]# useradd nexus

修改属组和属主

[root@dxm28 local]# chown -R nexus.nexus nexus-3.28.1-01 sonatype-work
[root@dxm28 local]# ll -h

配置环境变量

[root@dxm28 ~]# vim /etc/profile

增加以下内容:

export NEXUS_HOME=/usr/local/nexus-3.28.1-01
export PATH=$PATH:$NEXUS_HOME/bin

使得配置生效:

[root@dxm28 ~]# source /etc/profile

启动

[root@dxm28 ~]# nexus start

[root@dxm28 ~]# nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus

启动失败,原因是不建议使用root用户执行此命令。
解决办法1:创建新的用户来执行此命令。(上面已经创建好了)

解决办法2:修改启动脚本中run_as_root=true的true改为false。
如图,将true改为false即可。
使用**./nexus start这种后台启动方式看不到实时日志**;用**./nexus run是实时启动可以看到日志,但是此启动方式不能退出回命令模式**。
./nexus status #查看启动状态,./nexus stop #停止,./nexus restart重启

# 前台启动:
nexus console# 以后台进程启动:nexus start

查看输出的日志:tail -f logs/wrapper.log。
我们切换用户nexus,再启动使用nexus run,看是否有错误

[root@dxm28 local]# su nexus
[nexus@dxm28 local]$ nexus run



看到Started Sonatype Nexus OSS 3.28.1-01说明已经启动成功。
Ctrl+C停止这个进程,然后我们再使用nexus start命令启动。
查看一下进程:

[nexus@dxm28 local]$ ps aux | grep java | grep nexus


启动成功。再看一下端口监听情况:

[nexus@dxm28 local]$ netstat -ntlp | grep 8081


查看状态:

[nexus@dxm28 local]$ nexus status

验证

浏览器访问http://IP+端口,我们这里是http://192.168.0.28:8081,出现如下界面即可。

点击sign in,看到弹出框有如下提示信息:Your admin user password is located in
/usr/local/sonatype-work/nexus3/admin.password on the server.,我们可以在服务器执行一下查看密码的命令

[nexus@dxm28 local]$ cat /usr/local/sonatype-work/nexus3/admin.password


这个就是我们的密码。admin就是我们的用户名,我们输入账号密码登录试试。
登录成功之后,我们重置一下密码。

Repositories介绍


仓库分类前面我们已经介绍过了,所以这里不难看出:
maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
maven-releases:私库发行版jar,公司或团队内部的包,正式版。
maven-snapshots:私库快照(调试版本)jar,公司或团队内部的包,开发测试版。
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。它的目的就是把多个仓库组合起来,然后我们项目中只需要配置上这个类型的仓库地址,就可以把它里面组合的几个仓库都关联上。

私服配置

下面的配置都是在maven配置文件下面settings.xml 里面进行的配置。

指定本地仓库

<!--存放本地仓库的地方-->
<localRepository>/data/maven/repository</localRepository>

配置私服镜像地址

在settings.xml 文件的 mirrors 内添加以下镜像地址:

<mirror><id>nexus</id><mirrorOf>*</mirrorOf><url>http://localhost:8081/repository/maven-public/</url>
</mirror>

配置阿里镜像地址

在settings.xml 文件的 mirrors 内添加以下镜像地址:

<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>

配置认证信息

Nexus的仓库对于匿名用户是只读的,为了能够部署构件,还需要在setting.xml中的servers配置认证信息。

<server><id>nexus_release</id><username>admin</username><password>admin123</password><filePermissions>664</filePermissions><directoryPermissions>775</directoryPermissions><configuration></configuration>
</server><server><id>nexus_snapshots</id><username>admin</username><password>admin123</password><filePermissions>664</filePermissions><directoryPermissions>775</directoryPermissions><configuration></configuration>
</server><server><id>central-proxy</id><username>admin</username><password>admin123</password><filePermissions>664</filePermissions><directoryPermissions>775</directoryPermissions><configuration></configuration>
</server>

配置profile

在profiles内添加以下Profile 配置:

<profile><id>nexus</id><!--和activeProfile 值一致 --><activation><activeByDefault>true</activeByDefault></activation><repositories><repository><id>central</id><url>http://localhost:8081/repository/maven-central/</url><releases><enabled>true</enabled><updatePolicy>never</updatePolicy><checksumPolicy>warn</checksumPolicy></releases><snapshots><!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 --><enabled>true</enabled><!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 --><updatePolicy>never</updatePolicy><!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 --><checksumPolicy>warn</checksumPolicy></snapshots><!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 --><layout>default</layout></repository></repositories><pluginRepositories><pluginRepository><id>central</id><url>http://localhost:8081/repository/maven-central/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></pluginRepository></pluginRepositories>
</profile>

配置activeProfile

在activeProfiles内添加以下activeProfile配置:

<!--激活上面配置的仓库信息-->
<activeProfiles><activeProfile>nexus</activeProfile>
</activeProfiles>

添加阿里云仓库

添加阿里云仓库就是为了在私服找不到依赖包时能去阿里云找,找到后返回给依赖方并缓存到私服。

我们先Create repository。

选择maven2 proxy
我们只要改图中两个地方即可,一个是资源名字,一个是远程仓库地址,这里我们输入http://maven.aliyun.com/nexus/content/groups/public/作为yu远程仓库地址。然后点击Create repository。
接下来我们把这个仓库加入到maven-pubilc中,也就是我们配置的私服仓库地址。

然后我们给它移到右边Members中并且排在第一位。
点击保存。这样就配置好了,如果资源在私服找不到就会到阿里云找。

在项目中的使用

获取依赖包

如果是普通项目成员,不需要向私服发布包的,只需要在 pom 文件中加入以下配置即可。

<repositories><repository><id>maven-public</id><name>maven-public</name><url>http://localhost:8081/repository/maven-public/</url><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>

其中 id 要和你的仓库名称一致,url 就是私服的仓库地址,就是type为group的那个,它组合了一个 proxy 类型的和两个 hosted 类型的仓库。设置snapshots的enabled为ture表示允许下载 snapshots版本的包。

发布包

如果需要向仓库中发布包的,首先需要对仓库有权限才可以,没有权限的用户是没办法发布的。其实就是我们在上面配置认证信息的部分内容,此处不再赘述。然后需要在pom.xml 中的 project 内添加自动部署构件配置,配置下面的内容

<distributionManagement><!-- 远程部署管理信息 -->
<!-- 项目部署到私服配置 id和上面server中配置的id一致-->  <repository><!--部署项目产生的构件到远程仓库需要的信息 --><id>nexus_release</id><name>maven-releases</name><url>http://localhost:8081/repository/maven-releases/</url></repository><snapshotRepository><!-- 如果没有配置该元素,默认部署到repository元素配置的仓库 --><id>nexus_snapshots</id><name>maven-snapshots</name><url>http://localhost:8081/repository/maven-snapshots/</url></snapshotRepository>
</distributionManagement>

我们看到上面配置了一个repository,还有一个snapshotRepository,上面表示的是releases版。注意id要和setting.xml里server下的id一致,不然会出现权限问题。url分别指定maven-releases和maven-snapshots的地址。

只要在项目中配置1.0-SNAPSHOT这样,带有SNAPSHOT的就会到snapshots仓库,如果不加 SNAPSHOT就会到releases仓库。

最后执行 mvn clean deploy 命令,即可发布包到私服仓库中
各参数代表含义为:

参数 含义
-Dmaven.test.skip=true 跳过编译、测试
-Dfile jar包文件地址,绝对路径
-DgroupId groupId,可自定义
-DartifactId artifactId,可自定义
-Dversion 版本号
-Dpackaging 打包方式
-DrepositoryId 远程库服务器ID
-Durl 远程库服务器地址

例如我们将admin-server-0.0.1-SNAPSHOT.jar发布到私服上,命令如下:mvn clean deploy -DgroupId=com.bat -DartifactId=admin-server -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar -Dfile=/data/workspace/jar/admin-server/admin-server-0.0.1-SNAPSHOT.jar -Durl=http://192.168.0.28:8081/repository/maven-snapshots/ -DrepositoryId=nexus_snapshots --settings /usr/local/maven/conf/settings.xml

[root@dxm28 admin-server]# mvn clean deploy -DgroupId=com.bat -DartifactId=admin-server -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar -Dfile=/data/workspace/jar/admin-server/admin-server-0.0.1-SNAPSHOT.jar -Durl=http://192.168.0.28:8081/repository/maven-snapshots/ -DrepositoryId=nexus_snapshots --settings /usr/local/maven/conf/settings.xml



显示成功,我们接下来到私服服务器看一下。

可以看到我们的jar包已经成功发布到私服上了。
点击左边的jar文件可以在右边看到相应的依赖配置,可以直接添加到pom.xml文件中下载相应的依赖。

除了以上命令方式发布包之外,也可以在IDEA中打开maven菜单,双击deploy按钮发布包到私服仓库中。

至此我们就完成了私服的搭建以及发布包到私服的过程。

加入systemctl管理并设置开机自启动

将nexus加入systemctl管理

创建nexus.service服务文件

创建nexus.service服务文件

[root@dxm28 /]# vim /etc/systemd/system/nexus.service

内容如下:

[Unit]
Description=nexus service
After=network.target[Service]
User=nexus
Group=nexus
Type=forking
ExecStart=/usr/local/nexus-3.28.1-01/bin/nexus start
ExecStop=/usr/local/nexus-3.28.1-01/bin/nexus stop
Restart=on-abort[Install]
WantedBy=multi-user.target

重新加载服务列表

[root@dxm28 /]# systemctl daemon-reload

启动服务

# 停止上面手动后台启动的nexus服务
[root@dxm28 /]# ps aux | grep java | grep nexus
nexus      62192  1.2 42.8 6734716 1646016 pts/0 Sl   10:22   2:33 /usr/local/jdk/bin/java -server -Dinstall4j.jvmDir=/usr/local/jdk -Dexe4j.moduleName=/usr/local/nexus-3.28.1-01/bin/nexus -XX:+UnlockDiagnosticVMOptions -Dinstall4j.launcherId=245 -Dinstall4j.swt=false -Di4jv=0 -Di4jv=0 -Di4jv=0 -Di4jv=0 -Di4jv=0 -Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=../sonatype-work/nexus3/log/jvm.log -XX:-OmitStackTraceInFastThrow -Djava.net.preferIPv4Stack=true -Dkaraf.home=. -Dkaraf.base=. -Dkaraf.etc=etc/karaf -Djava.util.logging.config.file=etc/karaf/java.util.logging.properties -Dkaraf.data=../sonatype-work/nexus3 -Dkaraf.log=../sonatype-work/nexus3/log -Djava.io.tmpdir=../sonatype-work/nexus3/tmp -Dkaraf.startLocalConsole=false -Djava.endorsed.dirs=lib/endorsed -Di4j.vpt=true -classpath /usr/local/nexus-3.28.1-01/.install4j/i4jruntime.jar:/usr/local/nexus-3.28.1-01/lib/boot/nexus-main.jar:/usr/local/nexus-3.28.1-01/lib/boot/activation-1.1.1.jar:/usr/local/nexus-3.28.1-01/lib/boot/jakarta.xml.bind-api-2.3.3.jar:/usr/local/nexus-3.28.1-01/lib/boot/jaxb-runtime-2.3.3.jar:/usr/local/nexus-3.28.1-01/lib/boot/txw2-2.3.3.jar:/usr/local/nexus-3.28.1-01/lib/boot/istack-commons-runtime-3.0.10.jar:/usr/local/nexus-3.28.1-01/lib/boot/org.apache.karaf.main-4.2.9.jar:/usr/local/nexus-3.28.1-01/lib/boot/osgi.core-6.0.0.jar:/usr/local/nexus-3.28.1-01/lib/boot/org.apache.karaf.specs.activator-4.2.9.jar:/usr/local/nexus-3.28.1-01/lib/boot/org.apache.karaf.diagnostic.boot-4.2.9.jar:/usr/local/nexus-3.28.1-01/lib/boot/org.apache.karaf.jaas.boot-4.2.9.jar com.install4j.runtime.launcher.UnixLauncher start 9d17dc87 0 0 org.sonatype.nexus.karaf.NexusMain[root@dxm28 /]# kill -9 62192# 检查是否还存在nexus进程
[root@dxm28 /]# ps aux | grep java | grep nexus# 查询所有服务单元是否有nexus
[root@dxm28 /]# systemctl list-unit-files | grep nexus
nexus.service                              disabled# 存在,且非开启自启动,使用systemctl启动nexus服务
[root@dxm28 /]# systemctl start nexus.service# 查看nexus服务状态
[root@dxm28 /]# systemctl status nexus.service


Active: active (running) 可以看到nexus服务已经启动成功。查看进程以及端口的监听情况:

[root@dxm28 /]# ps aux | grep java | grep nexus[root@dxm28 /]# netstat -ntlp | grep 8081


浏览器访问http://192.168.0.28:8081/

将nexus设置为开机自启动

[root@dxm28 /]# systemctl list-unit-files | grep nexus
nexus.service                              disabled
# disabled表示非开机自启动# 设置为开机自启动
[root@dxm28 /]# systemctl enable nexus.service
Created symlink /etc/systemd/system/multi-user.target.wants/nexus.service → /etc/systemd/system/nexus.service.# 再次查看
[root@dxm28 /]# systemctl list-unit-files | grep nexus
nexus.service                              enabled# enabled表示是开机自启动,执行重启命令
[root@dxm28 /]# reboot#重启后再次查看nexus服务已启动完成。

centos8搭建maven私服(含nexus-3.28.1-01.tar.gz下载链接)相关推荐

  1. 【仓库管理】搭建 Maven 私服之一--Nexus仓库(Repository)管理软件

    文章目录 Nexus是什么 Nexus下载和安装 1. 进入 Nexus 2.x 下载页面,根据本机操作系统,选择对应的版本进行下载,如下图所示. 2. 将下载 Nexus 安装包解压到本地磁盘,可获 ...

  2. Nexus搭建Maven私服并使用私服

    简单介绍 前言:我们常用的maven仓库有中央仓库(全球共用),私有仓库(公司内部共用),和本地仓库(个人私有).类似代码托管大概有GitHub(全球代码托管)和gitee(国内版代码托管)和Gitl ...

  3. Nexus - 基于docker搭建Maven私服

    Nexus - 基于docker搭建Maven私服 1 关于Nexus和Maven 1.1 Nexus 1.2 Maven 2. 部署Nexus 2.1 启动nexus 2.2 登录nexus 2.3 ...

  4. linux设置nexus开机自启动_在linux中使用nexus搭建maven私服

    首先介绍下为什么要搭建maven私服,简单点说就是就是把项目工程中的Jar包放在一个服务器上,每次Jar包的修改都能去私服上面Down到本地.可以对整个项目组的人形成一个统一的管理. 2.下载完之后就 ...

  5. 如何使用Nexus搭建Maven私服

    如何使用Nexus搭建Maven私服 转载于:https://www.cnblogs.com/valuestack/p/nexus-and-maven.html

  6. Maven学习总结(九)——使用Nexus搭建Maven私服

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(九)--使用Nexus搭建Maven私服 一.搭建nexus私服的目的 为什么要搭建nexus私服,原因很 ...

  7. Maven学习 使用Nexus搭建Maven私服(转)

    为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到 ...

  8. Maven学习-使用Nexus搭建Maven私服

    为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到 ...

  9. Linux下使用Nexus搭建Maven私服

    Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问.利用Nexus你可以只在一个地方就能够完全控制访问和部署在你所维护仓库中的每个Artifact.Nexus ...

最新文章

  1. Github continuous deployment (CD) 最佳实践
  2. 西南交大计算机几个专业,西南交通大学计算机科学与技术专业
  3. SpringCloud Alibaba-Nacos 的使用
  4. 计算机网络信息安全理论与实践教程-蒋建春
  5. Hive电商数仓实战
  6. 航空信息指挥调度系统_应急指挥中心指挥调度系统解决方案(一)
  7. Item 10.const成员函数 (Meaning of a Const Member Function)
  8. win10禁止易升最有效的办法
  9. Keras搭建神经网络BPNN(分类问题)
  10. 【个人积累】轨道根数六要素中第4、5项的理解与STK仿真演示
  11. 离散数学:快速又准确地求解主合取范式和主析取范式 (配凑大法好)
  12. rpc error: code = Unimplemented desc =
  13. springboot大学生就业规划系统毕业设计-附源码191451
  14. Factory IO的应用(一)
  15. B站JavaScript从入门到精通智能社Blue石川老师视频部分代码_轮播图
  16. 2020 CSP-J2题目
  17. 图灵机是什么?一起来看看它的工作原理
  18. 【简书 DC谢老师】JMeter + jenkins + SVN 接口自动化之简单 demo​​​​​​​
  19. Kotlin-简约之美-基础篇(一):变量的声明和使用
  20. 怎么实现全国IP自动更换?

热门文章

  1. 强生单剂新冠疫苗对“德尔塔”有效;赛诺菲巴斯德将每年投资4亿欧元建mRNA疫苗中心 | 美通社头条...
  2. Delphi官方下载地址
  3. 几何光学学习笔记(13)- 4.2双平面镜成像
  4. 自动化立体仓库使用流程!海格里斯自动化立体库流程:入库——出库——拣选
  5. 《人类简史》笔记三—— 历史从无正义
  6. 7-3 干支纪年法 (100 分)
  7. 新手Mac需要了解哪些内容?Mac小白基础教程
  8. PEEK薄膜特性与各型号性能特征分析
  9. 【UE4】pawn 和 Character 的区别
  10. C 递归 详解(通俗易懂)