为什么在运行JPA时会出现此异常?

时间:2013-02-09 11:56:35

标签: java maven jpa

这只是Maven构建的普通JPA控制台。我有一个非常烦人的例外

java.lang.ClassNotFoundException: javax.persistence.Persistence

我找到了一些关于这个问题的解决方案,他们建议将 javaee-api lib添加到pom.xml。但错误仍然存​​在于 javee-api lib

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class App 
{
    public static void main( String[] args )
    {
        // This line causes error
        EntityManagerFactory entityManagerFactory =
                    Persistence.createEntityManagerFactory("testjpa");
        // It works when I comment above line and print hello
    }
}

所以我很确定该异常与库问题无关,而persistence.xml文件可能会导致问题。

这是我的项目树

├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── hoan
    │   │           ├── App.java
    │   │           └── Customer.java
    │   └── resources
    │       └── META-INF
    │           └── persistence.xml
    └── test

我的persistence.xml

<persistence-unit name="testjpa" transaction-type="RESOURCE_LOCAL">

    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>

    <class>com.foo.Customer</class>

    <properties>
        <property name="javax.persistence.jdbc.driver" 
                  value="com.mysql.jdbc.Driver"/>
        <property name="javax.persistence.jdbc.url"
                  value="jdbc:mysql://localhost:3306/quickstart">
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="password"/>
    </properties>

</persistence-unit>

pom.xml依赖项

<dependency>
    <groupId>org.apache.openjpa</groupId>
    <artifactId>openjpa-all</artifactId>
    <version>2.0.0</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.22</version>
</dependency>

顺便说一下,我跟着这个线程"No Persistence provider for EntityManager" error,它与我的问题完全一样,但似乎没什么用。

有什么问题?

更新:运行jar文件的命令行

java -cp target/jpa-demo.jar com.foo.App

2 个答案:

答案 0 :(得分:1)

将缺少的依赖项添加到pom.xml

    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>persistence-api</artifactId>
      <version>1.0</version>
    </dependency>

为什么它在eclipse中运行?

我不是一个日食瘾君子,但我知道你可以轻松自定义你的类路径,它不会与你的pom文件保持同步。因此,很有可能eclipse使用的类路径与maven类路径不匹配。

答案 1 :(得分:0)

将此jar添加到构建路径link

尽管通过像这样的maven添加依赖性更好

<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0.2</version>
</dependency>

此致 Anshul