首页 > 解决方案 > 在 Web 应用程序之外使用 Spring Boot 中的实体和存储库定义

问题描述

我有一个 Spring Boot 2.1 Web 应用程序。它工作得很好。我可以将它打包为 WAR 或 JAR。在我的 pom.xml 文件中,我使用:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
</parent>

这个应用程序有许多实体类和相当多的 Spring Data 存储库。我们几乎总是将其部署为 WAR 文件。

问题是:有时我们需要对数据库执行命令行或批处理。例如,我们可能想要运行一个进程来调整存储在数据库中的所有图像的大小,并且应该由管理员从命令行运行。

如果 mvn install 能够在本地 Maven 存储库中安装一个 JAR 文件,我可以在另一个项目中使用该工件来访问我的实体和存储库定义,那就太好了。我尝试了很多事情,但是每当我将项目构建为 JAR 文件并查看 JAR 时,我的所有类都在 BOOT-INF/classes 中,这不允许从另一个项目中引用它们。

我能够通过在 spring-boot-maven-plugin 中使用重新打包目标来解决这个问题。但是,当我这样做时,它确实生成了一个 jar 文件,但我的 CLI 应用程序无法使用创建的存储库 bean 正确启动。

我在 Spring Boot 文档中读到:

与 war 文件一样,Spring Boot 应用程序不打算用作依赖项。如果您的应用程序包含您想与其他项目共享的类,推荐的方法是将该代码移动到单独的模块中。然后,您的应用程序和其他项目可以依赖单独的模块。

有没有更简单的方法可以做到这一点,这样我就不必创建另一个项目并进行管理?或者为实体和 Spring Data 存储库创建一个单独的项目是一种好习惯吗?

标签: spring-boot

解决方案


所以,简而言之,您只想拥有一个包含实体和存储库的库?那么配置一个简单的maven项目应该就够了,一个标准的,不继承自Spring Boot。

由于 Spring Boot 在后台使用 Spring Data JPA,因此您只需要 Spring Data JPA 声明,因此添加将其标记为provided.

<dependencies>
  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>Some reference version<version>
    <scope>provided<scope>
  </dependency>
<dependencies>

这允许不让项目包含 Spring Data JPA 依赖项本身,因为它将包含在使用 Spring Boot 的最终项目中。但是,您需要声明要使用的参考版本,您可以采用当前 Spring Boot 项目使用的版本(您可以查看 maven 依赖关系树)。

https://spring.io/projects/spring-data-jpa

maven 范围编译和提供给 JAR 打包的区别


推荐阅读