【问题标题】:Error when using XmlBeans generated classes使用 XmlBeans 生成的类时出错
【发布时间】:2012-01-21 01:02:23
【问题描述】:

我已经从一个 xsd 文件生成了带有 XMLBeans 的类,并将它们打包到一个 jar 文件中。然后我将该jar添加到eclipse中的项目类路径中,一切都编译并运行良好。 我使用 Maven 从我的项目中构建了一个独立的 jar 文件,并且再次构建成功,但是当我尝试运行它时,我得到了这个错误:

 Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.oblicore.oblisync.resolutions.TestsDocument$Factory.parse(TestsDo
cument.java:126)
    at com.oblicore.oblisync.handlers.TransferEntitiesHandler.getResolution(
TransferEntitiesHandler.java:117)
    at com.oblicore.oblisync.handlers.TransferEntitiesHandler.resolveConflic
ts(TransferEntitiesHandler.java:103)
    at com.oblicore.oblisync.main.Orchestrator.run(Orchestrator.java:107)
    at com.oblicore.oblisync.main.Orchestrator.main(Orchestrator.java:58)
Caused by: java.lang.RuntimeException: Cannot load SchemaTypeSystem. Unable to l
oad class with name schemaorg_apache_xmlbeans.system.s8B21CFFFCFED0B2438C2585C61
F113F7.TypeSystemHolder. Make sure the generated binary files are on the classpa
th.
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:7
83)
    at com.oblicore.oblisync.resolutions.TestsDocument.<clinit>(TestsDocumen
t.java:19)
    ... 5 more
Caused by: java.lang.ClassNotFoundException: schemaorg_apache_xmlbeans.system.s8
B21CFFFCFED0B2438C2585C61F113F7.TypeSystemHolder
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:7
69)
    ... 6 more

缺少的类在我用 XmlBeans 创建的 jar 中,我如何告诉 maven 将它添加到它从我的项目创建的 jar 中?

