我正在尝试构建一个与HBase通信的Dropwizard(Jersey)REST端点。虽然这些是我唯一的两个顶级依赖项,但这两个依赖项都加载了许多冲突的传递依赖项。这种冲突的一个简单例子是Google的Guava:
Dropwizard不适用于版本11,HBase不适用于版本18.
我已经检查了Maven shade插件文档,但它似乎不允许你重新定位依赖jar中的类。所以我不知道如何解决这个问题,而不是将这两个组件分成单独的JVM。
答案 0 :(得分:1)
这是一个肮脏的解决方案。但你可以......
创建一个项目/模块,您可以在其中定义一组服务接口,dropwizard应用程序将使用这些接口与HBase通信。
创建另一个实现这些接口并使用HBase类的模块/项目。遮蔽这个项目。
在你的Dropwizard项目中只包含接口jar,但是创建一个任务来将着色的工件复制到你的资源中。
为着色的HBase客户端工件创建一个JARClassLoader。您可能必须创建一个不委托父级的特殊子类,因为默认情况下,类加载器会要求父级解析链接,并可能从外部类加载器中提取较新版本的guava。
从Jar loader中询问服务合约的实例......
Businessing api = Class.forName("com.awesome.Businessing", true, jarLoader).newInstance();
答案 1 :(得分:0)
尝试在pom.xml的<dependencyManagement/>
部分为这些依赖项指定具体版本。