【问题标题】:How do I run DataNucleus from within an Eclipse executable JAR?如何从 Eclipse 可执行 JAR 中运行 DataNucleus?
【发布时间】:2013-12-10 02:49:39
【问题描述】:

如何在 Eclipse 可执行 JAR 中使用 DataNucleus JPA 运行独立的 Google AppEngine 项目?客户会运行它,所以需要打包。它访问本地文件系统,因此它不能是 Web 应用程序。我没有使用 Maven,只是使用 Eclipse Project > Export > Executable JAR(以及它制作的 Ant 脚本)。当从 Eclipse 中运行时,它当然可以工作。当我运行 JAR 时,我收到以下 DataNucleus 错误:

原因:java.io.FileNotFoundException: rsrc:datanucleus-api-jdo-3.1.3.jar(系统找不到指定的文件)

原因:org.datanucleus.exceptions.NucleusException:读取清单文件“jar:rsrc:datanucleus-api-jdo-3.1.3.jar!/plugin.xml”时出错

javax.persistence.PersistenceException:尝试以下发现的实现后,“事务可选”发生显式持久性提供程序错误:来自提供程序的 org.datanucleus.api.jpa.PersistenceProviderImpl:org.datanucleus.api.jpa。 PersistenceProviderImpl

全栈跟踪

javax.persistence.PersistenceException: Explicit persistence provider error(s) occurred for "transactions-optional" after trying the following discovered implementations: org.datanucleus.api.jpa.PersistenceProviderImpl from provider: org.datanucleus.api.jpa.PersistenceProviderImpl
        at javax.persistence.Persistence.createPersistenceException(Persistence.java:242)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:184)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:70)
        at com.mwv.pic.dao.EMF.getInstance(EMF.java:26)
        at com.mwv.pic.dao.SecondaryDocumentsDao.isSecondaryDocumentUniqueByTitle(SecondaryDocumentsDao.java:80)
        at com.mwv.pic.dao.SecondaryDocumentsDao.addSecondaryDocument(SecondaryDocumentsDao.java:53)
        at com.mwv.Import.createSecondaryDocument(Import.java:294)
        at com.mwv.Import.importAllFiles(Import.java:234)
        at com.mwv.Main$6.run(Main.java:220)
        at java.lang.Thread.run(Unknown Source)
Caused by: org.datanucleus.exceptions.NucleusException: Error reading manifest file "jar:rsrc:datanucleus-api-jdo-3.1.3.jar!/plugin.xml"
        at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:482)
        at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions(NonManagedPluginRegistry.java:219)
        at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints(NonManagedPluginRegistry.java:160)
        at org.datanucleus.plugin.PluginManager.<init>(PluginManager.java:65)
        at org.datanucleus.plugin.PluginManager.createPluginManager(PluginManager.java:427)
        at org.datanucleus.api.jpa.JPAEntityManagerFactory.<init>(JPAEntityManagerFactory.java:328)
        at org.datanucleus.api.jpa.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:91)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:150)
        ... 8 more
Caused by: java.io.FileNotFoundException: rsrc:datanucleus-api-jdo-3.1.3.jar (The system cannot find the file specified)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:390)
        ... 15 more

代码,EMF.java:26

        instance = Persistence.createEntityManagerFactory("transactions-optional");

JAR 文件内容

META-INF/MANIFEST.MF

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.4
Created-By: 1.7.0_17-b02 (Oracle Corporation)
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Rsrc-Main-Class: com.mwv.Main
Rsrc-Class-Path: ./ google-api-services-drive-v2-rev107-1.16.0-rc.jar 
... a hundred JARs ...
Class-Path: .

【问题讨论】:

    标签: java eclipse executable-jar datanucleus


    【解决方案1】:

    这不是一个理想的解决方案,但我使用 7-Zip 管理器编辑了 JAR 文件,添加了 main.batmain.sh,并将其重命名为 .zip 扩展名。用户隐含地假设解压缩并运行批处理或 shell 脚本。脚本如下:

    java -cp ./:google-api-services-drive-v2-rev107-1.16.0-rc.jar:...:forms-1.3.0.jar com.mwv.Main

    和.bat文件一样,把:替换成;。我刚刚复制了MANIFEST.MFF4 在 7-Zip 中编辑)并手动使用了一些 Notepad++ Kung Fu 来制作巨大的类路径。毫无疑问,Eclipse 生成的 Ant 文件可以修改为自动包含脚本,但我还没有这样做。

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 2012-04-23
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多