Maven——使用Nexus创建私服

私服不是Maven的核心概念,它仅仅是一种衍生出来的特殊的Maven仓库。通过建立自己的私服,就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等,从而高效地使用Maven。
在这里插入图片描述

有三种专门的Maven仓库管理软件可以用来帮助大家建立私服:Apache基金会的Archiva、JFrog的Artifactory和Sonatype的Nexus。其中,Archiva是开源的,而Artifactory和Nexus的核心也是开源的,因此我们可以自由选择使用。事实上,Nexus也是当前最流行的Maven仓库管理软件。

绍Nexus的主要功能,并结合大量图片帮助大家快速地建立起自己的Maven私服。

1、Nexus简介

2005年12月,Tamas Cservenak由于受不了匈牙利电信ADSL的低速度,开始着手开发Proximity——一个很简单的Web应用。它可以代理并缓存Maven构件,当Maven需要下载构件的时候,就不需要反复依赖于ADSL。到2007年,Sonatype邀请Tamas参与创建一个更酷的Maven仓库管理软件,这就是后来的Nexus。

Nexus团队的成员来自世界各地,它也从社区收到了大量反馈和帮助,在写本书的时候,Nexus刚发布1.7.2版本,它也正健康快速地成长着。

Nexus分为开源版和专业版,其中开源版本基于GPLv3许可证,其特性足以满足大部分Maven用户的需要。以下是一些Nexus开源版本的特性:

  • 较小的内存占用(最少仅为28MB)
  • 基于ExtJS的友好界面
  • 基于Restlet的完全REST API支持代理仓库、宿主仓库和仓库组
  • 基于文件系统,不需要数据库
  • 支持仓库索引和搜索
  • 支持从界面上传Maven构件
  • 细粒度的安全控制

Nexus专业版本是需要付费购买的,除了开源版本的所有特性之外,它主要包含一些企业安全控制、发布流程控制等需要的特性。感兴趣的可以访问该地址了解详情:http://www.sonatype.com/products/nexus/community

2、安装Nexus

Nexus是典型的Java Web应用,它有两种安装包,一种是包含Jetty容器的Bundle包,另一种是不包含Web容器的war包。

2.1、下载Nexus

下载地址:https://download.sonatype.com/nexus

然后将下载的文件上传到 Linux 系统(我用的系统版本是CentOS7),解压后即可使用,不需要安装(这里我放在/opt/nexus目录下)。
在这里插入图片描述

需要注意:Linux 必须提前安装 JDK。

2.2、启动Nexus

通过以下命令启动:

# 启动
/opt/nexus/nexus-3.61.0-02/bin/nexus start
# 查看状态
/opt/nexus/nexus-3.61.0-02/bin/nexus status
#停止
/opt/nexus/nexus-3.61.0-02/bin/nexus stop

当看到nexus is running的时候说明项目已经启动了,默认端口号是8081。如果提示nexus is stopped则说明端口被占用了,我们可以更改nexus的默认端口号。其配置在 /opt/nexus/nexus-3.61.0-02/etc目录下的nexus-default.properties 里面,这里我改成了8090。

在这里插入图片描述
接下来就可以启动访问了:

http://[Linux 服务器地址]:8090/ 

ps:这里需要说明一下,如果Nexus显示已经启动了,但是访问不到,有可能是端口的对外防火墙没有打开。

开启防火墙的步骤为:

#首先,确保firewalld已经启动:
sudo systemctl start firewalld
#确保firewalld被设置为开机启动:
sudo systemctl enable firewalld
#使用firewall-cmd打开一个端口。例如,要打开TCP8090端口:
sudo firewall-cmd --zone=public --add-port=8090/tcp --permanent
#重新加载防火墙以使更改生效:
sudo firewall-cmd --reload
#如果需要,你也可以验证端口是否已经开放:
sudo firewall-cmd --zone=public --list-ports

Nexus首页如下,第一次需要登录,然后修改初始密码。

用户名:admin
初始密码:在/opt/nexus/sonatype-work/nexus3/admin.password 文件里

在这里插入图片描述

3、Nexus的仓库与仓库组

