为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
相关产品推荐
相关产品推荐

