我想以编程方式更新我的 Nexus 服务器中的 maven-metadata.xml 文件。我有什么办法可以做到这一点吗?我可以为此使用 eclipse aether API 吗?
maven 元数据文件由 Maven 维护。 Nexus 在删除时更新它们,并有一个计划任务也可以更正这些文件。
但是,根据删除文件的方式,元数据可能不会更新。例如。如果您只是删除存储中的文件并且不使用 Nexus 应用程序。
使用 Nexus RestAPI 调用让 Nexus 在部署后重建元数据,向
DELETE
发出 /service/local/metadata/repositories/<repo-id>/content
请求。
例如:
curl -v -u userID:password -X DELETE http://localhost:8081/nexus/service/local/metadata/repositories/snapshots/content/com/foo/some/artifact
我知道这是一个老问题,但我偶然发现了同样的问题,并认为我会为下一个人分享我的解决方案。我们有一个应用程序,使用 REST API 将工件上传到 Nexus 存储库,但这不会创建正确的 maven-metadata.xml 文件。例如,对于 com/test/artifact 版本 2.0.0,它会创建 com/test/artifact/2.0.0/maven-metadata.xml,但不会创建 com/test/artifact/maven-metadata.xml。 Nexus 有一个“修复 - 重建 Maven 存储库元数据”任务,它将执行您想要的操作。不幸的是,没有 REST API 来创建任务,只能列出和运行。我在 Web UI 中创建此任务时监控了网络流量,并以 bash 片段的形式提出了此解决方案:
# create the task
response=$(curl \
--silent \
--fail \
--user $NEXUS_USERNAME:$NEXUS_PASSWORD \
--header "Content-Type: application/json" \
--data '{"action":"coreui_Task","method":"create","data":[{"id":"NX.coreui.model.Task-1","typeId":"repository.maven.rebuild-metadata","enabled":true,"name":"rebuild maven metadata","alertEmail":"","notificationCondition":"FAILURE","schedule":"manual","properties":{"repositoryName":"maven-hosted","groupId":"","artifactId":"","baseVersion":"","rebuildChecksums":"false"},"recurringDays":[],"startDate":null,"timeZoneOffset":"+00:00"}],"type":"rpc","tid":0}' \
http://$NEXUS_SERVER/service/extdirect)
if [ $? -eq 0 ]; then
taskid=$(echo $response | jq -r .result.data.id)
if [[ "$taskid" != "null" ]]; then
# run the task
curl \
--silent \
--user $NEXUS_USERNAME:$NEXUS_PASSWORD \
--header 'accept: application/json' \
--header "Content-Type: application/json" \
--request 'POST' \
--data '' \
http://$NEXUS_SERVER/service/rest/v1/tasks/${taskid}/run
fi
fi
我们正在使用 Nexus OSS 3.41。
我解决这个问题的方法是使用 NEXUS 脚本。 我通过 NEXUS REST (POST v1/script) 发布了这个脚本
{ “名称”:“通过脚本重建maven元数据”, “内容”:“导入org.sonatype.nexus.repository.maven.MavenMetadataRebuildFacet; 导入 groovy.json.JsonSlurper;
log.info('rebuild-maven-metadata-by-script started');
def request = new JsonSlurper().parseText(args);
assert request.repoName: 'repoName parameter is required';
assert request.groupId: 'groupId parameter is required';
assert request.artifactId: 'artifactId parameter is required';
def repo = repository.repositoryManager.get(request.repoName);
MavenMetadataRebuildFacet mavenHostedFacet = repo.facet(MavenMetadataRebuildFacet.class);
mavenHostedFacet.rebuildMetadata(request.groupId, request.artifactId, null, false, false);
log.info('rebuild-maven-metadata-by-script completed');",
“类型”:“绝妙” }
该脚本具有存储库名称、groupId 和artifactId 参数。 然后可以通过 NEXUS REST (POST /v1/script/{name}/run) 调用它
我使用的是NEXUS OSS 3.62.0