作为Maven仓库服务软件,仓库自然是Nexus中最重要的概念。Nexus包含了各种类型的仓库概念,包括代理仓库、宿主仓库和仓库组等。每一种仓库都提供了丰富实用的配置参数,方便用户根据需要进行定制。

3.1、Nexus内置的仓库

在具体介绍每一种类型的仓库之前,先浏览一下Nexus内置的一些仓库。单击Nexus界面左边导航栏中的Repositories链接,就能在界面右边看到如下图所示的内容:
在这里插入图片描述
这个列表已经包含了所有类型的Nexus仓库。从中可以看到仓库有四种类型:group(仓库组)、hosted(宿主)、proxy(代理)和virtual(虚拟):

仓库类型说明
proxy某个远程仓库的代理
group存放:通过 Nexus 获取的第三方 jar 包
hosted存放:本团队其他开发人员部署到 Nexus 的 jar 包

每个仓库的格式为maven2或者maven1。此外,仓库还有一个属性为Policy(策略),表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库。最后两列的值为仓库的状态和路径。

下面解释一下各个仓库的用途:

仓库名称说明
maven-centralNexus 对 Maven 中央仓库的代理,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
maven-publicNexus 默认创建,供开发人员下载使用的组仓库
maven-releasseNexus 默认创建,供开发人员部署自己 jar 包的宿主仓库,要求 releasse 版本
maven-snapshotsNexus 默认创建,供开发人员部署自己 jar 包的宿主仓库,要求 snapshots 版本

其中 maven-public 相当于仓库总和,默认把其他 3 个仓库加进来一起对外提供服务了,另外,如果有自己建的仓库,也要加进该仓库才有用。

3.2、Nexus仓库分类的概念

为了帮助大家理解宿主仓库、代理仓库和仓库组的概念,下图用更为直观的方式展现了它们的用途和区别:
在这里插入图片描述
从上图中可以看到,Maven可以直接从宿主仓库下载构件;Maven也可以从代理仓库下载构件,而代理仓库会间接地从远程仓库下载并缓存构件;最后,为了方便,Maven可以从仓库组下载构件,而仓库组没有实际内容(图中用虚线表示),它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。

3.3、创建仓库

初始状态下,这几个仓库都没有内容:
在这里插入图片描述
除了自带的仓库,有时候我们需要单独创建自己的仓库,按照默认创建的仓库类型来创建我们自己的仓库。

点击Create Repository:
在这里插入图片描述
选择如下三种类型的仓库:
在这里插入图片描述

1、创建Nexus宿主仓库

在这里插入图片描述

2、创建Nexus代理仓库

输入仓库名以及被代理仓库的URL,这里我输入阿里云的仓库地址,默认为中央仓库。
在这里插入图片描述

3、创建Nexus仓库组

配置中的ID、Name等信息这里不再赘述。需要注意的是,仓库组没有Release和Snapshot的区别,这不同于宿主仓库和代理仓库。在配置界面中,用户可以非常直观地选择Nexus中的仓库,将其聚合成一个虚拟的仓库组。注意,仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,因此最好将常用的仓库放在前面,当用户从仓库组下载构件的时候,就能够尽快地访问到包含构件的仓库。

在这里插入图片描述

上面的仓库创建好之后就可以在首页看到了:
在这里插入图片描述

4、Nexus的索引与构件搜索

既然Nexus能够维护宿主仓库并代理缓存远程仓库(如Maven中央库),那么一个简单的需求就自然浮现出来了,这就是搜索。Maven中央库有几十万构件供用户使用,但有时我们往往仅仅知道某个关键字,如Ehcache,而不知道其确切的Maven坐标。Nexus通过维护仓库的索引来提供搜索功能,能在很大程度上方便Maven用户定位构件坐标。

Sonatype提供的在线免费搜索服务,其实用户可以很方便地自己维护一个Nexus实例,并提供搜索服务。

