问题是,jar文件使用springorm加载持久性配置,并基于这些配置,将文件移动到hdfs中合适的文件夹中。现在,如果我使用'java-cp'而不是'hadoopjar',它将无法复制到hdfs,并出现文件系统错误。
使用hadoop jar命令调用jar时(注入了spring orm),异常如下:
线程“main”org.springframework.beans.factory.beancreationexception中出现异常:创建名为的bean时出错
“org.springframework.dao.annotation.persistenceexceptiontranslationpostprocessor#0”在类路径资源[applicationcontext.xml]中定义
创建在类路径资源[applicationcontext.xml]中定义的名为“entitymanagerfactory”的bean时出错:调用init方法失败;嵌套异常为java.lang.illegalstateexception:名称“persistence”的持久化单元定义冲突:文件:/home/user/desktop//apnjar.jar,文件:/tmp/hadoop /hadoop-unjar2841422106164401019/
原因:java.lang.illegalstateexception:名称“persistence”的持久性单元定义冲突
似乎hadoop正在将jar文件解包到某个tmp文件夹中,这真的是必需的吗?我们可以通过任何配置更改跳过这一步吗?
欢迎对此有任何想法。
2条答案
按热度按时间gpfsuwkq1#
如果使用“hadoopjar”,hadoop将运行org.apache.hadoop.util.runjar。runjar将把jar解包到一个temp文件夹(在您的示例中是/tmp/hadoop-/hadoop-unjar2841422106164401019/)中,并将其加载到当前的类加载器中。最后,它将调用主类来运行mapreduce应用程序。
你把jar添加到类路径了吗?如果是这样,您将在类装入器中拥有jar和未打包的文件夹。我想这就是Spring抱怨的原因。
qxgroojn2#
作为解决方法,我从jar中提取了配置xml,并将它们放在工作目录中。
然而,为了寻找合适的解决方案,这是可行的。
因此,如果您正面临类似的问题,请删除所有配置xml,并将jar仅放在已编译的类文件中。