Spring Maven Shade插件和DataNucleus问题

Spring Maven Shade插件和DataNucleus问题,spring,maven,hive,datanucleus,maven-shade-plugin,Spring,Maven,Hive,Datanucleus,Maven Shade Plugin,我试图从我的EclipseIDE中执行一个正常工作的代码,但我遇到了无法处理的奇怪错误。 试图总结一下我的问题: 用eclipse执行我的代码:一切都很好 捕获eclipse抛出的命令行以运行我的应用程序,并将其复制到shell中:一切正常 现在,eclipse生成的运行我的应用程序的命令行类似于java-cp-lotsofjars-Dvm.params-myPackage.MyMainClass-app-params 我的目标是将Oozie作为Java操作来执行我的应用程序,因此我需要构建

我试图从我的EclipseIDE中执行一个正常工作的代码,但我遇到了无法处理的奇怪错误。 试图总结一下我的问题:

  • 用eclipse执行我的代码:一切都很好
  • 捕获eclipse抛出的命令行以运行我的应用程序,并将其复制到shell中:一切正常
现在,eclipse生成的运行我的应用程序的命令行类似于
java-cp-lotsofjars-Dvm.params-myPackage.MyMainClass-app-params

我的目标是将Oozie作为Java操作来执行我的应用程序,因此我需要构建一个uber jar,以将大量jar减少到myapp.jar

为此,我将maven shade插件配置如下:

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.2</version>
            <configuration>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>reference.conf</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>es.mycompany.bigdata.OozieAction</mainClass>
                            </transformer>


<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.PluginXmlResourceTransformer" />
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
引发的错误是:

2017-04-02 20:20:18 WARN  Persistence:106 - Error creating validator of type org.datanucleus.properties.CorePropertyValidator
ClassLoaderResolver for class "" gave error on creation : {1}
org.datanucleus.exceptions.NucleusUserException: ClassLoaderResolver for class "" gave error on creation : {1}
...
Caused by: org.datanucleus.exceptions.NucleusUserException: Persistence process has been specified to use a ClassLoaderResolver of name "datanucleus" yet this has not been found by the DataNucleus plugin mechanism. Please check your CLASSPATH and plugin specification.
        at org.datanucleus.NucleusContext.<init>(NucleusContext.java:283)
        at org.datanucleus.NucleusContext.<init>(NucleusContext.java:247)
        at org.datanucleus.NucleusContext.<init>(NucleusContext.java:225)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.<init>(JDOPersistenceManagerFactory.java:416)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:301)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:202)
        ... 93 more
2017-04-02 20:20:18 WARN  ExtendedAnnotationApplicationContext:550 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'getOozieJavaAction': Unsatisfied dependency expressed through field 'sqlContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getSQLContext' defined in es.mediaset.technology.bigdata.config.FlatJsonToCsvAppConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.spark.sql.SQLContext]: Factory method 'getSQLContext' threw exception; nested exception is java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
2017-04-02 20:20:18警告持久性:106-创建org.datanucleus.properties.CorePropertyValidator类型的验证程序时出错
类“”的ClassLoaderResolver在创建时出错:{1}
org.datanucleus.exceptions.NucleusUserException:类“”的ClassLoaderResolver在创建时出错:{1}
...
原因:org.datanucleus.exceptions.nucleuserexception:已指定持久化进程使用名为“datanucleus”的ClassLoaderResolver,但datanucleus插件机制尚未找到该进程。请检查您的类路径和插件规范。
位于org.datanucleus.NucleusContext.(NucleusContext.java:283)
位于org.datanucleus.NucleusContext(NucleusContext.java:247)
位于org.datanucleus.NucleusContext(NucleusContext.java:225)
位于org.datanucleus.api.jdo.JDOPersistenceManagerFactory.(JDOPersistenceManagerFactory.java:416)
位于org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:301)
位于org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:202)
... 93多
2017-04-02 20:20:18警告ExtendedAnnotationApplicationContext:550-上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.UnsatifiedDependencyException:创建名为“getOozieJavaAction”的bean时出错:通过字段“sqlContext”表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“getSQLContext”的bean时出错,该名称在es.mediaset.technology.bigdata.config.FlatJsonToCsvAppConfig中定义:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.beanstantiationException:未能实例化[org.apache.spark.sql.SQLContext]:工厂方法“getSQLContext”引发异常;嵌套异常为java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException:java.lang.RuntimeException:无法实例化org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
因为我的代码正确地在eclipse中运行,并且使用这样的命令退出eclipse