为了能够搜索Maven中央库,首先需要设置Nexus中的Maven Central代理仓库下载远程索引,如下图所示。需要注意的是,默认这个配置的值是关闭的。此外,由于中央库的内容比较多,因此其索引文件比较大,Nexus下载该文件也需要比较长的时间,大家还需要耐心等待。
在这里插入图片描述
可以想象到,Nexus在后台运行了一个任务来下载中央仓库的索引,幸运的是,用户可以通过界面直接观察这一任务的状态。单击界面左边导航栏中的Scheduled Tasks链接后,用户就能在界面的右边看到系统的调度任务,如果Nexus正在下载中央仓库的索引,用户就能看到下图所示的一个任务,其状态为RUNNING。在索引下载完毕之后,该任务就会消失。
在这里插入图片描述
有了索引,用户即可搜索Maven构件了。Nexus界面左边导航栏有一个快捷搜索框,在其中输入关键字后,单击搜索按钮就能快速得到搜索结果,如下图所示:
在这里插入图片描述
除了简单的关键字搜索,Nexus还提供了GAV搜索、类名搜索和校验和搜索等功能,用户可以单击搜索页面左上角的下拉菜单选择高级搜索功能:

  • GAV搜索(GAV Search)允许用户通过设置GroupId、ArtifactId和Version等信息来进行更有针对性的搜索。
  • 类名搜索(Classname Search)允许用户搜索包含某个Java类的构件。
  • 校验和搜索(Checksum Search)允许用户直接使用构件的校验和来搜索该构件。

当然,用户也可以自己手动输入GroupId、ArtifactId等信息来进行GAV搜索。
在这里插入图片描述
有了中央仓库的索引,用户不仅能够搜索构件,还能够直接浏览中央仓库的内容。这便是Nexus的索引浏览功能。在Repositories页面中,选择Browse Index选项卡,就能看到中央仓库内容的树形结构,如下图所示:
在这里插入图片描述

5、配置Maven从Nexus下载构件

在POM中为Maven配置仓库和插件仓库。例如,当需要为项目添加Nexus私服上的public仓库时,可以按代码清单如下所示配置,在POM中配置Nexus仓库:

<project>
……
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
……
</project>

这样的配置只对当前Maven项目有效,在实际应用中,我们往往想要通过一次配置就能让本机所有的Maven项目都使用自己的Maven私服。这个时候大家可能会想到settings.xml文件,该文件中的配置对所有本机Maven项目有效,但是settings.xml并不支持直接配置repositories和pluginRepositories。所幸Maven还提供了Profile机制,能让用户将仓库配置放到setting.xml中的Profile中,如代码清单如下所示:

在settings.xml中配置Nexus仓库:

<settings>
……
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
……</settings>

该配置中使用了一个id为nexus的profile,这个profile包含了相关的仓库配置,同时配置中又使用activeProfile元素将nexus这个profile激活,这样当执行Maven构建的时候,激活的profile会将仓库配置应用到项目中去。

上面代码清单中的配置已经能让本机所有的Maven项目从Nexus私服下载构件。细心的人可能会注意到,Maven除了从Nexus下载构件之外,还会不时地访问中央仓库central,我们希望的是所有Maven下载请求都仅仅通过Nexus,以全面发挥私服的作用。这个时候就需要借助于Maven镜像配置了。可以创建一个匹配任何仓库的镜像,镜像的地址为私服,这样,Maven对任何仓库的构件下载请求都会转到私服中。具体配置见代码清单如下所示,配置镜像让Maven只使用私服:

<settings>
……<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories><pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases><snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
……
</settings>

关于镜像、profile及profile激活的配置不再赘述,这里需要解释的是仓库及插件仓库配置,它们的id都为central,也就是说,覆盖了超级POM中央仓库的配置,它们的url已无关紧要,因为所有请求都会通过镜像访问私服地址。配置仓库及插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版或快照版构件的时候,它首先检查central,看该类型的构件是否支持,得到正面的回答之后,再根据镜像匹配规则转而访问私服仓库地址。

6、部署构件至Nexus

如果只为代理外部公共仓库,那么Nexus的代理仓库就已经能够完全满足需要了。对于另一类Nexus仓库——宿主仓库来说,它们的主要作用是储存组织内部的,或者一些无法从公共仓库中获得的第三方构件,供大家下载使用。用户可以配置Maven自动部署构件至Nexus的宿主仓库,也可以通过界面手动上传构件。

6.1、使用Maven部署构件至Nexus

日常开发生成的快照版本构件可以直接部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中。POM的配置方式,下面的代码清单列出了一段典型的配置,配置Maven部署构件至Nexus:

