我目前正在使用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
答案 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。