/usr/java/jdk1.8.0_121/bin/java -Dmode=responsive -Dspark.master=local[*] -Dfile.encoding=UTF-8 -classpath /home/cloudera/workspace-sts/oozie-eventhub-retriever/target/classes:/home/cloudera/workspace-sts/java-framework/target/classes:/home/cloudera/.m2/repository/com/microsoft/azure/azure-storage/5.0.0/azure-storage-5.0.0.jar:<...>:/etc/hive/conf.dist es.mycompany.technology.bigdata.OozieAction json2hive
/usr/java/jdk1.8.0\u 121/bin/java-Dmode=responsive-Dspark.master=local[*]-Dfile.encoding=UTF-8-classpath/home/cloudera/workspace sts/oozie eventhub retriever/target/classes:/home/cloudera/workspace sts/java framework/target/classes:/home/cloudera/.m2/repository/com/microsoft/azure/azure-storage/5.0.0.jar:://etc/hive/conf.dist es.mycompany.technology.bigdata.OozieAction json2hive
我想我的阴影配置是错误的。但我不明白为什么,我也看不出我做错了什么


谢谢

以下问答回答了这个问题:


对于那些不了解如何“合并”datanucleus中的所有plugin.xml文件的人,您可以使用此文件:并将其粘贴到您的资源文件夹中

以下Q/A回答了这个问题:


对于那些不了解如何“合并”datanucleus中的所有plugin.xml文件的人,您可以使用此文件:并将其粘贴到您的资源文件夹中

您正在合并的这些“大量JAR”,包括datanucleus XXX JAR?如果是这样,您是否合并了这些JAR中的plugin.xml文件?清单文件呢?当我使用eclipse命令从终端执行我的应用程序时,我的类路径包括datanucleus-XXX.jars。如果我打开我的uber jar,datanucleus-XXX.jars中的类就在里面。我按照您的建议添加了PluginXmlResourceTransformer,但结果相同。我生成的清单文件是:Manifest Version:1.0 Build Jdk:1.7.067build By:cloudera Created By:Apache Maven 3.3.9 Main Class:es.mycompany.technology.bigdata.OozieAction Archiver Version:Plexus ArchiverI我不知道什么是“PluginXmlResourceTransformer”或它做什么,所以谁知道它是否正确地完成了这项工作。如果你真的想一起大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口大口。它完美地描述了我在寻找什么。我将尝试复制这个解决方案,如果它有效,我将编辑我的问题以指出解决方案。谢谢你的帮助!根据前面引用的答案,我修改了maven shade插件,现在面临以下错误:org.datanucleus.exceptions.nucleuserexception:error:找不到名称“JDO”的API定义。也许您在类路径中没有必需的datanucleus api XXX jar?当然,datanucleus-api-jdo.jar在我的uber jar中。您正在合并的这些“jar负载”,包括datanucleus XXX jar吗?如果是这样,您是否合并了这些JAR中的plugin.xml文件?清单文件呢?当我使用eclipse命令从终端执行我的应用程序时,我的类路径包括datanucleus-XXX.jars。如果我打开我的uber jar,datanucleus-XXX.jars中的类就在里面。我按照您的建议添加了PluginXmlResourceTransformer,但结果相同。我生成的清单文件是:Manifest Version:1.0 Build Jdk:1.7.067build By:cloudera Created By:Apache Maven 3.3.9 Main Class:es.mycompany.technology.bigdat
/usr/java/jdk1.8.0_121/bin/java -Dmode=responsive -Dspark.master=local[*] -Dfile.encoding=UTF-8 -classpath /home/cloudera/workspace-sts/oozie-eventhub-retriever/target/classes:/home/cloudera/workspace-sts/java-framework/target/classes:/home/cloudera/.m2/repository/com/microsoft/azure/azure-storage/5.0.0/azure-storage-5.0.0.jar:<...>:/etc/hive/conf.dist es.mycompany.technology.bigdata.OozieAction json2hive