1. 概述
在项目中,有些通用的代码模块,有时候不想通过拷贝这么简单的方式粗暴地实现复用。因为这样不仅体现不了 jar 包的 class 变更的实时性,而且也不利于 jar 统一管理。使用maven deploy的方式,将通用的模块打成 jar 包,发布到 Nexus 服务,让其他的项目来引用,以简洁、高效的方式来实现 jar 复用和管理。
2. maven 的 settings.xml 文件中设置<server>标签
找到 Maven 安装目录的settings.xml文件
C:\devtools\maven-3.5.0\conf\settings.xml
添加如下配置
<server> <id>deploy-release</id> <username>admin</username> <password>admin123</password> </server> <server> <id>deploy-snapshot</id> <username>admin</username> <password>admin123</password> </server>
此处,是设置的账号和密码都是 Nexus 服务的登录的账号和密码
3. 配置项目的 pom.xml 文件
在项目的 pom.xml 文件添加如下配置
<distributionManagement> <repository> <id>nexus-releases</id> <name>Nexus Release Repository</name> <url>http://127.0.0.1:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Nexus Snapshot Repository</name> <url>http://127.0.0.1:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
这里的 IP 地址127.0.0.1
需要根据具体情况换成对应的 IP 地址。点开下图框住的仓库,即可找到这两个仓库地址。
另外,<server>
中的<id>
要和<repository>、<snapshotRepository>
的<id>
一致,maven 在发布时,会根据此 id 来查找相应的账号密码进行登录验证并上传文件。
4. 发布 jar 到 Nexus 服务
在项目的更目录,执行如下命令
mvn deploy
出入以下信息表示发布成功
[INFO] Uploaded: http://127.0.0.1:8081/repository/maven-snapshots/com/omg/olive-web/0.0.1-SNAPSHOT/olive-web-0.0.1-20220319.104535-1.pom (1.4 kB at 2.6 kB/s) [INFO] Downloading: http://127.0.0.1:8081/repository/maven-snapshots/com/omg/olive-web/maven-metadata.xml [INFO] Uploading: http://127.0.0.1:8081/repository/maven-snapshots/com/omg/olive-web/0.0.1-SNAPSHOT/maven-metadata.xml [INFO] Uploaded: http://127.0.0.1:8081/repository/maven-snapshots/com/omg/olive-web/0.0.1-SNAPSHOT/maven-metadata.xml (766 B at 2.5 kB/s) [INFO] Uploading: http://127.0.0.1:8081/repository/maven-snapshots/com/omg/olive-web/maven-metadata.xml [INFO] Uploaded: http://127.0.0.1:8081/repository/maven-snapshots/com/omg/olive-web/maven-metadata.xml (276 B at 938 B/s) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.125 s [INFO] Finished at: 2022-03-19T18:45:38+08:00 [INFO] Final Memory: 15M/37M [INFO] ------------------------------------------------------------------------
在 Nexus 服务也看到发布的 jar 包
5. 发布的灵活配置
maven 会判断版本后面是否带了-SNAPSHOT
,如果带了就发布到 snapshots 仓库,否则发布到 release 仓库。这里可以在 pom.xm l文件中,设置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.omg</groupId> <artifactId>olive-web</artifactId> <version>${project.release.version}</version> <packaging>jar</packaging> <name>olive-web</name> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.release.version>1.0.0-SNAPSHOT</project.release.version> </properties> <profiles> <profile> <id>product</id> <properties> <project.release.version>1.0.0</project.release.version> </properties> </profile> </profiles> <dependencies> </dependencies> <distributionManagement> <repository> <id>deploy-release</id> <name>Nexus Release Repository</name> <url>http://127.0.0.1:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>deploy-snapshot</id> <name>Nexus Snapshot Repository</name> <url>http://127.0.0.1:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement> </project>
通过占位符 ${project.release.version}
来控制需要发布的版本,用命令mvn deploy -P product
,发布olive-web 的 1.0 版本到 releases 库。如果使用命令 mvn deploy
,则默认使用 1.0.0-SNAPSHOT 版本号,将发布 olive-web 的 1.0.0-SNAPSHOT 版本到 snapshots 库。
附
- 部署到 snapshot 仓库时,jar 包会带上时间戳;maven 会自动取相应版本最新的jar包
- 重复部署 release 报错
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project olive-web: Failed to deploy artifacts: Could not transfer artifact com.omg:olive-web:jar:1.0.0 from/to deploy-release (http://127.0.0.1:8081/repository/maven-releases/): Failed to transfer file: http://127.0.0.1:8081/repository/maven-releases/com/omg/olive-web/1.0.0/olive-web-1.0.0.jar. Return code is: 400, ReasonPhrase: Repository does not allow updating assets: maven-releases. -> [Help 1]
部署 release 仓库时,相同版本的 jar 包不能提交。因为 release 的部署策略是disable redeploy
,不允许覆盖更新组件。
解决办法:升级一下版本号,再发布即可。