13

我已经从一个 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 中?

4

6 回答 6

12

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

于 2013-12-16T05:59:28.797 回答
5

在你生成的 jar 文件中,确保你已经包含了从你的 xmlbeans 生成的类文件。

从堆栈跟踪:

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

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

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

编辑:根据问题改写

jar-with-dependencies对于在 Maven 使用选项中构建具有依赖项的 jar ,例如

两个很好的参考:

  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,则不需要主类

于 2011-12-15T10:33:05.697 回答
4

当您遇到此类错误时 WSDL2Java 生成的 TypeSystemHolder.class 不会放在您的类路径中以避免此错误。

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

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

于 2013-01-16T13:15:59.260 回答
3

请在 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>
于 2012-12-04T05:22:08.753 回答
0

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

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

部署那个 jar 。

于 2017-07-07T16:09:22.973 回答
0

我遇到了这个问题。在我们的项目中,我们使用自定义类加载器来兼容 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
    }

加载这个类就可以了

于 2021-10-09T08:44:05.757 回答