强制java jar在EMR上不使用类路径包

强制java jar在EMR上不使用类路径包,java,scala,sbt,classpath,amazon-emr,Java,Scala,Sbt,Classpath,Amazon Emr,我试图通过EMR上的spark submit运行一个胖罐子。我遇到了一个与包依赖性相关的问题。这个项目依赖于我在build.sbt中包含的googleadwords库。问题是googleadwords库内部依赖于一个名为commons-configurationversion 1.10的包,但是当我通过spark-submit在EMR上运行这个jar时,它通过warn-scheduler这个包的1.6版运行(commons-configuration)使用,因为它是EMR集群上类路径的一部分。我

我试图通过EMR上的
spark submit
运行一个胖罐子。我遇到了一个与包依赖性相关的问题。这个项目依赖于我在
build.sbt
中包含的
googleadwords
库。问题是
googleadwords
库内部依赖于一个名为
commons-configuration
version 1.10的包,但是当我通过
spark-submit
在EMR上运行这个jar时,它通过
warn-scheduler
这个包的1.6版运行(
commons-configuration
)使用,因为它是EMR集群上类路径的一部分。我得到以下错误

java.lang.NoSuchMethodError:org.apache.commons.configuration.MapConfiguration

我已尝试使用
spark submit
的选项
--jars
显式传递依赖项jar

spark-submit --name my-awesome-spark-job --deploy-mode cluster --class package.path.to.my.Main --jars s3://jar-bucket/jars/commons-configuration-1.10.jar s3://code-bucket/jars/spark-code.jar
这样做仍然会给我同样的错误,因为不管发生什么情况,都会使用来自CLASSPATH的旧版本的包。
我想强制我的jar在fat jar中包含依赖项,并将它们显式地用于某些库,例如
googleadwords
library。谢谢。

您可以尝试对正在使用的依赖项进行着色,这些依赖项在集群上有较旧的版本可用

你用什么来建造这个罐子?我在sbt中使用了这种策略


但是maven也有一个shade插件:

我正在使用
sbt assembly
构建jar。我尝试使用
ShadeRule.rename(“com.google.*”->“shade.com.google@1”).inAll对google库进行着色处理,但问题是该库内部依赖于集群上具有较旧版本的其他库。所以这对我没有帮助。你的解决方案成功了,我对公共配置库进行了着色,所有的东西都像一个魔咒一样工作。非常感谢!我添加了以下行
ShadeRule.rename(“org.apache.commons.configuration.*”->“shade.org.apache.commons.configuration@1”).inAll