从零开始搭建 Maven 私有仓库并上传 Jar 包

发布于:2025-02-11 ⋅ 阅读:(28) ⋅ 点赞:(0)

一、为何搭建 Maven 私有仓库?

在开发过程中,搭建 Maven 私有仓库有着诸多重要的优势,以下为你详细阐述:

加速依赖下载

当我们进行项目构建时,如果依赖的是公共的 Maven 中央仓库,由于使用人数众多且服务器可能位于国外等因素,下载速度往往会受到影响,特别是在网络环境不佳或者需要频繁下载大量依赖的时候,等待时间会很长。而搭建了私有仓库后,对于已经下载过的依赖,后续项目再次使用时可以直接从本地的私有仓库获取,无需再从远程仓库重复下载,大大提升了依赖下载的速度,从而让整个项目构建过程更加高效快捷,减少因等待依赖下载而耗费的时间成本。

管理项目依赖

一方面,对于企业内部或者团队开发的一些自定义组件、工具包等,可以方便地将它们打包成 Jar 文件上传到私有仓库中进行统一管理。这样不同的项目若需要使用这些内部的依赖,就能够便捷地从私有仓库引入,保证了依赖使用的规范性和一致性,也便于版本控制。例如,团队开发了一套权限验证的工具包,将其打成 Jar 包上传到私有仓库后,各个微服务项目在需要权限验证功能时,只需在项目配置中引入对应的依赖即可。

另一方面,在应对依赖版本升级等情况时,私有仓库能更好地进行协调管理。在公共的仓库中,依赖更新可能不会及时同步给所有项目开发者,而在私有仓库里,团队可以根据自身的节奏和需求来决定何时对依赖进行升级,并及时通知到相关的项目成员去更新使用,避免因依赖版本不一致而导致的兼容性问题和潜在的项目风险,让项目依赖管理变得更加有序、可控。

总之,搭建 Maven 私有仓库无论是从提升开发效率,还是加强项目依赖的管理等方面来看,都有着显著的积极作用,能为开发工作带来极大的便利。

二、搭建前的准备工作

在着手搭建 Maven 私有仓库之前,确保系统中已经安装配置好 JDK,建议使用 JDK 8 或更高版本。同时,需要从官方网站下载 Nexus 安装包,Nexus 是一款常用的 Maven 仓库管理器,它能够帮助我们高效地搭建和管理私有仓库。根据操作系统的类型(如 Windows、Linux 等),选择对应的 Nexus 安装包进行下载。

三、安装与启动 Nexus

(一)安装步骤

  • Windows 系统
    • 下载 Nexus 安装包(通常为 zip 格式),解压到指定目录,例如 C:\nexus。
    • 进入解压后的 bin 目录,以管理员身份运行命令提示符,执行 nexus.exe /install 安装服务,然后执行 nexus.exe /start 启动服务。
  • Linux 系统
    • 下载 Nexus 安装包(如 tar.gz 格式),将其上传至服务器。
    • 在安装包所在目录执行解压命令,如 tar -zxvf nexus-<version>.tar.gz。解压后会得到 nexus-<version> 目录,进入该目录。
    • 编辑 bin/nexus.rc 文件,设置运行 Nexus 的用户,例如 RUN_AS_USER=root(若不设置,可能因权限问题导致启动失败)。
    • 进入 bin 目录,执行 ./nexus start 启动服务。

(二)启动 Nexus 服务

启动 Nexus 服务后,默认会监听在本地的 8081 端口。在浏览器中输入 http://localhost:8081(Windows 系统)或 http://服务器 IP 地址:8081(Linux 系统),即可访问 Nexus 的管理界面。首次访问时,默认的用户名是 admin,密码可在 sonatype-work/nexus3/admin.password 文件中找到。登录后,建议修改默认密码以确保安全。

四、登录并配置 Nexus 仓库

(一)登录 Nexus

在浏览器中输入 http://localhost:8081(Windows 系统)或 http://服务器 IP 地址:8081(Linux 系统),进入 Nexus 的登录页面。首次登录时,使用默认用户名 admin,密码可在 sonatype-work/nexus3/admin.password 文件中找到。登录成功后,建议立即修改密码,以保障仓库的安全性。修改密码的步骤如下:先关闭 Nexus 服务,然后进入 Nexus 安装目录执行

java -jar./lib/support/nexus-orient-console.jar

接着进入数据库执行

