我們目前正在使用基于JPA 和 Eclipselink 的具有持久性的 Spring 專案的依賴版本。在升級程序中,我了解到Eclipselink由于法律原因從 3.0 版開始切換到 Jakarta 命名空間,如本主題所述。
我們成功地更新了代碼,以便獨立于 Spring Data使用 Jakarta Persistence API 3.0.0 。遷移非常簡單:
- 將 Eclipselink 版本提升到 3.0.x
- 向 Jakarta 3 添加顯式依賴項
- 在代碼中替換
javax.persistence為jakarta.persistencepersistence.xml
現在我正在考慮配置 Spring Data 以在 Jakarta 3.0.0 中使用 Eclipselink,但我注意到 Spring 仍然依賴于 Jakarta 2.2.3。當我覆寫 Maven 專案中的版本時,Spring Data 在啟動時抱怨:
java.lang.NoClassDefFoundError: javax/persistence/EntityManagerFactory
at org.springframework.data.jpa.util.BeanDefinitionUtils.<clinit>(BeanDefinitionUtils.java:57)
at org.springframework.data.jpa.repository.support.EntityManagerBeanDefinitionRegistrarPostProcessor.postProcessBeanFactory(EntityManagerBeanDefinitionRegistrarPostProcessor.java:72)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:325)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:191)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290)
at com.mycompany.sandbox.springjpaeclipselinkfix.SpringApp.main(SpringApp.java:12)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.ClassNotFoundException: javax.persistence.EntityManagerFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 18 common frames omitted
顯然,它試圖創建一個持久性單元default,但無法加載javax/persistence/EntityManagerFactory(顯然,它現在在jakarta.persistence包中)。
我的理解是 Spring Data 的代碼依賴于 Jakarta 2,不支持使用 Jakarta 3。但是,應該可以將 Eclipselink 用作 Spring Data 持久性提供程式,并且 Eclipselink 確實支持 Jakarta 3。此時我很困惑,我找不到任何當前的示例,只有與javax.persistence.
- 是否可以將 Spring Data 配置為使用 Eclipselink 3 和 Jakarta 3,還是我現在應該堅持使用舊的命名空間?
- 如果可能的話,你能給我指出一些當前的例子嗎?
顯然,可以 fork Spring Data JPA 的代碼并進行遷移,但我沒有足夠的資源來維護分支。
我還發布了我的 pom.xml 的相關部分(其余部分類似于標準的 Spring Data 專案):
<project>
...
<properties>
...
<jakarta-persistence.version>3.0.0</jakarta-persistence.version>
<eclipselink.version>3.1.0-M1</eclipselink.version>
</properties>
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
</dependency>
...
</dependencies>
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>${eclipselink.version}</version>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>${jakarta-persistence.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
...
</project>
其他標簽:Jakarta EE 9、Jakarta Persistence 3.0、Java 17。
uj5u.com熱心網友回復:
我在Spring 博客中找到了答案。顯然,路線圖包括“在 2022 年第四季度”切換到雅加達命名空間:
正如昨天在 SpringOne 上宣布的那樣,Spring Framework 6 和 Spring Boot 3 計劃在 2022 年第四季度達到通用可用性的高端基準:
Java 17 (from Java 8-17 in the Spring Framework 5.3.x line) Jakarta EE 9 (from Java EE 7-8 in the Spring Framework 5.3.x line)這一前瞻性基線將為我們的 API 設計和集成作業帶來顯著優勢,貫穿您的應用程式代碼,并在未來許多年內為框架和您的應用程式提供未來證明。然而,這當然是有代價的:基于 Spring Framework 6 和 Spring Boot 3 的應用程式在運行時至少需要 JDK 17,以及至少 Tomcat 10 / Jetty 11(為了與 Jakarta EE 9 兼容)。更重要的是,您的應用程式源代碼可能需要進行一些更改:例如,在 Jakarta EE 9 中,無論您在哪里接觸 Servlet API、JPA、Bean 驗證等,javax 到 jakarta 命名空間的更改。
因此,需要等待 Spring 推出更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379047.html
