我目前正在进行一个项目,该项目有一个用于Maven依赖项的内置库加载器.

这是我当前的代码:

public class ResolverTest {
    
    private static final File LOCAL_REPO_DIR = new File("localRepo");
    
    public static void main(String[] args) throws MalformedURLException, DependencyResolutionException {
        downloadLibraries(
            Arrays.asList(
                "https://repo1.maven.org/maven2/",
                "https://repository.apache.org/content/repositories/snapshots/"
            ),
            List.of("commons-io:commons-io:2.12.0-SNAPSHOT")
        );
    }
    
    public static List<URL> downloadLibraries(List<String> repositories, List<String> libraries) throws DependencyResolutionException, MalformedURLException {
        // setup connection
        var locator = MavenRepositorySystemUtils.newServiceLocator();
        locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
        locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
        
        var repoSystem = locator.getService(RepositorySystem.class);
        
        var session = MavenRepositorySystemUtils.newSession();
        session.setChecksumPolicy(RepositoryPolicy.CHECKSUM_POLICY_FAIL);
        session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_NEVER);
        session.setLocalRepositoryManager(repoSystem.newLocalRepositoryManager(session, new LocalRepository(LOCAL_REPO_DIR)));
        session.setTransferListener(new LoggingTransferListener());
        session.setReadOnly();
        
        List<RemoteRepository> remoteRepos = new ArrayList<>();
        
        var repoIdx = 0;
        for (var repoUrl : repositories) {
            remoteRepos.add(new RemoteRepository.Builder(String.valueOf(repoIdx), "default", repoUrl).build());
            repoIdx++;
        }
        
        remoteRepos = repoSystem.newResolutionRepositories(session, remoteRepos);
        
        // download libraries
        var request = new DependencyRequest(
            new CollectRequest(
                (Dependency) null,
                libraries.stream().map(library ->
                    new Dependency(new DefaultArtifact(library), null)
                ).toList(),
                remoteRepos
            ),
            null
        );
        
        var results = repoSystem.resolveDependencies(session, request).getArtifactResults();
        
        var urls = new ArrayList<URL>();
        for (var result : results) {
            urls.add(result.getArtifact().getFile().toURI().toURL());
        }
        
        return urls;
    }
    
    private static class LoggingTransferListener extends AbstractTransferListener {
        
        @Override
        public void transferInitiated(TransferEvent event) {
            System.out.println("Init transfer " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName());
        }
        
    }
    
}
implementation("org.apache.maven:maven-resolver-provider:3.8.6")
implementation("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3")
implementation("org.apache.maven.resolver:maven-resolver-transport-http:1.8.2")

我遇到的问题是,每次重新启动程序并再次调用库加载器时,解析器都会try 从所有在上一次try 中没有依赖项的存储库中下载依赖项的maven-metadata.xml文件.

这似乎只发生在快照依赖项上.

在上面的例子中,我也使用了RepositoryPolicy.UPDATE_POLICY_NEVER.如果将其设置为RepositoryPolicy.UPDATE_POLICY_ALWAYS,解析器将从所有存储库中提取元数据(就像它应该做的那样). 那么,即使设定了UPDATE_POLICY_NEVER,为什么它仍在从其他回购中拉出?

将会话设置为脱机模式(session.setOffline(true);)也不起作用:maven解析器抛出一个DependencyResolutionException:org.eclipse.aether.resolution.DependencyResolutionException: Cannot access central (https://repo.maven.apache.org/maven2) in offline mode and the artifact (path to artifact) has not been downloaded from it before.(依赖项在我的本地资源库中,但不是从中心下载的)

推荐答案

好吧...

// this one prevents maven from downloading metadata.xml
// if I understand properly it tries to find maven-metadata-0.xml
// in local repository and in case of failure tries remote repositories
session.setResolutionErrorPolicy(new SimpleResolutionErrorPolicy(true, false));

// this one prevents maven from creating _remote.repositories files
// in local repository, yours: in my local repo, but wasn't downloaded from central
session.setLocalRepositoryManager(repoSystem.newLocalRepositoryManager(session, new LocalRepository(LOCAL_REPO_DIR, "simple")));

Java相关问答推荐

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

无法找到符号错误—Java—封装

Spring Batch 5-不要让它在数据库中自动创建表

我需要生成一个文件来整合每个特性执行的所有JSON结果

当涉及到泛型时,类型推理在Java中是如何工作的?

Chunk(Int)已弃用并标记为要删除

如何在ApachePOI中将图像添加到工作表的页眉?

Java流传输一个列表并创建单个对象

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

Kotlin Val是否提供了与Java最终版相同的可见性保证?

没有使用Lombok生成的参数

是否为计划任务补偿系统睡眠?

在settings.gradle.kts和Build.gradle.kts中使用公共变量

如何从HttpResponse实例获取Entity对象的内容?

我们可以在方法中声明接口吗?

当我将JTextField的getText函数与相等的String进行比较时;t返回true

如何在MPAndroidChart中的条形图上正确添加标签

MapStruct记录到记录的映射不起作用

如何在java中从以百分比表示的经过时间和结束日期中找到开始日期