如何使用极狐GitLab 软件包仓库功能托管 maven?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有:
- 极狐GitLab 中文文档
- 极狐GitLab 中文论坛
- 极狐GitLab 官网
软件包库中的 Maven 包 (BASIC ALL)
在项目的软件包库中发布 Maven 产物。然后,在需要将它们用作依赖项时安装它们。
对于 Maven 软件包管理器客户端使用的特定 API 端点的文档,请查阅 Maven API 文档。
支持的客户端:
-
mvn。
学习如何构建 Maven 包。 -
gradle。
学习如何构建 Gradle 包。 -
sbt。
发布到极狐GitLab 软件包库
软件包仓库认证
您需要一个令牌来发布软件包。根据您尝试实现的不同,有不同的令牌可用。有关令牌的指导,请参阅令牌指南。
创建令牌并在后续过程中使用它。
不要使用未在文档中描述的认证方法。未在文档中描述的认证方法可能在未来被删除。
编辑客户端配置
更新您的配置并使用 HTTP 对 Maven 仓库进行认证。
自定义 HTTP 标头
您必须为您的客户端配置文件添加认证详细信息。
::Tabs
:::TabTitle mvn
令牌类型 | 名称必须是 | 令牌 |
---|---|---|
个人访问令牌 | Private-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
部署令牌 | Deploy-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
CI 作业令牌 | Job-Token | ${CI_JOB_TOKEN} |
NOTE:<name>
字段必须命名以匹配您选择的令牌。
将如下内容添加到您的 settings.xml
文件中:
<settings><servers><server><id>gitlab-maven</id><configuration><httpHeaders><property><name>REPLACE_WITH_NAME</name><value>REPLACE_WITH_TOKEN</value></property></httpHeaders></configuration></server></servers>
</settings>
:::TabTitle gradle
令牌类型 | 名称必须是 | 令牌 |
---|---|---|
个人访问令牌 | Private-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
部署令牌 | Deploy-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
CI 作业令牌 | Job-Token | System.getenv("CI_JOB_TOKEN") |
NOTE:<name>
字段必须命名以匹配您选择的令牌。
在您的 GRADLE_USER_HOME 目录 中,创建一个包含以下内容的文件 gradle.properties
:
gitLabPrivateToken=REPLACE_WITH_YOUR_TOKEN
添加 repositories 部分到您的 build.gradle
文件:
- 在 Groovy DSL 中:
repositories {maven {url "https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven"name "GitLab"credentials(HttpHeaderCredentials) {name = 'REPLACE_WITH_NAME'value = gitLabPrivateToken}authentication {header(HttpHeaderAuthentication)}}
}
- 在 Kotlin DSL 中:
repositories {maven {url = uri("https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven")name = "GitLab"credentials(HttpHeaderCredentials::class) {name = "REPLACE_WITH_NAME"value = findProperty("gitLabPrivateToken") as String?}authentication {create("header", HttpHeaderAuthentication::class)}}
}
::EndTabs
Basic HTTP 认证
您还可以使用 basic HTTP 认证来和 Maven 软件包仓库进行认证。
::Tabs
:::TabTitle mvn
令牌类型 | 名称必须是 | 令牌 |
---|---|---|
个人访问令牌 | Private-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
部署令牌 | Deploy-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
CI 作业令牌 | gitlab-ci-token | ${CI_JOB_TOKEN} |
将如下内容添加到您的 settings.xml
文件中:
<settings><servers><server><id>gitlab-maven</id><username>REPLACE_WITH_NAME</username><password>REPLACE_WITH_TOKEN</password><configuration><authenticationInfo><userName>REPLACE_WITH_NAME</userName><password>REPLACE_WITH_TOKEN</password></authenticationInfo></configuration></server></servers>
</settings>
:::TabTitle gradle
令牌类型 | 名称必须是 | 令牌 |
---|---|---|
个人访问令牌 | `Private-Token | ` 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
部署令牌 | Deploy-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
CI 作业令牌 | gitlab-ci-token | System.getenv("CI_JOB_TOKEN") |
在您的 GRADLE_USER_HOME 目录 中,创建一个包含以下内容的文件 gradle.properties
:
gitLabPrivateToken=REPLACE_WITH_YOUR_TOKEN
添加 repositories 部分到您的 build.gradle
文件:
- 在 Groovy DSL 中:
repositories {maven {url "https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven"name "GitLab"credentials(PasswordCredentials) {username = 'REPLACE_WITH_NAME'password = gitLabPrivateToken}authentication {basic(BasicAuthentication)}}
}
- 在 Kotlin DSL 中:
repositories {maven {url = uri("https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven")name = "GitLab"credentials(BasicAuthentication::class) {username = "REPLACE_WITH_NAME"password = findProperty("gitLabPrivateToken") as String?}authentication {create("basic", BasicAuthentication::class)}}
}
:::TabTitle sbt
令牌类型 | 名称必须是 | 令牌 |
---|---|---|
个人访问令牌 | Private-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
部署令牌 | Deploy-Token | 按原样粘贴令牌,或者定义一个环境变量来存储该令牌。 |
CI 作业令牌 | gitlab-ci-token | sys.env.get("CI_JOB_TOKEN").get |
对于 SBT 的认证是基于 basic HTTP 认证。所以您必须提供名称和密码。
NOTE:<name>
字段必须命名以匹配您选择的令牌。
要通过使用 sbt
来从 Maven 极狐GitLab 软件包仓库安装软件包,您必须配置 Maven 解析器。如果您访问私人或内部项目或组,您需要设置凭据。
在配置解析器和认证后,您可以从项目,组或命名空间中安装软件包。
在您的 build.sbt
中,添加如下行:
resolvers += ("gitlab" at "<endpoint url>")credentials += Credentials("GitLab Packages Registry", "<host>", "<name>", "<token>")
在此示例中:
-
<endpoint url>
是 端点 URL。示例:https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven。
-
<host>
是<endpoint url>
中的主机,不包括协议方案或端口。示例:gitlab.example.com。
-
<name>
和<token>
详见上表。
::EndTabs
名称约定
您可以使用三种端点中的一种来安装 Maven 软件包。您必须将软件包发布到项目,但是您选择的端点决定您添加到 pom.xml 文件中的设置。
三种端点是:
-
项目级别:当您有少量 Maven 软件包时使用它,而且他们不在同一个极狐GitLab 群组中。
-
群组级别:当您想要从相同极狐GitLab 群组的众多不同项目安装软件包时使用它。极狐GitLab 不保证群组中的软件包名称的唯一性。您可以有两个项目具有相同的软件包名称和软件包版本。因此,GitLab 为您提供最新的软件包。
-
实例级别:当您有许多不同群组的软件包时使用它。
对于实例级别端点,请确保您 Maven pom.xml
中的相关部分如下所示:
<groupId>group-slug.subgroup-slug</groupId><artifactId>project-slug</artifactId>
仅和项目具有相同路径的软件包 能够通过实例级端点暴露。
项目 | 软件包 | 可用的实例级别的端点 |
---|---|---|
foo/bar | foo/bar/1.0-SNAPSHOT | Yes |
gitlab-org/gitlab | foo/bar/1.0-SNAPSHOT | No |
gitlab-org/gitlab | gitlab-org/gitlab/1.0-SNAPSHOT | Yes |
端点 URL
端点 | pom.xml 的端点 URL | 额外信息 |
---|---|---|
项目 | https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven | 将 gitlab.example.com 替换为您的域名名称。 用您的群组 ID 替换 <group_id> ,可以在项目概览页面上找到。 |
群组 | https://gitlab.example.com/api/v4/groups/<group_id>/-/packages/maven | 将 gitlab.example.com 替换为您的域名名称。用您的群组 ID 替换 <group_id> ,可以在群组主页上找到 ID。 |
示例 | https://gitlab.example.com/api/v4/packages/maven | 将 gitlab.example.com 替换为您的域名名称。 |
编辑发布用的配置文件
您必须为您的客户端配置文件添加认证详细信息。
::Tabs
:::TabTitle mvn
不管你选择哪个端点,你必须有:
- 在
distributionManagement
部分中有一个项目指定的 URL。 - 一个
repository
和distributionManagement
部分。
Maven pom.xml
中相关 repository
部分的内容如下:
<repositories><repository><id>gitlab-maven</id><url><your_endpoint_url></url></repository>
</repositories>
<distributionManagement><repository><id>gitlab-maven</id><url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url></repository><snapshotRepository><id>gitlab-maven</id><url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url></snapshotRepository>
</distributionManagement>
-
id 是您在 settings.xml 中定义的 ID。
-
<your_endpoint_url> 依赖于您选择的 端点。
-
将 gitlab.example.com 替换为您的域名。
:::TabTitle gradle
要使用 Gradle 发布软件包:
1.将 Gradle 插件 maven-plugin
添加到插件部分:
- 在 Groovy DSL 中:
plugins {id 'java'id 'maven-publish'
}
- 在 Kotlin DSL 中:
plugins {java`maven-publish`
}
2.添加 publishing
部分:
- 在 Groovy DSL 中:
publishing {publications {library(MavenPublication) {from components.java}}repositories {maven {url "https://gitlab.example.com/api/v4/projects/<PROJECT_ID>/packages/maven"credentials(HttpHeaderCredentials) {name = "REPLACE_WITH_TOKEN_NAME"value = gitLabPrivateToken // the variable resides in $GRADLE_USER_HOME/gradle.properties}authentication {header(HttpHeaderAuthentication)}}}
}
- 在 Kotlin DSL 中:
publishing {publications {create<MavenPublication>("library") {from(components["java"])}}repositories {maven {url = uri("https://gitlab.example.com/api/v4/projects/<PROJECT_ID>/packages/maven")credentials(HttpHeaderCredentials::class) {name = "REPLACE_WITH_TOKEN_NAME"value =findProperty("gitLabPrivateToken") as String? // the variable resides in $GRADLE_USER_HOME/gradle.properties}authentication {create("header", HttpHeaderAuthentication::class)}}}
}
::EndTabs
发布软件包
WARNING:使用 DeployAtEnd
选项可以导致上传被拒绝 400 bad request {"message":"Validation failed: Name has already been taken"}
。
在您设置认证和选择发布端点后,发布 Maven 软件包到您的项目。
::Tabs
:::TabTitle mvn
要使用 Maven 发布软件包:
mvn deploy
如果部署成功,构建成功消息应显示为:
...
[INFO] BUILD SUCCESS
...
消息应该显示软件包已成功发布到正确的位置:
Uploading to gitlab-maven: https://example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.jar
:::TabTitle gradle
运行发布任务:
gradle publish
前往您项目的 软件包和仓库 页面并查看发布的软件包。
:::TabTitle sbt
在您的 build.sbt
文件中配置 publishTo
设置:
publishTo := Some("gitlab" at "<endpoint url>")
确保正确引用了凭据。查看sbt
文档了解更多信息。
使用 sbt
来发布软件包:
sbt publish
如果部署成功,构建成功消息应显示为:
[success] Total time: 1 s, completed Jan 28, 2020 12:08:57 PM
检查成功消息以确保软件包已成功发布到正确的位置:
[info] published my-project_2.12 to https://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/my-project_2.12/0.1.1-SNAPSHOT/my-project_2.12-0.1.1-SNAPSHOT.pom
::EndTabs
安装软件包
要从极狐GitLab 软件包仓库安装软件包,您必须配置远程和认证。当完成这些后,您就可以从项目、群组或命名空间安装软件包了。
如果多个包具有相同的名称和版本,当您安装包时,最近发布的包将被检索。
为了以防没有足够的权限来读取最近发布的包从而导致 403 Forbidden
返回。
::Tabs
:::TabTitle mvn
使用 mvn install
来安装软件包:
1.手动添加依赖到您项目的 pom.xml
文件中。要添加早前创建的示例,XML 如下所示:
<dependency><groupId>com.mycompany.mydepartment</groupId><artifactId>my-project</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
2.在您的项目中,运行如下内容:
mvn install
消息应该展示软件包正在从软件包库下载:
Downloading from gitlab-maven: http://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.pom
您还可以使用 Maven dependency:get
命令 直接安装软件包。
1.在您项目的目录中运行:
mvn dependency:get -Dartifact=com.nickkipling.app:nick-test-app:1.1-SNAPSHOT -DremoteRepositories=gitlab-maven::::<gitlab endpoint url> -s <path to settings.xml>
-
<gitlab endpoint url>
is the URL of the GitLab endpoint. -
<path to settings.xml>
is the path to the settings.xml file that contains the authentication details. -
<gitlab endpoint url>
是极狐GitLab 的端点 URL。
NOTE:命令(gitlab-maven
)和 settings.xml
文件中的仓库 ID 必须匹配。
The message should show that the package is downloading from the package registry:
Downloading from gitlab-maven: http://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.pom
:::TabTitle gradle
通过使用 gradle
来安装软件包:
在依赖部分,将依赖添加到 build.gradle
中:
- 在 Groovy DSL 中:
dependencies {implementation 'com.mycompany.mydepartment:my-project:1.0-SNAPSHOT'
}
- 在 Kotlin DSL 中:
dependencies {implementation("com.mycompany.mydepartment:my-project:1.0-SNAPSHOT")
}
在您的项目中,运行如下命令:
gradle install
:::TabTitle sbt
通过使用 sbt
来安装软件包:
1.将内联依赖 添加到 build.sbt
:
libraryDependencies += "com.mycompany.mydepartment" % "my-project" % "8.4"
2.在您的项目中,运行如下命令:
sbt update
::EndTabs
Maven 软件包的 CI/CD 集成
您可以使用 CI/CD 来自动化构建、测试和发布 Maven 软件包。此部分中的示例涵盖了诸如下面情况下的场景:
- 多模块项目
- 版本化发布
- 条件发布
- 代码质量和安全扫描的集成
您可以根据您的特定项目需求适配和组合这些示例。
记得根据项目需求调整 Maven 版本、Java 版本以及其他相关版本。此外,确保您正确配置了发布到极狐GitLab 软件包库所需的凭据和设置。
基本的 Maven 软件包发布和构建
如下的示例配置了一个构建和发布 Maven 软件包的流水线:
image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/stages:- build- test- publishbuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testscript:- mvn $MAVEN_CLI_OPTS testpublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployrules:- if: $CI_COMMIT_BRANCH == "main"
具有并行作业的多模块 Maven 项目
对于具有多模块的大型项目,您可以使用并行作业来加速构建过程:
image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/stages:- build- test- publishbuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testparallel:matrix:- MODULE: [module1, module2, module3]script:- mvn $MAVEN_CLI_OPTS test -pl $MODULEpublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployrules:- if: $CI_COMMIT_BRANCH == "main"
使用标签来版本化发布
下面的示例演示了当标签发布时,创建版本化发布:
image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/stages:- build- test- publish- releasebuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testscript:- mvn $MAVEN_CLI_OPTS testpublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployonly:- mainrelease:stage: releasescript:- mvn versions:set -DnewVersion=${CI_COMMIT_TAG}- mvn $MAVEN_CLI_OPTS deployrules:- if: $CI_COMMIT_TAG
基于变更进行条件化发布
下面的示例演示了仅当特定文件变更时,发布软件包:
image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/stages:- build- test- publishbuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testscript:- mvn $MAVEN_CLI_OPTS testpublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployonly:- mainrules:- changes:- pom.xml- src/**/*
集成代码质量和安全扫描
下面的示例演示了将代码质量检查和安全扫描集成到流水线中:
image: maven:3.8.5-openjdk-17variables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"include:- template: Security/SAST.gitlab-ci.yml- template: Code-Quality.gitlab-ci.ymlcache:paths:- .m2/repository/- target/stages:- build- test- quality- publishbuild:stage: buildscript:- mvn $MAVEN_CLI_OPTS compiletest:stage: testscript:- mvn $MAVEN_CLI_OPTS testcode_quality:stage: qualitysast:stage: qualitypublish:stage: publishscript:- mvn $MAVEN_CLI_OPTS deployrules:- if: $CI_COMMIT_BRANCH == "main"
有用的提示
发布具有相同名称和版本的软件包
当您发布和既有软件包具有相同名称和版本的软件包,新的软件包文件会被添加到既有软件包。您还可以使用 UI 或 API 来访问并查看既有软件包的旧文件。
要删除旧软件包版本,请考虑使用软件包 API 或 UI。
不允许重复的 Maven 软件包
- 在极狐GitLab 15.0 中,所需角色从开发者改为维护者。
- 在极狐GitLab 17.0 中,所需角色从维护者改为所有者。
要阻止用户发布重复的 Maven 软件包,您可以使用 GraphQl API 或 UI。
在 UI 上:
1.在左侧导航栏,选择 搜索或前往 并找到您的群组。
2.选择 设置 > 软件包与镜像库。
3.在 Maven 行中的 允许重复软件包,关闭 允许重复 开关。
4.可选的。在 例外 文本框中,输入与您要允许的包的名称和/或版本匹配的正则表达式 pattern。
您的更改将自动保存。
请求转发至 Maven Central
- 在极狐GitLab 17.0 中,所需角色从维护者改为所有者。
FLAG:默认情况下,此功能在私有化部署上不可用。要启用此功能,管理员可以启用名称为 maven_central_request_forwarding
的功能标志。此功能在 JihuLab.com 上不可用。
当在软件包仓库中未发现 Maven 软件包,请求会转发到 Maven Central。
当启用功能标志时,管理员可以在持续集成设置中禁用此行为。
Maven 转发被限制到项目级别和群组级别端点。实例级端点具有命名限制,阻止它用于不遵循该约定的包,并且还为供应链式攻击引入了过多的安全风险。
针对 mvn
的额外信息
当使用 mvn
时,有很多种方法来配置您的 Maven 项目,以便它从极狐GitLab 请求 Maven Central 中的包。Maven 仓库按特定顺序查询。默认情况下,Maven Center 通常会先通过 Super POM 进行检查,所以需要配置极狐GitLab 在 maven-central 之前被查询。
要确保所有的软件包请求被发送到极狐GitLab 而不是 Maven Central,您可以通过在 settings.xml
中添加 <mirror>
部分来覆盖 Maven Central 作为中央仓库:
<settings><servers><server><id>central-proxy</id><configuration><httpHeaders><property><name>Private-Token</name><value><personal_access_token></value></property></httpHeaders></configuration></server></servers><mirrors><mirror><id>central-proxy</id><name>GitLab proxy of central repo</name><url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url><mirrorOf>central</mirrorOf></mirror></mirrors>
</settings>
使用极狐GitLab CI/CD 创建 Maven 软件包
当您配置您的仓库使用 Maven 软件包仓库时,您可以配置极狐GitLab CI/CD 来自动化构建新的软件包。
::Tabs
:::TabTitle mvn
每次当默认分支更新时,您都可以创建一个新软件包。
1.创建 ci_settings.xml
文件,该文件作为 Maven 的 settings.xml
文件。
2.使用您在 pom.xml
文件中定义的相同 ID 来添加 server
部分。例如,使用 gitlab-maven
作为 ID:
<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd"><servers><server><id>gitlab-maven</id><configuration><httpHeaders><property><name>Job-Token</name><value>${CI_JOB_TOKEN}</value></property></httpHeaders></configuration></server></servers>
</settings>
3.确保您的 pom.xml
文件包含如下内容。您可以让 Maven 使用预定义的 CI/CD 变量,如此示例所示,或者您可以硬编码您服务器的主机名和项目 ID。
<repositories><repository><id>gitlab-maven</id><url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url></repository>
</repositories>
<distributionManagement><repository><id>gitlab-maven</id><url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url></repository><snapshotRepository><id>gitlab-maven</id><url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url></snapshotRepository>
</distributionManagement>
4.在您的 .gitlab-ci.yml
文件中添加 deploy 作业:
deploy:image: maven:3.6-jdk-11script:- 'mvn deploy -s ci_settings.xml'rules:- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
5.将这些文件推送到仓库。
下次 deploy
作业运行时,它将 ci_settings.xml
复制到用户的 home 目录中。在此示例中:
- 用户是
root
,因为作业在 Docker 容器中运行。 - Maven 使用配置的 CI/CD 变量。
:::TabTitle gradle
每当默认分支更新时,您都可以创建一个软件包。
1.在 Gradle 中使用 CI 作业令牌进行认证。
2.在您的 .gitlab-ci.yml
文件中添加 deploy
作业:
deploy:image: gradle:6.5-jdk11script:- 'gradle publish'rules:- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3.提交文件到您的仓库。
当流水线成功时,Maven 软件包就会被创建。
::EndTabs
版本验证
通过使用如下正则表达式来验证版本字符串。
\A(?!.*\.\.)[\w+.-]+\z
为快照和版本部署使用不同的设置
要为快照和发布使用不同的 URL 或设置:
- 在
pom.xml
的<distributionManagement>
部分,定义<repository>
和<snapshotRepository>
元素。
有用的 Maven 命令行选项
当使用极狐GitLab CI/CD 执行任务时,您可以使用一些有用的 Maven 命令行选项。
文件转移进度使得 CI 日志难以阅读。在 3.6.1
中添加了选项 -ntp,--no-transfer-progress
。另外,可以查看 -B
,--batch-mode
或更低级的日志更改。
- 指定找到
pom.xml
文件(-f,--file)
的位置:
package:script:- 'mvn --no-transfer-progress -f helloworld/pom.xml package'
- 指定找到用户设置
(-s,--settings)
的位置而不是默认位置。还有一个-gs
,--global-settings
选项:
package:script:- 'mvn -s settings/ci.xml package'
支持的 CLI 命令
极狐GitLab Maven 仓库支持如下的 CLI 命令:
::Tabs
:::TabTitle mvn
-
mvn deploy
:发布软件包到软件包仓库。 -
mvn install
:在您的 Maven 项目中安装软件包。 -
mvn dependency:get
:安装特定的软件包。
:::TabTitle gradle
-
gradle publish
:发布您的软件包到软件包仓库。 -
gradle install
:在您的 Gradle 项目中安装软件包。
::EndTabs
故障排查
当使用极狐GitLab Maven 软件包仓库时,您可能会遇到问题。为了解决常见的问题,尝试这些步骤:
- 验证认证 - 确保您的认证令牌正确且未过期。
- 检查权限 - 确保您有发布或安装软件包的必要权限。
- 验证 Maven 设置 - 确保您的
settings.xml
文件配置正确。 - 查看极狐GitLab CI/CD 日志 - 对于 CI/CD 问题,请仔细检查作业日志中的错误消息。
- 确保正确的端点 URL - 确保您使用正确的项目或组的端点 URL。
- 使用
-s
选项进行mvn
命令 - 永远使用-s
选项,例如,mvn package -s settings.xml
。没有该选项,认证设置可能无法应用,Maven 可能无法找到软件包。
清楚缓存
要改善性能,客户端缓存文件与软件包相关联。如果您遇到问题,请使用这些命令清除缓存:
::Tabs
:::TabTitle mvn
rm -rf ~/.m2/repository
:::TabTitle gradle
rm -rf ~/.gradle/caches # Or replace ~/.gradle with your custom GRADLE_USER_HOME
::EndTabs
查看网络跟踪日志
如果您遇到了 Maven 仓库相关的问题,您可能想要查看网络跟踪日志。
比如,使用个人访问令牌运行 mvn deploy
本地并使用这些选项:
mvn deploy \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient=trace \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient.wire=trace
WARNING:当您设置这些选项时,所有网络请求都被记录,并生成大量输出。
验证您的 Maven 设置
如果您在 CI/CD 中遇到了与 settings.xml
文件相关的问题,尝试添加一个额外的脚本任务或作业来验证有效设置。
help 插件还能够提供环境变量,包括环境变量:
mvn-settings:script:- 'mvn help:effective-settings'package:script:- 'mvn help:system'- 'mvn package'
当尝试发布软件包时候遇到 “401 Unauthorized” 错误
这通常意味着认证问题。请检查:
- 您的令牌有效且未过期。
- 您正在使用正确的令牌类型(个人访问令牌、发布令牌或 CI/CD 作业令牌)
- 令牌具有必要的权限(
api
、read_api
或read_repository
)。 - 对于 Maven 项目,您应该使用
-s
选项(例如,mvn deploy -s settings.xml
)。如果没有该选项,Maven 将不会应用您的settings.xml
文件中的认证设置,导致未授权错误。
具有 “Validation failed: Version is invalid” 消息的错误 “400 Bad Request”
极狐GitLab 有针对版本字符串的特定要求。确保您的版本符合格式:
^(?!.*\.\.)(?!.*\.$)[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*(\+[0-9A-Za-z-]+)?$
比如,“1.0.0”、“1.0-SNAPSHOT” 和 “1.0.0-alpha” 是有效的,但 “1…0” 或 “1.0.” 不是(符合标准的)。
当发布时提示 “Artifact already exists” 错误
当您尝试发布一个已经存在的软件包时,可能会遇到此错误。要解决此错误:
- 在发布之前增加您的软件包版本。
- 如果您使用 SNAPSHOT 版本,确保您在配置中允许覆盖 SNAPSHOT 版本。
未在 UI 中显示已发布的软件包
如果您已经发布了软件包,它可能需要几分钟才能显示。如果它仍然没有显示,则:
- 确保您有查看软件包的权限。
- 检查您的 CI/CD 日志或 Maven 输出是否成功发布软件包。
- 确保您正在查看正确的项目或群组。
Maven 仓库依赖冲突
可以通过如下方法来解决依赖冲突:
- 在您的
pom.xml
中显式定义版本。 - 使用 Maven 的依赖管理部分来控制版本。
- 使用
<exclusions>
标签来排除冲突的传递依赖。
“Unable to find valid certification path to requested target” 错误
这是一个典型的 SSL 证书错误。要解决此问题:
- 确保您的 JDK 信任极狐GitLab 服务器的 SSL 证书。
- 如果使用自签名证书,请将其添加到您的 JDK 的信任存储库。
- 作为最后的选择,您可以在 Maven 设置中禁用 SSL 验证。不推荐在生产环境中使用。
“No plugin found for prefix” 流水线错误
这通常意味着 Maven 无法找到插件。要修复此问题:
- 确保插件正确定义在您的
pom.xml
中。 - 检查您的 CI/CD 配置是否使用正确的 Maven 设置文件。
- 确保您的流水线有访问所有必要的仓库的权限。
相关文章:
如何使用极狐GitLab 软件包仓库功能托管 maven?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 Maven 包 (BASIC ALL) 在项目的软件包库中发布 Maven 产物。然后,在需要将它们用作依赖项时安装它…...
Notion Windows桌面端快捷键详解
通用导航 这些快捷键帮助用户在 Notion 的界面中快速移动。 打开 Notion:Ctrl T 打开一个新的 Notion 窗口或标签页,方便快速进入工作空间。返回上一页:Ctrl [ 导航回之前查看的页面。前进到下一页:Ctrl ] 跳转到导航历史中的…...
企业智能化第一步:用「Deepseek+自动化」打造企业资源管理的智能中枢
随着Deepseek乃至AI人工智能技术在企业中得到了广泛的关注和使用,多数企业开始了AI探索之旅,迅易科技也不例外,且在不断地实践中强化了AI智能应用创新的强大能力。 为解决企业知识管理碎片化、提高内部工作效率等问题,迅易将目光放…...
GoFly企业版框架升级2.6.6版本说明(框架在2025-05-06发布了)
前端框架升级说明: 1.vue版本升级到^3.5.4 把"vue": "^3.2.40",升级到"vue": "^3.5.4",新版插件需要时useTemplateRef,所以框架就对齐进行升级。 2.ArcoDesign升级到2.57.0(目前最新2025-02-10&a…...
LeapVAD:通过认知感知和 Dual-Process 思维实现自动驾驶飞跃——论文阅读
《LeapVAD: A Leap in Autonomous Driving via Cognitive Perception and Dual-Process Thinking》2025年1月发表,来自浙江大学、上海AI实验室、慕尼黑工大、同济大学和中科大的论文。 尽管自动驾驶技术取得了显著进步,但由于推理能力有限,数…...
ps信息显示不全
linux执行ps是默认宽度是受限制的,例如: ps -aux 显示 遇到这种情况,如果显示的信息不是很长可以添加一个w参数来放宽显示宽度 ps -auxw 显示 再添加一个w可以接触宽度限制,有多长就显示多长 ps -auxww 显示...
性能比拼: Redis Streams vs Pub/Sub
本内容是对知名性能评测博主 Anton Putra Redis Streams vs Pub/Sub: Performance 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在这个视频中,我们首先将介绍 Redis Streams 和 Redis Pub/Sub 之间的区别。然后,我们将在 AWS 上运行一个基准…...
实践004-Gitlab CICD部署应用
文章目录 Gitlab CICD部署应用部署设计集成Kubernetes后端Java项目部署创建gitlab部署项目创建部署文件创建流水线提交流水线 前端Web项目部署创建gitlab部署项目创建部署文件创建流水线提交流水线 Gitlab CICD部署应用 部署设计 对于前后端服务都基于 Kubernetes 进行部署&a…...
二叉树与优先级队列
1.树 树是由n个数据构成的非线性结构,它是根朝上,叶朝下。 注意:树形结构之中,子树之间不能连接,不然就不构成树形结构 1.子树之间没有交集 2.除了根节点以外,每一个节点有且只有一个父亲节点 3.一个n个…...
如何使用极狐GitLab 软件包仓库功能托管 npm?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 npm 包 (BASIC ALL) npm 是 JavaScript 和 Node.js 的默认包管理器。开发者使用 npm 共享和重用代码ÿ…...
uniapp自定义底部导航栏h5有效果小程序无效的解决方案
在使用 uni-app 开发跨端应用时,常见问题之一是自定义底部导航栏(tabbar)在H5端有效,但在小程序端无效。这是因为小程序端的页面结构和生命周期与H5有差异,且小程序端的原生tabbar有更高的优先级,覆盖了自定…...
开发搭载阿里云平台的物联网APP(支持数据接收与发送)
一、开发环境准备 工具安装 HBuilderX:下载并安装最新版(支持Vue.js和uni-app框架)阿里云IoT SDK:使用JavaScript版SDK(如aliyun-iot-mqtt或mqtt.js)插件安装:HBuilderX插件市场搜索安装mqtt相关…...
Flowchart 流程图的基本用法
以下是 Flowchart 流程图 的基本用法整理,涵盖核心概念、符号含义、绘制步骤及注意事项,助你高效表达流程逻辑: 一、流程图的核心作用 可视化流程:将复杂步骤转化为直观图形,便于理解和分析。梳理逻辑:明确…...
Excel模版下载文件导入
工作中经常遇到Excel模板下载,然后填好后再导入的情况,简单记录下,方便下次使用 Excel模版下载(返回Base64) 模板文件存放位置 import java.util.Base64; import org.apache.commons.io.IOUtils; import org.sprin…...
深入了解linux系统—— 进程控制
进程创建 fork函数 在Linux操作系统中,我们可以通过fork函数来创建一个子进程; 这是一个系统调用,创建子进程成功时,返回0给子进程,返回子进程的pid给父进程;创建子进程失败则返回-1给父进程。 我们就可…...
【前端基础】7、CSS的字体属性(font相关)
一、font-size:设置字体大小 设置方法: 具体数值单位 例如:100px 也可以用em为单位:1em代表100%,2em代表200%……0.5em代表50%。 px方式: em方式: 但是设置em的时候具体是多大呢?…...
学习整理使用php将SimpleXMLElement 对象解析成数组格式的方法
学习整理使用php将SimpleXMLElement 对象解析成数组格式的方法 要将 SimpleXMLElement 对象解析成数组格式,您可以使用 PHP 的 json_decode 和 json_encode 函数。首先,将 SimpleXMLElement 对象转换为 JSON 字符串,然后将这个字符串解码成数…...
MSF(3)免杀混淆
声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 一、前言 前面说了木马的捆绑,dll,exe,hta等密…...
经典密码学算法实现
# AES-128 加密算法的规范实现(不使用外部库) # ECB模式S_BOX [0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0x…...
idea里maven自定义的setting.xml文件不生效问题
问题描述: 内网环境中:maven选择选择自定义的maven文件夹时,使用的是自定义的setting.xml和本地仓库,怎么都读取不到仓库的依赖; 分析: 1.可能是setting.xml文件里没有配置本地仓库的路径; 2…...
注意力机制(Attention)
1. 注意力认知和应用 AM: Attention Mechanism,注意力机制。 根据眼球注视的方向,采集显著特征部位数据: 注意力示意图: 注意力机制是一种让模型根据任务需求动态地关注输入数据中重要部分的机制。通过注意力机制&…...
【java】使用iText实现pdf文件增加水印功能
maven依赖 <dependencies><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version><type>pom</type></dependency> </dependencies>实现代码 前…...
TextIn ParseX重磅功能更新:支持切换公式输出形式、表格解析优化、新增电子档PDF去印章
ParseX重要版本更新内容速读 - 新增公式解析参数 formula_level,支持 LaTeX / Text 灵活切换; - 表格解析优化单元格内换行输出; - 导出excel时,图片链接放在单元格内; - 新增电子档pdf去印章功能。 体验文档解析…...
禁止idea联网自动更新通过防火墙方式
防火墙方式禁止idea更新检测,解决idea无限循环触发密钥填充流程。 1.首先打开控制面板找到高级设置 2.点击出站规则 3.新建规则 4.选择程序 5.找到idea路径 6.下一步 7.阻止连接 8.全选 9.输入禁止idea的名称 10.至此idea自动更新禁用完成...
面向智能体开发的声明式语言:可行性分析与未来图景
面向智能体开发的声明式语言:可行性分析与未来图景 一、技术演进的必然性:从“脚本化AI”到“声明式智能体” 当前AI开发仍停留在“脚本化AI”阶段:开发者通过Python/Java编写条件判断调用LLM API,如同用汇编语言编写操作系统。…...
【Bug经验分享】SourceTree用户设置必须被修复/SSH 主机密钥未缓存(踩坑)
文章目录 配置错误问题原因配置错误问题解决主机密钥缓存问题原因主机密钥缓存问题解决 更多相关内容可查看 配置错误问题原因 电脑太卡,曾多次强制关机,在关机前没有关闭SourceTree,导致配置错误等问题 配置错误问题解决 方式一ÿ…...
http Status 400 - Bbad request 网站网页经常报 HTTP 400 错误,清缓存后就好了的原因
目录 一、HTTP 400 错误的常见成因(一)问题 URL(二)缓存与 Cookie 异常(三)请求头信息错误(四)请求体数据格式不正确(五)文件尺寸超标(六)请求方法不当二、清缓存为何能奏效三、其他可以尝试的解决办法(一)重新检查 URL(二)暂时关闭浏览器插件(三)切换网络环…...
六个仓库合并为一个仓库,保留master和develop分支的bat脚本
利用git subtree可以实现多个仓库合并为一个仓库,手动操作起来太麻烦了,今天花了点时间写了一个可执行的脚本,现在操作起来就方便多了。 1、本地新建setup.bat文件 2、用编辑器打开(我用的是Notepad) 3、把下面代码…...
新能源汽车中的NVM计时与RTC计时:区别与应用详解
在新能源汽车的电子控制系统中,时间管理至关重要,而NVM计时(Non-Volatile Memory Timing)和RTC计时(Real-Time Clock)是两种不同的时间记录机制。虽然它们都与时间相关,但在工作原理、应用场景和…...
✨WordToCard使用分享✨
家人们,今天发现了一个超好用的工具——WordToCard!😜 它可以把WordToCard文档转换成漂亮的知识卡片,学习笔记、知识整理和内容分享都变得超轻松~🤗 支持各种WordToCard语法,像标题、列表、代…...
内网和外网怎么互通?外网访问内网的几种简单方式
在企业或家庭网络中,经常会遇到不同内网环境下网络互通问题。例如,当公司本地局域网内有个办公OA网站,在办公室内电脑上网可以登录使用,但在家带宽下就无法直接通信访问到。这就需要我们采取一些实用的内外网互通技巧来解决这个问…...
Mac中Docker下载与安装
目录 Docker下载安装配置 版本查询以及问题处理配置国内镜像在Docker中安装软件Nginx Docker 下载 官网:https://www.docker.com/get-started/ 或者 安装 配置 这里我们选择 Accept 选择默认配置就行,Docker 会自动设置一些大多数开发人员必要的配…...
固件测试:mac串口工具推荐
串口工具对固件测试来说非常重要,因为需要经常看日志,Windows上有Xshell和secureCRT,用起来很方便,尤其可以保存日志,并且可以进行日志分割。 mac上用什么串口工具呢,今天给大家推荐CoolTerm。 CoolTerm …...
41.防静电的系列措施
静电干扰的处理措施 1. ESD放电特征2. 静电防护电路设计措施3. ESD防护结构措施4. 案例分析 1. ESD放电特征 (1)放电电流tr≈1nS,ESD保护器件响应时间应小于1nS; (2)频率集中在几十MHz到500MHz;…...
Jmeter进行http接口测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、jmeter-http接口测试脚本 jmeter进行http接口测试的主要步骤(1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL,路径&#x…...
Ubuntu也开始锈化了?Ubuntu 计划在 25.10 版本开始引入 Rust Coreutils
上个月,jnsgruk发表了《未来20年的Ubuntu工程》(Engineering Ubuntu For the Next 20 Years)一文,其中概述了打算在未来几年中如何发展Ubuntu的四个关键主题。在这篇文章中,重点讨论 了“现代化”。在很多方面对Ubuntu…...
C++命名空间、内联与捕获
命名空间namespace 最常见的命名空间是std,你一定非常熟悉,也就是: using namespace std;命名空间的基本格式 注意,要在头文件里面定义! namespace namespace_name{data_type function_name(data_type parameter){data_type result;//function contentreturn result;}…...
PostgreSQL 系统管理函数详解
PostgreSQL 系统管理函数详解 PostgreSQL 提供了一系列强大的系统管理函数,用于数据库维护、监控和配置。这些函数可分为多个类别,以下是主要功能的详细说明: 一、数据库配置函数 1. 参数管理函数 -- 查看所有配置参数 SELECT name, sett…...
mdadm 报错: buffer overflow detected
最近跑 blktest (https://github.com/osandov/blktests) 时发现 md/001 的测试失败了 单独执行,最后定位到是 mdadm 命令报错: buffer overflow detected 这个 bug 目前已经修复: https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/commit/?id827e1870f3205…...
java ReentrantLock
线程同步工具。可以替代 synchronized . private final ReentrantLock reentrantLock new ReentrantLock();void testTask1 () {reentrantLock.lock(); // 获取锁try {System.out.println(Thread.currentThread().getName() " 进入临界区");// 模拟执行业务逻辑Th…...
kettle从入门到精通 第九十六课 ETL之kettle Elasticsearch 增删改查彻底掌握
场景: 群里有小伙伴咨询kettle从Elasticsearch中抽取数据,群里老师们纷纷响应,vip小伙伴是不是有中受宠若惊的感觉。 今天我们使用kettle通过es的原生rest接口来进行操作es,开整。 前提:本篇文章基于elasticsearch:7.…...
Kafka的核心组件有哪些?简要说明其作用。 (Producer、Consumer、Broker、Topic、Partition、ZooKeeper)
Kafka 核心组件解析 1. 基础架构图解 ┌─────────┐ ┌─────────┐ ┌─────────┐ │Producer │───▶ │ Broker │ ◀─── │Consumer │ └─────────┘ └─────────┘ └────────…...
Missashe考研日记-day34
Missashe考研日记-day34 1 专业课408 学习时间:3h学习内容: 今天是学习I/O管理第二小节的内容,听了课也做了题,这是操作系统倒数第二节知识了,还差最后一节就完结了。知识点回顾: 1.I/O核心子系统&#x…...
机器人跑拉松是商业噱头还是技术进步的必然体现
一、机器人跑拉松是商业噱头还是技术进步的必然体现 机器人参与马拉松赛事究竟是营销噱头还是技术进步的必然要求,需要从技术验证、行业推动、公众认知以及争议焦点等多个维度综合分析。基于全球首场人形机器人半程马拉松(2025年北京亦庄赛事࿰…...
传输层协议 1.TCP 2.UDP
传输层协议 1.TCP 2.UDP TCP协议 回顾内容 传输层功能:定义应用层协议数据报文的端口号,流量控制对原始数据进行分段处理 传输层所提供服务 传输连接服务数据传输服务:流量控制、差错控制、序列控制 一、传输层的TCP协议 1.面向连接的…...
LLM :Function Call、MCP协议与A2A协议
LLM 的函数调用、模型上下文协议 (MCP) 和 Agent to Agent (A2A) 协议:概念、区别与实例对比 引言:LLM 不断演进的格局 大型语言模型 (LLM) 的日益精进,使其能力已超越简单的文本生成,迈向与现实世界进行复杂交互的新阶段。为了…...
当当狸智能天文望远镜 TW2 | 用科技触摸星辰,让探索触手可及
当科技邂逅星空,每个普通人都能成为宇宙的追光者 伽利略用望远镜揭开宇宙面纱的 400 年后,当当狸以颠覆传统的设计,让天文观测从专业领域走入千家万户。当当狸智能天文望远镜 TW2,重新定义「观星自由」—— 无需专业知识ÿ…...
白杨SEO:如何查看百度、抖音、微信、微博、小红书、知乎、B站、视频号、快手等7天内最热门话题及流量关键词有哪些?使用方法和免费工具推荐以及注意事项【干货】
大家好,我是白杨SEO,专注SEO十年以上,全网SEO流量实战派,AI搜索优化研究者。 (温馨提醒:本文有点长,看不完建议先收藏或星标,后面慢慢看哈) 最近,不管是在白…...
Spring AI 之 AI核心概念
模型 人工智能(AI)模型是用于处理和生成信息的算法,通常旨在模拟人类的认知功能。这些模型通过从大规模数据集中学习模式和规律,能够生成预测结果、文本、图像或其他形式的输出,从而增强各行业应用的效能。 AI 模型种类繁多,每种模型都适用于特定的应用场景。虽然以 Ch…...
微软输入法常用快捷键介绍以及调教技巧
微软输入法(Microsoft Pinyin Input Method)是 Windows 系统内置的中文输入工具,以其高效、智能化的特点广受用户喜爱。掌握其常用快捷键和特殊模式可以显著提升输入效率。本文将介绍微软输入法在 Windows 10/11 环境下的常用快捷键及 U 模式…...