connect plocal:../sonatype-work/nexus3/db/security admin admin

再重置密码

admin/admin123 update user SET password="$shiro1$SHA-512$1024$NE+wqQq/TmjZMvfI7ENh/g==$V4yPw8T64UQ6GfJfxYq2hLsVrBY8D1v+bktfOxGdt4b/9BthpWPNUy/CBk6V9iA0nHpzYzJFWO8v/tZFtES8CA==" UPSERT WHERE id="admin"

最后关闭修改数据库的命令提示符(否则 Nexus 服务无法启动),并重启 Nexus 服务。

(二)仓库配置

Nexus 中有多种仓库类型,其中常用的有 maven-central、maven-public、maven-releases 和 maven-snapshots。

  • maven-central 类型:是代理仓库(Proxy Repository),用于代理 Maven Central 仓库,这是一个全球性的公共仓库,包含了大量的开源库和框架。其特点包括远程索引,Nexus 会定期从 Maven Central 仓库同步元数据和索引,以便快速查找和下载依赖;缓存功能可减少对外部网络的依赖,提高构建速度;并且该仓库是只读的,不能向其上传包,只能从中下载。
  • maven-public 类型:属于组仓库(Group Repository),主要用于聚合多个实际的 Maven 仓库,提供一个统一的访问点。它通常会包含 maven-central、maven-releases 和 maven-snapshots 等仓库,形成一个虚拟的仓库组。开发人员和构建工具只需配置一个 maven-public 仓库的 URL,即可访问所有的 Maven 包,还可根据需要灵活添加或移除组中的仓库。
  • maven-releases 类型:是宿主仓库(Hosted Repository),用于存储正式发布的版本(release)包。这些包都是经过测试和验证的稳定版本,一旦发布,包的内容不能更改。开发人员和持续集成系统可以将发布版本的包部署到 maven-releases 仓库。
  • maven-snapshots 类型:同样是宿主仓库,用于存储开发中的快照(snapshot)版本包。快照版本存储的是开发过程中的中间版本,可能包含未完成的功能或修复,其包内容可以随时更新。Maven 会自动检查并下载最新的快照版本,确保开发环境始终使用最新的代码,开发人员和持续集成系统也可将快照版本的包部署到 maven-snapshots 仓库。

在配置仓库时,需要设置仓库的访问权限和地址。例如,对于 maven-releases 仓库,可以设置只有特定的用户或用户组具有上传和下载权限;对于 maven-snapshots 仓库,可以设置允许开发人员在开发过程中频繁更新快照版本的权限等。仓库地址则根据实际情况确定,如 http://服务器 IP 地址:8081/repository/maven-releases/ 等,以便在项目中能够准确地引用这些仓库。

五、Maven 与私有仓库的连接配置

(一)修改 settings.xml 文件

在 Maven 的 settings.xml 文件中设置私服地址及认证信息。找到 <servers> 标签,在其中添加如下配置:

<server>
    <id>nexus-releases</id>
    <username>your_username</username>
    <password>your_password</password>
</server>
<server>
    <id>nexus-snapshots</id>
    <username>your_username</username>
    <password>your_password</password>
</server>

这里的 id 要与项目 pom.xml 中配置的仓库 id 相对应,username 和 password 则是登录 Nexus 仓库的账号和密码。

同时,在 <mirrors> 标签中配置仓库地址,例如:

<mirror>
    <id>nexus</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus Repository</name>
    <url>http://服务器 IP 地址:8081/repository/maven-public/</url>
</mirror>

上述配置表示将所有的仓库请求都指向我们搭建的 Nexus 私有仓库中的 maven-public 组仓库。

在 <profiles> 标签中配置多仓库使用:

<profile>
    <id>nexus</id>
    <repositories>
        <repository>
            <id>nexus-releases</id>
            <name>Nexus Release Repository</name>
            <url>http://服务器 IP 地址:8081/repository/maven-releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>nexus-snapshots</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://服务器 IP 地址:8081/repository/maven-snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>nexus-releases</id>
            <name>Nexus Release Repository</name>
            <url>http://服务器 IP 地址:8081/repository/maven-releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>nexus-snapshots</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://服务器 IP 地址:8081/repository/maven-snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</profile>

最后,在 <activeProfiles> 标签中激活仓库:

<activeProfile>nexus</activeProfile>

(二)项目 pom.xml 配置