<project>
……
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Releases Repository</name>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshots Repository</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
……
</project>

Nexus的仓库对于匿名用户是只读的。为了能够部署构件,还需要在settings.xml中配置认证信息,如代码清单如下所示:

<settings>
……
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>*****</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>*****</password>
</server></servers>
……
</settings>

6.2、手动部署第三方构件至Nexus

某些Java Jar文件(如Oracle)的JDBC驱动,由于许可证的因素,它们无法公开地放在公共仓库中。此外,还有大量的小型开源项目,它们没有把自己的构件分发到中央仓库中,也没有维护自己的仓库,因此也无法从公共仓库获得。这个时候用户就需要将这类构件手动下载到本地,然后通过Nexus的界面上传到私服中。

要上传第三方构件,首先选择一个宿主仓库如3rd party,然后在页面的下方选择Artifact Upload选项卡。在上传构件的时候,Nexus要求用户确定其Maven坐标,如果该构件是通过Maven构建的,那么可以在GAV Definition下拉列表中选择From POM,否则就选GAV Parameters。用户需要为该构件定义一个Maven坐标,例如上传一个Oracle 11g的JDBC驱动,则可以按下图所示输入坐标:
在这里插入图片描述
定义好坐标之后,单击Select Artifact(s)to Upload按扭从本机选择要上传的构件,然后单击Add Artifact按钮将其加入到上传列表中。Nexus允许用户一次上传一个主构件和多个附属构件(即Classifier)。最后,单击页面最下方的Upload Artifact(s)按钮将构件上传到仓库中。

7、Nexus的权限管理

在组织中使用Nexus的时候往往会有一些安全性需求,例如希望只有管理员才能配置Nexus,只有某些团队成员才能部署构件,或者更细一些的要求,例如每个项目都有自己的Nexus宿主仓库,且只能部署项目构件至该仓库中。Nexus提供了全面的权限控制特性,能让用户自由地根据需要配置Nexus用户、角色、权限等。

7.1、Nexus的访问控制模型

Nexus是基于权限(Privilege)做访问控制的,服务器的每一个资源都有相应的权限来控制,因此用户执行特定的操作时就必须拥有必要的权限。管理员必须以角色(Role)的方式将权限赋予Nexus用户。例如要访问Nexus界面,就必须拥有Status-(read)这个权限,而Nexus默认配置的角色UI:Basic UI Privileges就包含了这个权限,再将这个角色分配给某个用户,这个用户就能访问Nexus界面了。

用户可以被赋予一个或者多个角色,角色可以包含一个或者多个权限,角色还可以包含一个或者多个其他角色。

Nexus预定义了三个用户,以admin登录后,单击页面左边导航栏中的User链接,就能看到所有已定义用户的列表,如下图所示:
在这里插入图片描述
这三个用户对应了三个权限级别:

  • admin:该用户拥有对Nexus服务的完全控制,默认密码为admin123。
  • deployment:该用户能够访问Nexus,浏览仓库内容,搜索,并且上传部署构件,但是无法对Nexus进行任何配置,默认密码为deployment123。
  • anonymous:该用户对应了所有未登录的匿名用户,它们可以浏览仓库并进行搜索。

理解各个角色的意义对于权限管理至关重要。Nexus预定义的一些常用且重要的角色包括:

  • UI:Basic UI Privileges:包含了访问Nexus界面必须的最基本的权限。
  • UI:Repository Browser:包含了浏览仓库页面所需要的权限。
  • UI:Search:包含了访问快速搜索栏及搜索页面所需要的权限。
  • Repo:All Repositories(Read):给予用户读取所有仓库内容的权限,没有仓库的读权限,用户将无法在仓库页面上看到实际的仓库内容,也无法使用Maven从仓库下载构件。
  • Repo:All Repositories(Full Control):给予用户完全控制所有仓库内容的权限。用户不仅可以浏览、下载构件,还可以部署构件及删除仓库内容。
  • Nexus包含了一个特殊的匿名用户角色(Nexus Anonymous Role),默认配置下没有登录的用户都会拥有该匿名角色的权限。这个匿名用户角色实际包含了上述所列角色中,除Repo:All Repositories(Full Control)之外的所有角色所包含的权限。也就是说,匿名用户可以访问基本的Nexus界面、浏览仓库内容及搜索构件。

