繁体   English   中英

为什么在独立jar上使用jnlp运行时得到“没有EntityManager的持久性提供程序”

[英]why getting “No Persistence provider for EntityManager” when running with jnlp while standalone jar works fine

环境Win 8.1 MySQL服务器:localhost Netbeans 7.4 Java:1.7.0_51(J2SE)JRE:1.7.0_51-b31 EclipseLink(JPA 2.1)

有几篇帖子问这个“没有为EntityManager命名的持久性提供程序……”错误。 我正在使用J2SE(不是J2EE)进行开发。 但是,我的问题似乎很愚蠢,但确实困扰了我两天。 我是否需要其他软件才能使该独立程序正常工作? 但是,当我在Netbeans IDE下运行该程序时,为什么它会像橡木一样呢? 我是否尝试过某种环境设置问题?

工作快照和EclipseLink消息! 在此处输入图片说明

我使用Netbeans编写代码,并且运行正常。 现在,我决定将整个独立程序包复制到“ D:\\ NetBeansWork \\ ProjCostTracking \\ dist”中。 我在Java控制面板中将安全设置更改为中。 然后,我双击ProjCostTracking.jnlp启动。 好吧,这就是我所看到的。

在此处输入图片说明

这是我的persistence.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
      <persistence-unit name="ProjCostTrackingPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>ProjCostTracking.EntityUserlevel</class>
        <class>ProjCostTracking.EntityUser</class>
        <properties>
          <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/biotechcost?zeroDateTimeBehavior=convertToNull"/>
          <property name="javax.persistence.jdbc.password" value="1234"/>
          <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
          <property name="javax.persistence.jdbc.user" value="root"/>
        </properties>
      </persistence-unit>
    </persistence>

实体文件是 在此处输入图片说明

生成的文件和lib 在此处输入图片说明在此处输入图片说明

至于persistence.xml,我复制到3个地方只是为了确保可以“看到”它。 在此处输入图片说明

至于CLASSPATH,我将所需的jar文件(来自ProjCostTracking \\ dist \\ lib)复制到了默认JDK和JRE下的lib文件夹中。 因此,java应该看到这些罐子。 在此处输入图片说明在此处输入图片说明

通常这是连接器问题。 看来eclipse没有使用正确的连接器。 检查连接器版本。 它应该与您的MySQL数据库版本匹配。

我想我以错误的方式使用了JNLP。 因为当我使用“ java -jar myprogram.jar”运行独立版本时,它可以完美运行,没有错误。 但是,当我使用jnlp时,它给了我错误。 希望我不会在这里误导大家。 它与jnlp与持久性工具如何工作有关。

问题是,如果要使用应用程序管理的实体管理器,则必须控制驱动程序和使用的API的范围。

例如:在Java SE Application中,您可以使用maven构建项目。 依赖项的范围表示何时必须使用API​​或程序包。 例如

    (...)    
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.6.1.Final</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>3.6.1.Final</version>
            <scope>runtime</scope>
        </dependency>
    (...)

因为生命周期是由应用程序而不是容器管理的(例如在Java EE应用程序中)。 就我而言,将范围从provided的范围更改为runtime (与数据库驱动程序相同)很重要。 就您而言-如果您不使用Maven,则取决于JVM使用什么。

也许这是有帮助的。 我知道这类问题,确实很烦人:|

Maven范围文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM