【发布时间】:2019-05-03 12:00:21
【问题描述】:
我有一个应用程序,它使用 Spring Boot 和 Spring Data JPA 以及基于注释的配置作为其持久层。我已经开始将此应用程序与 Java (OpenJDK) 11 一起迁移到最新的 Spring Boot 版本 (2.1.x)。配置模块描述符后,应用程序启动,但是当 Spring 达到它想要构建的点时持久层,应用程序停止并出现以下异常:
Caused by: javax.persistence.PersistenceException: Unable to resolve persistence unit root URL
at spring.orm@5.1.2.RELEASE/org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:640)
at spring.orm@5.1.2.RELEASE/org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:462)
at spring.orm@5.1.2.RELEASE/org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:443)
at spring.orm@5.1.2.RELEASE/org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:328)
at spring.beans@5.1.2.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1804)
at spring.beans@5.1.2.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741)
... 16 common frames omitted
Caused by: java.io.FileNotFoundException: class path resource [] cannot be resolved to URL because it does not exist
at spring.core@5.1.2.RELEASE/org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:195)
at spring.orm@5.1.2.RELEASE/org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:636)
... 21 common frames omitted
此问题仅在我尝试在 IntelliJ IDEA 中运行应用程序时发生,该应用程序通过配置模块路径而不是类路径来启动 JVM(如预期的那样)。当我尝试运行打包为可执行 jar 的应用程序时,问题就消失了,但正如我所注意到的,当应用程序从可执行 jar 运行时,模块描述符基本上被忽略了......
我设法发现org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager 找到了实体,并将它们存储在持久性单元中,但之后,它会尝试确定持久性单元根 URL,这就是失败的地方发生。没有模块描述符,应用程序有一个类路径,这对于 DefaultPersistenceUnitManager 来说就足够了,它将使用目标目录(从 IDEA 运行)或持久性 Maven 模块的 JAR(从可执行 JAR 运行)。
我假设模块描述符中缺少某些内容,因此仅供参考,如下所示:
open module leaflet.app.backend.persistence {
requires java.persistence;
requires java.validation;
requires org.apache.commons.lang3;
requires org.hibernate.orm.core;
requires spring.beans;
requires spring.context;
requires spring.data.commons;
requires spring.data.jpa;
requires spring.tx;
exports hu.psprog.leaflet.persistence.dao;
exports hu.psprog.leaflet.persistence.entity;
exports hu.psprog.leaflet.persistence.repository;
exports hu.psprog.leaflet.persistence.repository.specification;
}
如果有人可能对这个问题有任何想法,请不要犹豫写下来 - 我基本上被困在这一点上。非常感谢您!
【问题讨论】:
-
您使用模块系统的动机是什么?在构建将打包为自包含可执行 jar 文件的 Spring Boot 应用程序时,使用它几乎没有任何好处。
-
主要是学习——这是一个家庭项目。尽管如此,还是有一些地方不太对劲,它应该正在运行,所以我可能会错过一些东西。
-
我只是在完全不同的情况下遇到了这个问题,我想我会给我 2 美分:我们有一个 spring boot 应用程序,运行良好,但我试图从另一个文件夹运行“mvn install” ;单元测试失败。所以我猜想在通过指定文件夹来编译/运行时 Spring 可能会出现问题,就像您的 IDE 可能那样。
标签: java spring-boot spring-data-jpa java-11 java-platform-module-system