除上述角色之外,Nexus还预定义了很多其他角色,它们往往都对应了一个Nexus的功能。例如,UI:Logs and Config Files包含了访问系统日志文件及配置文件所需要的权限。

7.2、为项目分配独立的仓库

在组织内部,如果所有项目都部署快照及发布版构件至同样的仓库,就会存在潜在的冲突及安全问题,我们不想让项目A的部署影响到项目B,反之亦然。解决的方法就是为每个项目分配独立的仓库,并且只将仓库的部署、修改和删除权限赋予该项目的成员,其他用户只能读取、下载和搜索该仓库的内容。

假设项目名称为foo,首先为该项目建立两个宿主仓库Foo Snapshots和Foo Releases,分别用来部署快照构件和发布构件。

在这里插入图片描述
有了仓库之后,就需要创建基于仓库的增、删、改、查权限。在Nexus中,这样的权限是基于Repository Target建立的,Repository Target实际上是一系列正则表达式,在访问仓库某路径下内容的时候,Nexus会将仓库路径与Repository Target的正则表达式一一匹配,以检查权限是否正确。

单击左边导航栏中的Repository Targets链接,就能看到下图所示的页面。图中选中了All(Maven2)这一Repository Target,在下方可以看到它包含了一个值为“.*”的正则表达式,表示该Repository Target能够匹配仓库下的任何路径。
在这里插入图片描述
下一步就是基于该Repository Target和Foo Releases、Foo Snapshots两个仓库建立权限。单击页面左边导航栏中的Privileges链接进入权限页面,然后单击Add按钮,选择Repository Target Privilege。下图所示为创建对应于Foo Releases的权限。
在这里插入图片描述
上图中选择了Foo Releases仓库和All(Maven2),表示创建匹配Foo Releases仓库任何路径的权限。单击Save按钮之后,就能在权限列表中看到相应的增、删、改、查权限,如下图所示:
在这里插入图片描述
然后,遵循同样的步骤,为Foo Snapshots建立增、删、改、查权限。

下一步是创建一个包含上述权限的角色。单击导航栏中的Roles进入角色页面,再单击页面上方的Add按钮并选择Nexus Role。下图所示为将之前建立的权限加入到该角色中。
在这里插入图片描述
角色创建完成之后,根据需要将其分配给Foo项目的团队成员。这样,其他团队的成员默认只能读取Foo Releases和Foo Snapshots的内容,而拥有Foo Deployer角色的用户就可以执行部署构件等操作。

8、Nexus的调度任务

Nexus提供了一系列可配置的调度任务来方便用户管理系统。用户可以设定这些任务运行的方式,例如每天、每周、手动等。调度任务会在适当的时候在后台运行。当然,用户还是能够在界面观察它们的状态的。

要建立一个调度任务,单击左边导航栏中的Scheduled Tasks链接,然后在右边的界面上方单击Add按钮,接着就能看到下图所示的界面。用户可以根据自己的需要,选择任务类型,并配置其运行方式。
在这里插入图片描述
Nexus包含了以下几种类型的调度任务:

  • Download Indexes:为代理仓库下载远程索引。
  • Empty Trash:清空Nexus的回收站,一些操作(如删除仓库文件)实际是将文件移到了回收站中。
  • Evict Unused Proxied Items From Repository Caches:删除代理仓库中长期未被使用的构件缓存。
  • Expire Repository Caches:Nexus为代理仓库维护了远程仓库的信息以避免不必要的网络流量,该任务清空这些信息以强制Nexus去重新获取远程仓库的信息。
  • Publish Indexes:将仓库索引发布成可供m2eclipse和其他Nexus使用的格式。
  • Purge Nexus Timeline:删除Nexus的时间线文件,该文件用于建立系统的RSS源。
  • Rebuild Maven Metadata Files:基于仓库内容重新创建仓库元数据文件maven-meta-data.xml,同时重新创建每个文件的校验和md5和sha1。
  • Reindex Repositories:为仓库编纂索引。
  • Remove Snapshots From Repository:以可配置的方式删除仓库的快照构件。
  • Synchronize Shadow Repository:同步虚拟仓库的内容(服务于Maven 1)。

