我很想使用json-io 4.10.1的功能。不幸的是,我的hadoop(2.8.4)版本捆绑了2.5.1版本。当我的应用程序运行时,它会从/ usr / lib / hadoop-yarn-lib而不是我的应用程序.jar中捆绑的类中引入json-io。
例如,这个较新的版本没有方法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>
我已经配置了阴影插件来创建一个胖.jar。生成的jar确实包含来自正确版本的json-io的JsonReader.class。
这个旧jar直接在hadoop的classpath(/ usr / lib / hadoop-yarn-lib / *)上。
我希望类加载器能够找到捆绑的JsonReader.class,但它正在从类路径中提取它。
在Maven中,您可以排除更深层次的依赖关系:
<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>
这应该可以防止其他json-io
lib的拉动。