0

我有一个使用 JPA 作为持久层的 Maven 桌面项目;这一层处理一个 MySQL 数据库和一个 SQL Server 数据库。

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

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

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

所有库(包括与 SQL Server 的连接器)都正确添加到类路径;在 Eclipse 中一切正常;所以我认为这是某种出口问题。
有什么建议么?

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

4

3 回答 3

1

这是解决此问题的方法。

  1. 我只是将它导出为带有选项的可运行 Jar -“将所需的库提取到生成的 Jar 中”。
  2. 使用归档软件打开生成的 Jar。
  3. 然后我发现 META-INF 文件夹中没有“Persistence.xml”。
  4. 我将我的“Persistence.xml”文件拖到了成就者窗口本身的 META-INF 文件夹中。
  5. 封闭的归档程序。

之后,PersistenceException 消失了。

于 2013-10-30T13:40:49.740 回答
0

我找到了一种解决方案:

我没有使用 Eclipse 导出项目,而是以这种方式使用 Maven 生成了一个 jar 。

于 2013-07-03T11:46:58.123 回答
0

我假设您使用“uber-jar”方法,将所有依赖项 jar 分解成一个大 jar。这种方法的问题是,如果 jar 文件具有相同的相对路径,它们可以相互覆盖。考虑这个场景:

// 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 都放在文件夹“依赖”中)

于 2013-07-02T11:12:01.840 回答