9、其他私服软件

Nexus不是唯一的Maven私服软件,用户还有另外两个选择,它们分别为Apache的Archiva与JFrog的Artifactory。

Archiva可能是历史最长的Maven私服软件,它早在2005年就作为Apache Maven的一个子项目存在,到2008年3月成为了Apache软件基金会的顶级项目。

大家可以访问http://archiva.apache.org以具体了解Archiva,其站点提供了一些入门指南及邮件列表等信息。Archiva的下载地址为http://archiva.apache.org/download.html。

10、总结

建立并维护自己的私服是使用Maven必不可少的一步,Maven私服软件有Nexus、Archiva和Artifactory,它们都提供了开源的版本供用户下载。我们详细介绍了Nexus的安装和使用,包括如何分辨各种类型的仓库、如何建立仓库索引和搜索构件、如何使用权限管理功能、如何使用调度任务功能等。除了这些功能之外,Nexus还有很多有趣的特性,如RSS源、日志浏览及配置等,用户可以从友好的界面中学习使用。

除了Nexus本身,我们还详述了如何配置Maven从私服下载构件,以及如何发布构件至私服供他人使用。结合了Nexus的帮助之后,再使用Maven时就会如虎添翼。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis 内存机制探索篇

info memory 查看redis 内存使用情况出现的问题,公司在导入大量redis key 的时候,想要看一下redis 内存使用情况 ,发现used_memory_peak_perc 和 used_memory_dataset_perc 马上达到100%,这个时候很慌张,是不是当前red…

SQL Server :关系模式的键码与闭包计算

一、键码的定义 首先我们给出 键码的定义 如下 定义&#xff1a;已知 R<U,F> 是属性集 U 的关系模式&#xff0c;F是属性集 U 上的一组函数依赖&#xff0c;设 K 为 R<U,F> 中的属性或属性组合&#xff0c;若K ⇒ U - K 且 K 的任何真子集都不能决定 U&#xff0c…

TLS、对称/非对称加密、CA认证

1. SSL与TLS SSL/TLS是一种密码通信框架&#xff0c;他是世界上使用最广泛的密码通信方法。SSL/TLS综合运用了密码学中的对称密码&#xff0c;消息认证码&#xff0c;公钥密码&#xff0c;数字签名&#xff0c;伪随机数生成器等&#xff0c;可以说是密码学中的集大成者。 TLS…

甘草书店记: 2023年10月11日 星期三 晴 「做有光的人,照亮他人,也引人同行」

发了两篇《甘草书店记》&#xff0c;书店计划公之于众&#xff0c;收获了不少人的赞扬和鼓励&#xff0c;来自生活中的友人&#xff0c;来自麦田的客户和朋友&#xff0c;来自图书界的同行前辈&#xff0c;也来自商界的同仁。其中&#xff0c;最特别留言来自甘草书店投资方的张…

temu反洗钱协议在哪里签署

反洗钱是国际社会关注的重要议题之一。为了加强国际合作&#xff0c;各国政府积极参与签署反洗钱协议。TEMU反洗钱协议作为国际间的重要合作框架&#xff0c;其签署地点及其意义备受关注。本文将深入探讨TEMU反洗钱协议的签署地点及其背后的意义。 先给大家推荐一款拼多多/temu…

PostgreSQL 元组统计与 pgstattuple 优化

第1章 简介 1.1 参考文档 https://www.percona.com/blog/postgresql-tuple-level-statistics-with-pgstattuple/ 1.2 关于pgstattuble 由于Postgres表膨胀会降低数据库性能&#xff0c;因此我们可以通过消除表膨胀来提高其性能。我们可以使用pgstattuple扩展来识别膨胀的表。 这…

网络和信息系统指令 ( NIS2 ) 及其全球影响

网络和信息系统指令 ( NIS2 ) 将于 2024 年 10 月生效&#xff0c;旨在提高欧盟 (EU) 的网络弹性。 不过&#xff0c;其影响可能会更广泛&#xff0c;带来更严格的流程和控制&#xff0c;并重新定义我们向被视为国家关键的组织提供服务的方式。 该强制性指令将具有效力&#x…

锂电涂布机设备健康管理:降低运维成本的关键

