当前位置: 首页 > 面试题库 >

Datanucleus,JDO和可执行jar-怎么做?

胡博艺
2023-03-14
问题内容

我正在使用Datanucleus和JDO开发用于嵌入式H2数据库的桌面应用程序。当我从Eclipse运行它时,一切正常,但是当我尝试用它制作可执行jar时,它将停止工作。我收到以下错误:

org.datanucleus.exceptions.NucleusUserException:已指定持久性进程使用名称为“
jdo”的ClassLoaderResolver,但DataNucleus插件机制尚未找到该持久化过程。 请检查您的CLASSPATH和插件规范。

当然,这表明我没有正确配置某些内容-
我缺少什么?如果我错过了一些大的东西,那根本就行不通,所以我假设它是一个有缺陷的可执行jar。我已经在其他应用程序中看到了该错误,例如JPOX,该错误已得到修复,但没有给出任何解决方案。

整个错误stacktrace:

Exception in thread "main" javax.jdo.JDOFatalInternalException: Unexpected exception caught.
        at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1193)
        at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808)
        at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:701)
        at db.PersistenceManagerFilter.init(PersistenceManagerFilter.java:44)
        at Main.main(Main.java:26)
NestedThrowablesStackTrace:
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at javax.jdo.JDOHelper$16.run(JDOHelper.java:1965)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.jdo.JDOHelper.invoke(JDOHelper.java:1960)
        at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1166)
        at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808)
        at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:701)
        at db.PersistenceManagerFilter.init(PersistenceManagerFilter.java:44)
        at Main.main(Main.java:26)
Caused by: org.datanucleus.exceptions.NucleusUserException: Persistence process has been specified to use a ClassLoaderResolver of name "jdo" 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:233)
        at org.datanucleus.NucleusContext.<init>(NucleusContext.java:196)
        at org.datanucleus.NucleusContext.<init>(NucleusContext.java:174)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.<init>(JDOPersistenceManagerFactory.java:364)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:294)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:195)
        ... 12 more

它指向的行是PersistenceManagerFilter初始化方法

pmf = JDOHelper.getPersistenceManagerFactory(getProperties());

属性文件如下所示:

    javax.jdo.PersistenceManagerFactoryClass=org.datanucleus.api.jdo.JDOPersistenceManagerFactory
datanucleus.ConnectionDriverName=org.h2.Driver
datanucleus.ConnectionURL=jdbc:h2:datanucleus
datanucleus.ConnectionUserName=sa
datanucleus.ConnectionPassword=

我拥有来自maven的所有依赖关系,目标是使用依赖关系进行部署。依赖性在datanucleus页面http://www.datanucleus.org/products/datanucleus/jdo/maven.html上说明

有任何想法吗?


问题答案:

添加到DataNucleus答案。
为了满足您的需求,您应该使用 maven-dependency-plugin
并将以下内容添加到pom.xml中

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/jars</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

然后,依赖项将位于 target / jars 目录中。

要执行您的应用程序,请使用以下命令:

Windows:
java -cp“ yourFile.jar; jars / *” package.className

Linux:
java -cp“ yourFile.jar:jars / *” package.className

注意:请勿使用jars / * .jar,这将无法正常工作



 类似资料:
  • 问题内容: 假设我已经从使用过的代码中创建了 当我们运行可执行jar时,没有控制台。那么,这条线怎么办?如何处理这种情况? 编辑01 : 注意 :这种情况是我既不使用控制台运行也不以任何方式将任何控制台与其关联。 编辑02 :使事情更清楚: 我知道什么都不会打印,因为没有控制台..!我想知道在这种情况下如何处理这条线?生成可执行jar的字节码时,是否省略此行?还是在没有控制台的情况下忽略了这一行?

  • 我正在使用EclipseIDE编程。在完成有关Apache POI的教程后: https://www.youtube.com/watch?v=RsrF2Ku7ad4 我通过eclipse和以下链接创建了一个可执行jar:http://help.eclipse.org/mars/index.jsp?topic=/org.eclipse.jdt.doc.user/tasks/tasks-37.htm

  • 我在Eclipse中有一个maven项目。在src/main/resources下,我有一个名为“directoryToCopy”的目录,其中包含文件。一旦我运行了我的项目,我想将“directoryToCopy”复制到桌面上的本地目录“localDirec”下。 我用了这个: 这在本地工作正常,但是当我想将其作为可执行jar文件运行时,我会得到NullPointerException。 请问有什

  • 我在Netbeans IDE 8.0.1中编写了一个名为SampleChat的Java GUI程序,并使用“Clean and Build”函数创建了一个jar文件。 我转到Netbeans创建的'dist'目录,双击它生成的jar文件。打开一个cmd窗口,其行如下: 我打算从一个U盘共享程序,所以它是至关重要的,唯一的要求是一个JVM,鼠标,也许一些手指来双击它。 我想出的一个尴尬的解决方案是编

  • 我正在使用相对较新的用于Eclipse的Google Cloud Tools插件,取代用于Eclipse的Google插件。我已将我的应用程序引擎项目转换为新插件的环境,但现在应用程序停止工作。 在请求使用Google数据存储条目的servlet时,我遇到以下错误: GPE(谷歌插件Eclipse)对此有一些选择:https://developers.google.com/eclipse/docs

  • 我试图用scala和Maven创建可执行jar。我正在使用maven-scala-plugin和maven-assembly-plugin,但在我看来,汇编插件被忽略了。我得到没有依赖项的jar和包含没有主类行的manifest。