没有持久性提供程序WHEN导出jar文件

时间:2013-07-02 10:58:49

标签: java sql-server jpa export

我有一个maven桌面项目,它使用JPA作为持久层;该层处理一个MySQL数据库和一个SQL Server数据库。

当我在Eclipse中运行它时,没有问题;但是当我在运行jar时尝试将其导出输出时,控制台会打印着名的:

 javax.persistence.PersistenceException: No persistence provider for
 EntityManager named axaptaUnitName

axaptaUnitName是处理SQL Server的单位。我尝试过从Eclipse中导出所有三种类型,将所需的库提取到JAR中,将包解压缩到JAR中,然后复制到外部文件夹中;它们都不起作用。

所有库(包括带有SQL Server的连接器)都正确添加到classpath中;在Eclipse里面一切都很完美;所以我认为这是某种出口问题。
有什么建议吗?

编辑:我试图用JTDS驱动程序替换Microsoft SQL驱动程序;但问题仍然存在。

3 个答案:

答案 0 :(得分:1)

这是解决这个问题的方法。

  1. 我只是将它作为一个可运行的Jar导出,并带有选项 - “将所需的库提取到生成的Jar中”。
  2. 使用成功的软件打开生成的Jar。
  3. 然后我发现META-INF文件夹中没有“Persistence.xml”。
  4. 我将“Persistence.xml”文件拖到了成就者窗口本身的META-INF文件夹中。
  5. 封闭的成员计划。
  6. 之后,PersistenceException消失了。

答案 1 :(得分:0)

我假设您使用“超级罐”方法,其中所有依赖性罐子都被分解成一个大罐子。这种方法的问题是如果jar文件具有相同的相对路径,它们可以相互覆盖。考虑一下这个scneario:

// contents of A.jar
com/foo/Class1.class
com/foo/Class2.class
META-INF/persistence.xml

// contents of B.jar
com/bar/Class1.class
com/bar/Class2.class
META-INF/persistence.xml

当A.jar和B.jar爆炸并重新打包到Uber.jar时,早期的META-INF / persistence.xml将被覆盖,导致错误/不需要的行为

部署独立应用程序的更好解决方案是将所有依赖项保存在原始jar包中,将它们放在一个文件夹中并使用如下命令运行(windows):

java -cp "dependency/;myprog.jar" com.foo.MyMainClass

(所有依赖关系jar都放在文件夹“dependency”)

答案 2 :(得分:0)

我找到了一个解决方案:

我没有使用Eclipse导出项目,而是使用Maven this way生成了一个jar。