随着锂电池行业的快速发展&#xff0c;锂电涂布机设备作为关键生产工艺装备&#xff0c;扮演着至关重要的角色。然而&#xff0c;涂布机设备的故障和维护成本对于企业来说是一个不可忽视的挑战。本文将介绍做好锂电涂布机设备的健康管理&#xff0c;降低运维成本的关键措施。 锂…

初刷leetcode题目(11)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

Elasticsearch初识--CentOS7安装ES及Kibana

文章目录 一&#xff0e;前言二&#xff0e;介绍1.Elasticsearch2.Kibana 三&#xff0e;ES安装1.下载安装包2.解压、配置2.1 解压2.2 配置 3.启动3.1增加用户3.2启动 4.解决资源分配太少问题5.启动成功 四&#xff0e;Kibana安装1.下载安装包2.解压、配置2.1 解压2.2 配置2.2 …

太快了!文生图片只需1秒,开源SDXL Turbo来啦!

11月29日&#xff0c;著名开源生成式AI平台Stability.ai在官网发布了&#xff0c;开源文生图模型SDXL Turbo。 根据使用体验&#xff0c;SDXL Turbo的生成图像效率非常快&#xff0c;可以做到实时响应&#xff08;可能小于1秒&#xff09;。 在你输入完最后一个文本后&#x…

【优选算法系列】【专题十四优先级队列】第一节.(1046. 最后一块石头的重量和703. 数据流中的第 K 大元素)

文章目录 前言一、最后一块石头的重量 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、数据流中的第 K 大元素 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2…

java第20章节

一.线程简介 二.创建线程 1.继承Thread类 Thread类中常用的两个构造方法如下&#xff1a; public Thread():创建一个新的线程对象。 public Thread(String threadName):创建一个名称为threadName的线程对象。 继承Thread类创建一个新的线程的语法如下&#xff1a; public c…

AI视频智能分析识别技术的发展与EasyCVR智慧安防视频监控方案

随着科技的不断进步&#xff0c;基于AI神经网络的视频智能分析技术已经成为了当今社会的一个重要组成部分。这项技术通过利用计算机视觉和深度学习等技术&#xff0c;实现对视频数据的智能分析和处理&#xff0c;从而为各个领域提供了广泛的应用。今天我们就来介绍下视频智能分…

建立健全涉密测绘外业安全保密管理制度,落实监管人员和保密责任,外业所用涉密计算机纳入涉密单机进行管理

建立健全涉密测绘外业安全保密管理制度&#xff0c;落实监管人员和保密责任&#xff0c;外业所用涉密计算机纳入涉密单机进行管理 1.涉密测绘外业安全保密管理制度 2.外业人员及设备清单&#xff08;包括&#xff1a;外业从业人员名单、工作岗位&#xff0c;外业设备名称、密…

Opencv | 直方图均衡化

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() cv2.calcHist(images,channels,mask,histSize,ranges) - …

Gitee-PicGo-Typora

Gitee-PicGo-Typora 问题引出 问题1&#xff1a;根据相关法律法规和政策&#xff0c;您的部分文件因存在敏感信息而无法显示 就在昨晚&#xff0c; 我在记笔记的时候&#xff0c;发现之前配置的七牛云图床出了问题&#xff1a; 1、根据相关法律法规和政策&#xff0c;您的部…

JAVA进阶之路JVM-3:JVM内存模型,运行时数据区域划分,程序计数器,虚拟机栈,本地方法栈,堆,元空间,字符串常量池

JVM内存模型 对于 Java 程序员来说&#xff0c;在虚拟机自动内存管理机制下&#xff0c;不再需要像 C/C 程序开发程序员这样为每一个操作去写对应的 delete / free 操作&#xff0c;不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序把内new存控制权利交给JVM虚拟机。一旦…

JS动态转盘可自由设置个数与概率

让我为大家介绍一下转盘的实现过程与原理&#xff0c;介绍都放在下面代码块中&#xff0c;一步一步的教会你。 我们转盘使用线段来实现 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style type&quo…

【理解ARM架构】异常处理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 ⚡ARM系统中异常与中断处理流程&#x1f362;向量表&#x1f362;保存现场&#x1f362;恢…