将maven从3.0.5升级到3.1.0

时间:2014-06-13 11:47:20

标签: java maven

我目前正在使用maven 3.0.5和我的java web项目。该工件使用RepositarySystem类来读取maven工件。这个项目运行良好,没有任何问题。但是当我尝试升级maven版本时,aether.RepositorySystem会抛出错误。

我已经提到了一些在线文档,并且了解了Maven从org.eclipse.aether.RepositorySystem开始提供RepositorySystem而已经从org.sonatype.aether.RepositorySystem提供了Jar。

但现在的问题是我希望我的项目在版本3.0.5以及最新版本上运行时没有错误。是否有可能根据maven版本加载类文件。

请指导我摆脱这个错误?提前谢谢。

我的堆栈跟踪如下,

[PhrescoException]:  [ErrorMessage] = [PhrescoException]:  [ErrorMessage] = org.codehaus.plexus.component.repository.exception.ComponentLookupException: com.google.inject.ProvisionException: Guice provision errors:

    No implementation for java.util.Set<org.eclipse.aether.RepositoryListener> was bound.
      while locating java.util.Set<org.eclipse.aether.RepositoryListener>
        for parameter 0 at org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher.<init>(Unknown Source)
      while locating org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher
      at ClassRealm[plexus.core, parent: null]
      at ClassRealm[plexus.core, parent: null]
      while locating org.eclipse.aether.impl.RepositoryEventDispatcher
        for parameter 0 at org.eclipse.aether.internal.impl.DefaultMetadataResolver.<init>(Unknown Source)
      while locating org.eclipse.aether.internal.impl.DefaultMetadataResolver
      at ClassRealm[plexus.core, parent: null]
      at ClassRealm[plexus.core, parent: null]
      while locating org.eclipse.aether.impl.MetadataResolver
        for parameter 0 at org.apache.maven.repository.internal.DefaultVersionResolver.<init>(Unknown Source)
      while locating org.apache.maven.repository.internal.DefaultVersionResolver
      at ClassRealm[plexus.core, parent: null]
      at ClassRealm[plexus.core, parent: null]
      while locating org.eclipse.aether.impl.VersionResolver
        for parameter 0 at org.eclipse.aether.internal.impl.DefaultRepositorySystem.<init>(Unknown Source)
      while locating org.eclipse.aether.internal.impl.DefaultRepositorySystem
      at ClassRealm[plexus.core, parent: null]
      at ClassRealm[plexus.core, parent: null]
      while locating org.eclipse.aether.RepositorySystem

1 个答案:

答案 0 :(得分:0)

创建一个界面,您可以在任何位置使用aether.RepositorySystem或相关类。

编写两个实现,一个基于旧版本,一个基于新版本。

最后创建一个小工厂,试图根据新版本实例化实现。将它包装在try catch块中,如果失败则根据旧版本创建一个。

结果应该看起来像这样

public interface RepositorySystem {

    public void doStuff() // add whatever methods you need here

    public DetailWrapper getDetails() // maybe you need more wrapper interfaces and matching implementations, when you aren't dealing with just one class.
}

public class RepositorySystemAdapterPreMavenXXX implements RepositorySystem {
    org.sonatype.aether.RepositorySystem delegate = new org.sonatype.aether.RepositorySystem();
    public void doStuff(){
        delegate.doStuff();
    }

    // ...
}

public class RepositorySystemAdapterPostMavenXXX implements RepositorySystem {
    org.eclipse.aether.RepositorySystem delegate = new org.eclipse.aether.RepositorySystem();
    public void doStuff(){
        delegate.doStuff();
    }

    // ...
}

public class RepositorySystemFactory{
    public static RepositorySystem repositorySystem(){
        try {
            return new RepositorySystemAdapterPostMavenXXX(); // you might have to use reflection to do this ... not completely sure;
        } catch(Error error) { // find out what kind of error/exception you get and catch exactly that
            return  new RepositorySystemAdapterPreMavenXXX();
        }
    }
}

这两个实现必须使用单独版本的Maven构建单独的jar。