【问题讨论】:

    标签: java maven xmlbeans


    【解决方案1】:

    确保在您生成的 jar 文件中包含从 xmlbeans 生成的类文件。

    来自堆栈跟踪:

    Caused by: java.lang.ClassNotFoundException: schemaorg_apache_xmlbeans.system.s8
    B21CFFFCFED0B2438C2585C61F113F7.TypeSystemHolder
    

    它表明在编译期间所需的类文件位于类路径中,但在您构建的 jar 中这些文件丢失了。

    检查您的 jar 文件以查看这些类是否存在。

    编辑:根据问题改写

    要在 Maven 中构建带有依赖项的 jar,请使用 jar-with-dependencies 选项,example

    两个很好的参考:

    1. http://www.sonatype.com/books/mvnref-book/reference/assemblies-sect-basics.html

    2. http://thomassundberg.wordpress.com/2011/03/05/create-an-executable-jar-from-maven/

    在第二个中,如果您的 jar 不是可执行 jar,则不需要主类

    【讨论】:

    • 我重新提出了我的问题,以便更好地解释我需要什么
    • 要构建具有依赖关系的 jar,您可以使用 maven-assembly 插件,您需要指定它应该包含哪些所有 jar,可以在此处找到示例 pom maven.apache.org/plugins/maven-assembly-plugin/…
    • 当您使用 Maven 构建 JAR 项目时,JAR 仅包含该项目中的类。它不包含构建它所需的 JAR,也不包含执行所需的 JAR(大多数情况下,但并不总是相同的 JAR)。但是,如果您将项目打包为 WAR 或 EAR,Maven 将包含您的 POM 列出的所有 JAR 作为运行时依赖项。如果您不需要 WAR 或 EAR,那么上面的组装插件建议更简单(使用 jar-with-dependencies 选项)。
    • 您的回答非常有帮助,但我仍然无法让它为我工作,因为 maven-assembly 插件仅包含安装在其存储库中并被定义为依赖项的 jar。因为我有一个来自 XmlBeans 的自生成 jar,所以我使用系统依赖项将其包含在内,但事实证明,程序集插件不包含系统 dep。在 jar 文件中。所以我只是将 jar 安装在 maven 存储库中,并将其作为常规依赖项包含在内,一切都像魅力一样工作。
    【解决方案2】:

    请在 pom.xml 中添加以下标签。会出错

            <!--
                this tells maven to copy the openejb-javaagent jar into your target/
                directory
            -->
            <!-- where surefire can see it -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>org.apache.openejb</groupId>
                                    <artifactId>openejb-javaagent</artifactId>
                                    <version>3.0-beta-2</version>
                                    <outputDirectory>${project.build.directory}</outputDirectory>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>target/generated-sources/axis2/wsdl2code/resources</directory>
            </resource>
            <resource>
                <directory>target/generated-sources/xmlbeans/resources</directory>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>
    

    【讨论】:

      【解决方案3】:

      当您遇到此类错误时 WSDL2Java 生成的 TypeSystemHolder.class 没有放在你的类路径中以避免这个错误。

      请从“resource/schemaorg_apache_xmlbeans/system/s68C41DB812F52C975439BA10FE4FEE54”文件夹中复制 TypeSystemHolder.class。

      然后将 TypeSystemHolder.class 文件粘贴到您的类路径文件夹 (build/classes/schemaorg_apache_xmlbeans/system/s68C41DB812F52C975439BA10FE4FEE54) 文件夹中

      【讨论】:

        【解决方案4】:

        在执行 WSDL2Java 时,将创建一个名为 resources 的目录。将显示在资源下的 schemaorg_apache_xmlbeans 复制到项目的类路径中。这应该是修复。

        【讨论】:

          【解决方案5】:

          提取要包含schemaorg_apache_xmlbeans 文件夹的jar。 将schemaorg_apache_xmlbeans 文件夹复制到提取的文件夹中(jar 提取的结果)。 在提取的文件夹中打开命令提示符。

          使用 jar cf 命令再次制作 jar。例如jar cf test.jar *, 包括所有文件夹。

          部署那个 jar 。

          【讨论】:

            【解决方案6】:

            我遇到了这个问题。在我们的项目中,我们使用自定义类加载器来兼容 poi 旧版本。解析“.xlsx”文件时,会发生同样的错误。下面是源代码

                private static String EXCEL_PATH = "com.alibaba.excel";
                private static String POI_PATH = "org.apache.poi";
                private static String OOXML_PATH="org.openxmlformats.schemas";
                private static String MICRO_OOXML_PATH="com.microsoft.schemas";
                private static String SCHEMAORG_APACHE_XMLBEANS="schemaorg_apache_xmlbeans";    
             @Override
                protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
                    if (name.startsWith(POI_PATH)
                            || name.startsWith(EXCEL_PATH)
                            || name.startsWith(OOXML_PATH)
                            || name.startsWith(MICRO_OOXML_PATH)
                      ) {
                        synchronized (getClassLoadingLock(name)) {
                
                            // First, check if the class has already been loaded
                            Class<?> c = findLoadedClass(name);
                            if (c == null) {
                                c = findClass(name);
                                if (c == null) {
                                    throw new ClassNotFoundException("custom classloader can't find this class");
                                }
                            }
                            if (resolve) {
                                resolveClass(c);
                            }
                            return c;
                        }
                    } else {
                        return oldClassLoader.loadClass(name);
                    }
                }
            

            我们使用自定义类加载器来加载 ooxml-schemes.jar,但是 schemaorg_apache_xmlbeans.system.s8 B21CFFFCFED0B2438C2585C61F113F7.TypeSystemHolder 不在我们的类加载器加载路径中,默认类加载器加载它。 所以我通过更改我的类加载器代码来解决它

            protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
                    *// we change here to load schemaorg...*
                    if (name.startsWith("schemaorg_apache_xmlbeans")
                      ) {
                    //todo 
                       }
                   //todo
                }
            

            加载这个类就OK了

            【讨论】:

            • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
            • 我更改了 TypeSystemHolder 类的生成,即它现在是在与资源相反的源中生成的。 XmlBeans 5.0.1 实际上有更多的变化,所以是时候放弃旧的 ooxml-schema.jar 并开始使用新的 poi-ooxml-lite 或 poi-ooxml-full 工件了。生成的包也发生了变化 - 您的自定义类加载器可能需要考虑到这一点。
            猜你喜欢
            • 2020-11-18
            • 2012-11-07
            • 2018-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-02
            相关资源
            最近更新 更多