【问题标题】:Packaging JPA entities in a jar inside a Spring Boot application在 Spring Boot 应用程序内的 jar 中打包 JPA 实体
【发布时间】:2023-03-17 12:40:01
【问题描述】:

我正在将 JEE REST(使用 JAX-RS 2.0)应用程序重构为 Spring Boot 应用程序。我的旧应用程序打包在 .war 中,并有一个包含实体的 jar 文件和 JPA 的 persistence.xml 配置文件。这个 jar 被复制到 WEB-INF/lib 目录中。我知道 Spring JPA 的工作方式不同,我现在不使用 persistence.xml,但我想知道我是否可以像现在一样将我的 JPA 实体类打包到一个 jar 中并将它们包含在我的 Spring Boot 应用程序中。这样我就可以轻松地在不同的 Spring Boot 应用程序中重用该 jar。

【问题讨论】:

    标签: jpa spring-boot


    【解决方案1】:

    我很确定你可以做到这一点,因为我最近在我的一个项目中做了同样的事情。您唯一需要做的就是确保在主 Spring Boot 配置类上添加 @EntityScan 注释,并在 JAR 中使用实体的基本包。

    @EntityScan("my.external.jar.entity.package")
    

    【讨论】:

      【解决方案2】:

      在我的情况下,我遇到了这个问题,在应用程序的pom.xml 中导入库后,在 SpringBoot 项目主类中,插入带有第一个包的 @EntityScan 注释和 *.像这样:@EntityScan ("br.*")

      【讨论】:

        【解决方案3】:

        Spring Boot 并不真正关心 JPA 实体是作为单独的 jar 包还是包含在应用程序中。它是一个运行时框架,运行时类可以从 jar 中加载(它应该驻留在 BOOT-INF/lib 或“直接”从 Spring Boot 工件中的 *.class 文件中。

        现在 Spring Boot 中有一条规则,它说它只会在“主”类所在的包中或在它下面扫描 bean(包括实体)。这样做是为了避免对您可能使用的第三方类进行长时间的分析。这些第三方类通常根本不知道 spring,当然不包含任何 spring bean。

        例子:

        说,你把你的“主”类(用@SpringBootApplication注释的那个)放在包中:com.mycompany.myapp

        在这种情况下,将扫描以下包(仅举几个例子):

        • com.mycompany.myapp
        • com.mycompany.myapp.web
        • com.mycompany.myapp.services.bl
        • com.mycompany.myapp.whatever.doesnt.matter ...

        但不会扫描以下软件包(同样,示例,不是完整列表):

        • com.mycompany
        • com.anothercompany
        • org.hibernate

        如果您想“更改”此默认规则并将实体放在不遵守此约定的包中,例如com.mycompany.jpa.entities,那么您确实应该使用@EntityScan 注释,正如我们的同事已经建议的那样。

        您可以阅读有关此主题的信息here。如果您使用的是 spring 数据,您可能还需要熟悉 @EnableJpaRepositories,但虽然相关,但它是一个不同的主题。

        【讨论】:

          猜你喜欢
          • 2020-01-19
          • 2020-12-03
          • 1970-01-01
          • 2017-02-17
          • 2017-04-20
          • 2020-07-04
          • 2021-03-21
          • 2018-06-21
          • 2019-02-20
          相关资源
          最近更新 更多