将JPA实体打包到Spring引导应用程序内的jar中

将JPA实体打包到Spring引导应用程序内的jar中,jpa,spring-boot,Jpa,Spring Boot,我正在将JEE REST(使用JAX-RS2.0)应用程序重构为Spring引导应用程序。我的旧应用程序打包在.war中,有一个包含实体的jar文件和JPA的persistence.xml配置文件。这个jar被复制到WEB-INF/lib目录中。我知道SpringJPA的工作方式不同,我现在不使用persistence.xml,但我想知道我是否可以像现在这样将我的JPA实体类打包到jar中,并将它们包含在我的SpringBoot应用程序中。通过这种方式,我可以在不同的Spring Boot应用程

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

我非常确定您可以做到这一点,因为我最近在我的一个项目中也做了同样的工作。您需要做的唯一一件事是确保在主Spring Boot config类上添加@EntityScan注释,并将实体的基本包放在JAR中

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

在我的例子中,我遇到了这个问题,在应用程序的
pom.xml
中导入库之后,在SpringBoot项目主类中,插入带有第一个包和*的
@EntityScan
注释。就像这样:
@EntityScan(“br.*)
Spring Boot并不真正关心JPA实体是作为单独的jar包还是包含在应用程序中。它是一个运行时框架,运行时中的类可以从jar加载(它应该位于
BOOT-INF/lib
中,或者直接从spring引导工件中的*.class文件加载)

现在SpringBoot中有一条规则,即它将只扫描包中的bean(包括实体),其中包含“main”类驻留或位于其下。这样做是为了避免对可能使用的第三方类进行冗长的分析过程。这些第三方类通常根本不支持spring,至少不包含任何spring bean

例如:

比如说,您将“main”类(用
@SpringBootApplication
注释的类)放在包中:
com.mycompany.myapp

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

  • com.mycompany.myapp
  • com.mycompany.myapp.web
  • com.mycompany.myapp.services.bl
  • com.mycompany.myapp.whatever.doesnnt.matter
但是,不会扫描以下包(同样是示例,而不是完整列表):

  • com.mycompany
  • 另一家公司
  • org.hibernate
如果您想“更改”此默认规则并将实体放入不符合此约定的包中,例如
com.mycompany.jpa.entities
,那么您确实应该使用
@EntityScan
注释,正如我们的同事所建议的那样

您可以阅读有关此主题的内容。如果您使用的是spring数据,您可能还需要熟悉
@EnableJpaRepositories
,但这是一个不同的主题