为什么在使用jnlp运行“获取EntityManager的持久性提供程序”时,独立jar工作正常

时间:2014-03-10 07:44:34

标签: java jpa netbeans eclipselink

环境 赢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)进行开发。然而,我的问题似乎很愚蠢,但它确实困扰了我2天。是否需要其他软件才能使这个独立程序工作?但是当我在Netbeans IDE下运行程序时,为什么会出现问题呢?是不是我尝试了某种环境设置问题?

工作快照和EclipseLink消息! enter image description here

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

enter image description here

这是我的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>

实体文件是 enter image description here

生成的文件和lib enter image description here enter image description here

至于persistence.xml,我复制到3个地方只是为了确保它可以被“看到”。 enter image description here

对于CLASSPATH,我将所需的jar文件(从ProjCostTracking \ dist \ lib)复制到我的默认JDK和JRE下的lib文件夹中。所以java假设看到了罐子。 enter image description here enter image description here

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我想我正在以错误的方式使用JNLP。因为当我使用“java -jar myprogram.jar”运行独立时,它运行正常,没有错误。但是,当我使用jnlp时,它给了我错误。希望我不会误导所有人。它与jnlp如何与持久性函数相关联更为相关。

答案 2 :(得分:0)

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

例如:在Java SE Application中,您可以使用maven构建项目。当必须使用API​​或包时,依赖关系的范围发出信号。 E.g。

    (...)    
        <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 Scope Doc