You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Apache Maven Resolver编写测试时遇空指针问题求助

问题解决:repository system session's local repository manager cannot be null

你的测试代码存在两个核心问题,直接导致了该空指针异常:

1. ArtifactResolver构造器参数顺序错误

原ArtifactResolver的构造器参数顺序为:RepositorySystem → RepositorySystemSession → List<RemoteRepository>,但测试代码中错误地将null作为第一个参数传入,把repositorySystem放到了第二个位置,这会导致ArtifactResolver内部的repositorySystem字段为null,后续调用解析方法必然出错。

2. 未给RepositorySystemSession配置本地仓库管理器

MavenRepositorySystemUtils.newSession()创建的会话默认没有绑定本地仓库管理器,而Aether解析构件必须依赖本地仓库缓存下载的文件,因此必须手动配置。

修改后的完整测试代码

package murex.subsystems.dependencies.services;

import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.LocalRepositoryManager;
import org.eclipse.aether.repository.RemoteRepository;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.File;
import java.util.Collections;
import java.util.List;

public class ArtifactResolverTest {
    private ArtifactResolver artifactResolver;

    @BeforeEach
    public void beforeEach(@TempDir File tempDir) {
        // 创建RepositorySystem实例,显式指定实现类避免空值
        RepositorySystem repositorySystem = MavenRepositorySystemUtils.newServiceLocator()
                .addService(RepositorySystem.class, org.apache.maven.repository.internal.DefaultRepositorySystem.class)
                .getService(RepositorySystem.class);

        // 创建会话并配置本地仓库管理器
        RepositorySystemSession session = MavenRepositorySystemUtils.newSession();
        LocalRepository localRepo = new LocalRepository(tempDir);
        LocalRepositoryManager localRepoManager = repositorySystem.createLocalRepositoryManager(session, localRepo);
        session.setLocalRepositoryManager(localRepoManager);

        // 配置中央仓库
        RemoteRepository centralRepo = new RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2/").build();
        List<RemoteRepository> remoteRepos = Collections.singletonList(centralRepo);

        // 正确初始化ArtifactResolver
        artifactResolver = new ArtifactResolver(repositorySystem, session, remoteRepos);
    }

    @Test
    void testResolve() throws ArtifactResolutionException {
        artifactResolver.resolve(new DefaultArtifact("log4j:log4j:1.2.17"));
    }
}

关键修改说明

  • 修正了ArtifactResolver构造器的参数顺序,不再传入无效的null值
  • 使用JUnit的@TempDir提供临时目录作为本地仓库,测试结束后自动清理缓存文件
  • 显式指定DefaultRepositorySystem实现类,避免getService方法返回空值
  • 通过repositorySystem.createLocalRepositoryManager创建并绑定本地仓库管理器到会话

另外,确保项目依赖包含Aether和Maven仓库相关组件,示例依赖如下:

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-core</artifactId>
        <version>3.9.6</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-api</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-impl</artifactId>
        <version>1.1.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-transport-http</artifactId>
        <version>1.1.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.10.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.10.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

内容的提问来源于stack exchange,提问作者Kevin Nammour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:53:15