天天看点

spark sql 报错ClassLoaderResolver for class "" gave error on creation : {1}

在spark sql支持hive时,我们在idea 上编译不会出错,在生成jar包时缺报错

]  Error creating validator of type org.datanucleus.properties.CorePropertyValidator

ClassLoaderResolver for class "" gave error on creation : {1}

。。。。。

最主要的提示在这里

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.

已经说明是plugin.xml文件的问题,在查看datanucleus.的三个jar包时发现确实有三个plugin.xml,把他们打开时确发现他们三个的内容完全不一样,很明显,在生成jar 包时这三个文件必不可少,而查看spark sql项目生成的jar包时只有这三个plugin.xml的一部分,意思就是说:三个plugin.xml并没合并!datanucleus并不能正常使用!

解决:必须将这三个plugin,xml手动合并,可以在这里下载https://download.csdn.net/download/qq_38426934/10616844

在生成jar包时需要用打包插件声明datanucleus这个类

<build>

        <plugins>

            <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-shade-plugin</artifactId>

        <executions>

            <execution>

                <phase>package</phase>

                <goals>

                    <goal>shade</goal>

                </goals>

                <configuration>

                    <transformers>

                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

                            <manifestEntries>

                                <Main-Class>com.test.RDDToDataset</Main-Class>

                                <Premain-Class>org.datanucleus.enhancer.DataNucleusClassFileTransformer</Premain-Class>

                                <Bundle-SymbolicName>org.datanucleus;singleton:=true</Bundle-SymbolicName>

                            </manifestEntries>

                        </transformer>

                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">

                            <resource>reference.conf</resource>

                        </transformer>

                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>

                    </transformers>

                    <filters>

                        <filter>

                            <artifact>*:*</artifact>

                            <excludes>

                                <exclude>META-INF/*.SF</exclude>

                                <exclude>META-INF/*.DSA</exclude>

                                <exclude>META-INF/*.RSA</exclude>

                            </excludes>

                        </filter>

                    </filters>

                </configuration>

            </execution>

        </executions>

    </plugin>

    </plugins>

    </build>

如果用sbt道理一样可以直接修改 MANIFEST.MF为

Manifest-Version: 1.0

Bundle-SymbolicName: org.datanucleus;singleton:=true

Premain-Class: org.datanucleus.enhancer.DataNucleusClassFileTransforme

 r

Built-By: Administrator

Build-Jdk: 1.8.0_101

Main-Class: com.test.RDDToDataset

可以看出关键就是

Bundle-SymbolicName: org.datanucleus;singleton:=true

Premain-Class: org.datanucleus.enhancer.DataNucleusClassFileTransforme

 r对datanucleus的声明

继续阅读