在项目的 pom.xml 文件中指定仓库地址,以便项目能与私有仓库交互。在 <distributionManagement> 标签中添加如下配置:

<distributionManagement>
    <repository>
        <id>nexus-releases</id>
        <name>Nexus Release Repository</name>
        <url>http://服务器 IP 地址:8081/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>nexus-snapshots</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://服务器 IP 地址:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

这里的 id 要与 settings.xml 中配置的服务器 id 一致。

此外,在 <repositories> 标签中添加仓库引用:

<repositories>
    <repository>
        <id>nexus</id>
        <name>Nexus Repository</name>
        <url>http://服务器 IP 地址:8081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

在 <pluginRepositories> 标签中添加插件仓库引用:

<pluginRepositories>
    <pluginRepository>
        <id>nexus</id>
        <name>Nexus Repository</name>
        <url>http://服务器 IP 地址:8081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

六、上传 Jar 包到私有仓库

(一)打包项目

在项目的根目录下,使用 mvn clean package 命令进行项目打包。Maven 会依据项目的配置信息(pom.xml 文件),将项目的源代码、资源文件以及依赖的库文件等进行编译、测试,并最终打包成一个 Jar 文件。打包成功后,在项目的 target 目录下会生成对应的 Jar 包。例如,若项目名为 my-project,则会生成 my-project-1.0-SNAPSHOT.jar(对于快照版本)或 my-project-1.0.jar(对于正式发布版本)等文件,具体的文件名取决于项目的版本号和配置。

(二)上传命令

使用 mvn deploy:deploy-file 命令上传 Jar 包到私有仓库,命令参数如下:

  • DgroupId:Jar 包的 groupId,通常为公司或组织的域名倒序 + 项目名称,例如 com.example.myproject。
  • DartifactId:Jar 包的 artifactId,即项目的名称或模块名称,比如 myproject-utils。
  • Dversion:Jar 包的版本号,如 1.0-SNAPSHOT(快照版本)或 1.0(正式版本)。
  • Dpackaging:上传文件的类型,这里为 jar。
  • Dfile:要上传的 Jar 包的绝对路径,例如 /path/to/myproject-utils-1.0-SNAPSHOT.jar。
  • DpomFile:Jar 包对应的 pom 文件的绝对路径,如果没有则可能会导致依赖传递问题,例如 /path/to/myproject-utils-1.0-SNAPSHOT.pom。
  • Durl:私有仓库的地址,即 Nexus 中对应仓库的 URL,例如 http://服务器 IP 地址:8081/repository/maven-releases/ 或 http://服务器 IP 地址:8081/repository/maven-snapshots/。
  • DrepositoryId:对应 settings.xml 中配置的服务器 id,用于关联私服的用户名和密码,如 nexus-releases 或 nexus-snapshots。

对于正式版的 Jar 包,上传命令示例:

mvn deploy:deploy-file -DgroupId=com.example.myproject -DartifactId=myproject-utils -Dversion=1.0 -Dpackaging=jar -Dfile=/path/to/myproject-utils-1.0.jar -DpomFile=/path/to/myproject-utils-1.0.pom -Durl=http://服务器 IP 地址:8081/repository/maven-releases/ -DrepositoryId=nexus-releases

对于快照版的 Jar 包,上传命令示例:

mvn deploy:deploy-file -DgroupId=com.example.myproject -DartifactId=myproject-utils -Dversion=1.0-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/myproject-utils-1.0-SNAPSHOT.jar -DpomFile=/path/to/myproject-utils-1.0-SNAPSHOT.pom -Durl=http://服务器 IP 地址:8081/repository/maven-snapshots/ -DrepositoryId=nexus-snapshots

执行命令后,Maven 会将 Jar 包上传到指定的私有仓库中,其他项目就可以通过在 pom.xml 文件中配置依赖来使用该 Jar 包了。

七、在其他项目中引用私有仓库的 Jar 包

在其他项目中,若要引用私有仓库中的 Jar 包,只需在项目的 pom.xml 文件中添加相应的依赖配置即可。例如:

<dependency>
    <groupId>com.example.myproject</groupId>
    <artifactId>myproject-utils</artifactId>
    <version>1.0</version>
</dependency>

Maven 会根据配置信息,从私有仓库中下载对应的 Jar 包及其依赖项,然后将其添加到项目的类路径中,使得项目能够顺利使用该 Jar 包提供的功能。


网站公告

今日签到

点亮在社区的每一天
去签到