我很想使用json-io 4.10.1的功能。不幸的是,我的hadoop(2.8.4)版本捆绑了2.5.1版。当我的应用程序运行时,它从/ usr / lib / hadoop-yarn-lib中提取json-io而不是应用程序.jar中捆绑的类。
例如,此较新版本不具有带有第二个接受参数的参数的JsonReader.jsonToJava方法,并且此版本在将对象映射到json或从json映射中做得更好。
在执行应用程序时,出现错误,提示找不到合适的方法。最终,作为权宜之计,我删除了/usr/lib/hadoop-yarn-lib/json-io-2.5.1.jar文件,该应用程序找到了“本地”版本并成功运行。
因此,在我的pom.xml中,我将json-io声明为依赖项:
<dependency>
<groupId>com.cedarsoftware</groupId>
<artifactId>json-io</artifactId>
<version>4.10.1</version>
</dependency>
我已经配置了shade插件来创建一个胖的.jar。最终的jar确实包含来自正确版本的json-io的JsonReader.class。
这个较旧的jar直接位于hadoop的类路径(/ usr / lib / hadoop-yarn-lib / *)上。
我希望类加载器找到捆绑的JsonReader.class,但是它将从类路径中拉出一个。
答案 0 :(得分:0)
在Maven中,您可以排除更深的依赖关系:
constexpr int
这应该防止拉出另一个<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-yarn</artifactId>
<version>3.2.0</version>
<exclusions>
<exclusion>
<groupId>com.cedarsoftware</groupId>
<artifactId>json-io</artifactId>
</exclusion>
</exclusions>
</dependency>
库。