Skip to main content
 首页 » 编程设计

maven之Aether,从本地 repo 获取 Artifact

2025年05月04日132cmt

有很多相关的问题

<dependency> 
    <groupId>com.jcabi</groupId> 
    <artifactId>jcabi-aether</artifactId> 
    <version>0.9</version> 
</dependency> 

当我需要从远程仓库获取 Artifact 时,它可以完美运行。
不幸的是,我找不到强制以太从本地 repo 中获取 Artifact 的方法。

它打印到控制台:
2014-07-21 18:11:40 ERROR MethodValidator.error: - JSR-303 validator failed to initialize: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath. (see http://www.jcabi.com/jcabi-aspects/jsr-303.html) 
2014-07-21 18:11:40 INFO  NamedThreads.info: - jcabi-aspects 0.7.22/fd7496f started new daemon thread jcabi-loggable for watching of @Loggable annotated methods 
2014-07-21 18:11:41 WARN  LogTransferListener.warn: - #transferFailed('GET FAILED https://my.remote.repo/nexus/cont..243..tory-uploader-1.0.0-${revision.suffix}.pom'): in 29µs 
2014-07-21 18:11:41 WARN  LogTransferListener.warn: - #transferFailed('GET FAILED http://repo.maven.apache.org/maven2/ru..220..tory-uploader-1.0.0-${revision.suffix}.pom'): in 21µs 
2014-07-21 18:11:41 ERROR Aether.error: - #resolve(my.group.id:my-artifact-i-want-to-get:groovy:installer:1.0.0-SNAPSHOT, 'runtime', org.sonatype.aether.util.filter.ScopeDependencyFilter@9076fc75): thrown org.sonatype.aether.resolution.DependencyResolutionException(failed to load 'my.group.id:my-artifact-i-want-to-get:groovy:installer:1.0.0-SNAPSHOT (runtime)' from ["shared-nexus (https://my.remote.repo/nexus/content/groups/all-repos/, releases+snapshots) with kyc.developer", "central (http://repo.maven.apache.org/maven2, releases) without authentication"] into /home/ssa/.m2/repository) out of com.jcabi.aether.Aether#fetch[198] in 166ms 
2014-07-21 18:11:41 ERROR Aether.error: - #resolve(my.group.id:my-artifact-i-want-to-get:groovy:installer:1.0.0-SNAPSHOT, 'runtime'): thrown org.sonatype.aether.resolution.DependencyResolutionException(failed to load 'my.group.id:my-artifact-i-want-to-get:groovy:installer:1.0.0-SNAPSHOT (runtime)' from ["shared-nexus (https://my.remote.repo/nexus/content/groups/all-repos/, releases+snapshots) with kyc.developer", "central (http://repo.maven.apache.org/maven2, releases) without authentication"] into /home/ssa/.m2/repository) out of com.jcabi.aether.Aether#fetch[ 

Artifact 在本地仓库中,但以太找不到它......
我做错了什么?

我的代码:
列表 远程仓库 , 文件 localRepoRoot 从 Maven 插件“注入(inject)”。此类从 maven-plugin 中使用。
MavenHelperAether(List<RemoteRepository> remoteRepos, File localRepoRoot) { 
        this.remoteRepos = remoteRepos 
        this.localRepoRoot = localRepoRoot 
    } 
 
    /** 
     * Resolves artifact using artifact coordinates 
     * @param artifactCoords is an artifact you need 
     * @param remoteLookup is ignored. It's a part of backward compatibility. 
     * 
     * @return {@link File} pointing to artifact 
     * */ 
    public File resolveArtifact(String artifactCoords, boolean remoteLookup = false){ 
        LOG.debug("resolving artifact $artifactCoords ... using localRepo[$localRepoRoot.absolutePath] and remoteRepos [$remoteRepos]") 
 
        def aether = new Aether(remoteRepos, localRepoRoot) 
        def artifact = new DefaultArtifact(artifactCoords) 
        Collection<Artifact> deps = [] 
        try{ 
            deps = resolveInRemoteRepositories(aether, artifact) 
            LOG.debug("Resolved artifact path ${deps.iterator().next().file.absolutePath }") 
            return deps.iterator().next().file 
        } 
        catch (DependencyResolutionException | IllegalArgumentException e){ 
            LOG.warn("Can't fetch $artifact from remote repos. Falling back to local repository...", e) 
            def localArtifact = resolveInLocalRepo(artifact) 
            if(localArtifact.exists()){ 
                return  localArtifact; 
            }else{ 
                throw new InstallerException("Can't locate artifact [$artifact] in local repo using path [$localArtifact.absolutePath]") 
            } 
        } 
    } 
 
    private Collection<Artifact> resolveInRemoteRepositories(Aether aether, DefaultArtifact artifact){ 
        LOG.debug("Trying to resolve $artifact in remote repositories...") 
        aether.resolve(artifact,JavaScopes.RUNTIME) 
    } 
 
    private  File resolveInLocalRepo(DefaultArtifact artifact){ 
        LOG.debug("Trying to resolve $artifact in local repository...") 
        def localRepoManager = new SimpleLocalRepositoryManager(localRepoRoot) 
        new File(localRepoManager.getPathForArtifact(artifact, true)) 
    } 

请您参考如下方法:

您可以创建本地远程仓库并将其提供给请求:

RemoteRepository local = new RemoteRepository.Builder("local", "default", "file:c:/Users/blah/.m2/repository").build();
RemoteRepository central = new RemoteRepository.Builder("central", "default", "http://central.maven.org/maven2/").build();

collectRequest.setRepositories(Arrays.asList(local, central));