使用Java代码删除maven仓库Nexus中的包

Nexus提供的API

页面访问 {nexus_host}/service/rest/swagger.json ,可以看到Nexus提供的所有API。

接口详情中包含接口的描述、参数、响应状态码等。

根据我的需求,我需要使用两个接口,组件查询接口与组件删除接口,如下图所示:

组件查询:

组件删除:

代码如下: 

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.demo</groupId>
    <artifactId>nexus</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

package com.demo;

public class Asset {

    private String downloadUrl;
    private String path;
    private String id;
    private String repository;
    private String format;
    private Checksum checksum;

    public String getDownloadUrl() {
        return downloadUrl;
    }

    public Asset setDownloadUrl(String downloadUrl) {
        this.downloadUrl = downloadUrl;
        return this;
    }

    public String getPath() {
        return path;
    }

    public Asset setPath(String path) {
        this.path = path;
        return this;
    }

    public String getId() {
        return id;
    }

    public Asset setId(String id) {
        this.id = id;
        return this;
    }

    public String getRepository() {
        return repository;
    }

    public Asset setRepository(String repository) {
        this.repository = repository;
        return this;
    }

    public String getFormat() {
        return format;
    }

    public Asset setFormat(String format) {
        this.format = format;
        return this;
    }

    public Checksum getChecksum() {
        return checksum;
    }

    public Asset setChecksum(Checksum checksum) {
        this.checksum = checksum;
        return this;
    }
}

package com.demo;

public class Checksum {

    private String sha1;
    private String md5;

    public String getSha1() {
        return sha1;
    }

    public Checksum setSha1(String sha1) {
        this.sha1 = sha1;
        return this;
    }

    public String getMd5() {
        return md5;
    }

    public Checksum setMd5(String md5) {
        this.md5 = md5;
        return this;
    }
}

package com.demo;

import java.util.List;

public class Module {

    private String id;
    private String repository;
    private String format;
    private String group;
    private String name;
    private String version;

    private List<Asset> assets;

    public String getId() {
        return id;
    }

    public Module setId(String id) {
        this.id = id;
        return this;
    }

    public String getRepository() {
        return repository;
    }

    public Module setRepository(String repository) {
        this.repository = repository;
        return this;
    }

    public String getFormat() {
        return format;
    }

    public Module setFormat(String format) {
        this.format = format;
        return this;
    }

    public String getGroup() {
        return group;
    }

    public Module setGroup(String group) {
        this.group = group;
        return this;
    }

    public String getName() {
        return name;
    }

    public Module setName(String name) {
        this.name = name;
        return this;
    }

    public String getVersion() {
        return version;
    }

    public Module setVersion(String version) {
        this.version = version;
        return this;
    }

    public List<Asset> getAssets() {
        return assets;
    }

    public Module setAssets(List<Asset> assets) {
        this.assets = assets;
        return this;
    }
}

package com.demo;

public class Service {
    
    private String groupId;
    private String artifactId;

    public String getGroupId() {
        return groupId;
    }

    public Service setGroupId(String groupId) {
        this.groupId = groupId;
        return this;
    }

    public String getArtifactId() {
        return artifactId;
    }

    public Service setArtifactId(String artifactId) {
        this.artifactId = artifactId;
        return this;
    }
}

