我有一个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驱动程序;但问题仍然存在。
答案 0 :(得分:1)
这是解决这个问题的方法。
之后,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。