package com.demo;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class Clean {

    private static final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).build();
    private static final Logger LOGGER = LoggerFactory.getLogger(Clean.class);

    private static final String NEXUS_HOST = "http://xxx.com";
    // 账户需要有查询和删除权限
    private static final String NEXUS_USERNAME = "admin";
    private static final String NEXUS_PASSWORD = "admin";
    private static final String NEXUS_REPOSITORY = "maven-snapshots";

    public static void main(String[] args) {
        // 需要删除的组件坐标信息
        List<Service> serviceList = new ArrayList<>();
        serviceList.add(new Service().setGroupId("com.huobi.bit.ops.service").setArtifactId("huobi-bit-ops-service"));
        // 需要删除的组件版本
//        List<String> versionList = new ArrayList<>();
//        versionList.add("1.0-SNAPSHOT");

        for(Service service : serviceList) {
            List<Module> moduleList = new ArrayList<>();
            search(NEXUS_HOST, NEXUS_USERNAME, NEXUS_PASSWORD, NEXUS_REPOSITORY, service.getGroupId(), service.getArtifactId(), null, moduleList);
            for (Module module : moduleList) {
//                if (versionList.contains(module.getVersion())) {
                if (module.getVersion().startsWith("1.0-")) {
                    // 版本匹配执行删除
                    delete(NEXUS_HOST, NEXUS_USERNAME, NEXUS_PASSWORD, module);
                }
            }
        }
    }

    private static void search(String host, String username, String password, String repository, String groupId, String artifactId, String token, List<Module> list) {
        String url = String.format("%s/service/rest/v1/search?repository=%s&group=%s&name=%s", host, repository, groupId, artifactId);
        if (StringUtils.hasText(token)) {
            // 拼接上次查询返回的continuationToken,查询下一页
            url = url + "&continuationToken=" + token;
        }
        Request request = new Request.Builder()
                .addHeader("Authorization", getToken(username, password))
                .addHeader("Connection", "keep-alive")
                .url(url)
                .get()
                .build();
        Call call = HTTP_CLIENT.newCall(request);
        try (Response response = call.execute()) {
            if (response.code() == 200 && response.body() != null) {
                JSONObject jsonObject = JSONObject.parseObject(response.body().string());
                List<Module> result = jsonObject.getObject("items", new TypeReference<List<Module>>() {
                });
                if (CollectionUtils.isEmpty(result)) {
                    return;
                }
                list.addAll(result);
                String conToken = jsonObject.getString("continuationToken");
                if (!StringUtils.hasText(conToken) || "null".equals(conToken)) {
                    return;
                }
                // 携带continuationToken递归查询下一页
                search(host, username, password, repository, groupId, artifactId, conToken, list);
            } else {
                LOGGER.error("组件搜索出错,http响应:{}", response.body());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void delete(String host, String username, String password, Module module) {
        LOGGER.info("执行删除: {}", module.getVersion());
        String url = String.format("%s/service/rest/v1/components/%s", host, module.getId());
        Request request = new Request.Builder()
                .addHeader("Authorization", getToken(username, password))
                .addHeader("Connection", "keep-alive")
                .url(url)
                .delete()
                .build();
        Call call = HTTP_CLIENT.newCall(request);
        try (Response response = call.execute()) {
            if (response.code() == 204) {
                LOGGER.info("删除成功!");
            } else {
                LOGGER.error("删除失败! 状态码:{}", response.code());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String getToken(String name, String password) {
        String authString = name + ":" + password;
        byte[] authEncBytes = Base64.getEncoder().encode(authString.getBytes(StandardCharsets.UTF_8));
        return "Basic " + new String(authEncBytes);
    }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Maven项目引用GitHub上的,可以使用Maven的依赖项解析机制来完成。具体步骤如下: 1. 打开GitHub,找到您要引用的的存储库。 2. 在存储库主页上,找到的groupId、artifactId和version信息,这些信息通常在README文件提供。 3. 在您的Maven项目的pom.xml文件,添加一个新的依赖项,并将groupId、artifactId和version信息替换为您在步骤2找到的信息。例如: ```xml <dependency> <groupId>com.github.username</groupId> <artifactId>projectname</artifactId> <version>1.0.0</version> </dependency> ``` 其,`com.github.username`是GitHub上存储库的用户名,`projectname`是存储库的名称,`1.0.0`是版本号。 4. 在Maven项目的根目录运行`mvn clean install`以下载并安装依赖项。 这样,Maven就会自动下载并安装您在pom.xml文件指定的GitHub。请注意,您需要确保您的项目可以访问GitHub,否则Maven可能无法下载依赖项。 ### 回答2: 在Java开发使用Maven作为项目构建工具可以很方便地引用和管理依赖。如果需要在线引用Github上的,可以按照以下步骤进行操作: 1. 在你的项目根目录下找到pom.xml文件,它是Maven项目的核心配置文件。 2. 在pom.xml文件的<dependencies>标签添加依赖项。 3. 在添加依赖项时,需要指定该依赖项的groupId、artifactId和版本号等信息。 4. 对于Github上的,应该将其托管在一个公共的Maven仓库上,例如JitPack、Sonatype Nexus等。 5. 在Maven仓库上搜索你想要引用的Github,并找到相应的依赖项配置。 6. 将这个依赖项配置粘贴到pom.xml文件的<dependencies>标签。 7. 保存pom.xml文件,Maven会自动下载所需的依赖项并进行构建。 需要注意的是,在引用Github时,可能会遇到一些问题,例如的可用性、依赖项的冲突等。为了解决这些问题,可以尝试以下方法: 1. 确保Github的可用性,可以在Github上查看的发布记录、维护者的主页等信息。 2. 确认Github的依赖项,可能需要手动添加缺失的依赖项或解决依赖项冲突。 3. 如果Github没有在公共的Maven仓库上发布,可以考虑使用其他方式进行引用,例如将下载到本地并手动添加依赖项。 总之,使用Maven在线引用Github是一种方便的方式,它可以帮助我们更好地管理和维护项目的依赖关系。通过正确配置pom.xml文件,我们可以轻松地引入所需的Github,并让项目顺利构建和运行。 ### 回答3: 要在Java Maven项目引用GitHub,可以按照以下步骤进行操作: 1. 在项目的pom.xml文件,添加对GitHub的依赖项。在`<dependencies>`标签,添加如下代码: ``` <dependency> <groupId>com.github.[username]</groupId> <artifactId>[repository-name]</artifactId> <version>[version]</version> </dependency> ``` 其,`[username]`是GitHub用户名,`[repository-name]`是仓库名称,`[version]`是的版本号。 2. 保存pom.xml文件后,Maven会自动下载所需的依赖项并将其添加到项目的classpath。 3. 如果要引用GitHub上的公共,上述步骤就足够了。但如果要引用非公共或私有,还需要进行一些额外的配置。 4. 对于非公共,可以使用在pom.xml添加repositories来指定GitHub仓库地址。在`<repositories>`标签,添加如下代码: ``` <repository> <id>github</id> <name>GitHub Repository</name> <url>https://maven.pkg.github.com/[username]/[repository-name]</url> </repository> ``` 其,`[username]`是GitHub用户名,`[repository-name]`是仓库名称。 5. 对于私有,需要在pom.xml文件添加GitHub授权信息。在`<servers>`标签,添加如下代码: ``` <server> <id>github</id> <username>[username]</username> <password>[personal-access-token]</password> </server> ``` 其,`[username]`是GitHub用户名,`[personal-access-token]`是个人访问令牌(Personal Access Token)。需要在此处生成一个具有读取权限的访问令牌,并将其替换到代码。 完成以上步骤后,保存pom.xml文件,Maven会自动从指定的GitHub仓库下载所需的依赖项并将其添加到项目的classpath。如果存在任何问题,可以查看日志文件以获取详细的错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值