使用 Spring boot maven 项目作为依赖项
Using a Spring boot maven project as a dependency
这似乎是一个微不足道的问题,但我花了几个小时试图解决这个问题,所以如果您能提供任何帮助和了解正在发生的事情,我将很高兴。
我在 Eclipse 中有两个 Spring-boot maven 项目。我们称它们为 ProjectA 和 ProjectB。我需要在 ProjectB 中使用来自 ProjectA 的 class (POJO)。这意味着 ProjectA 是 ProjectB 的依赖项。
我把这个依赖放在ProjectB的pom.xml:
<dependency>
<groupId>cz.my.project</groupId>
<artifactId>ProjectA</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在 Eclipse 中,一切似乎都很好,但是当我使用 ProjectB 启动 Tomcat 时,我遇到了各种异常(取决于我为此依赖项设置的范围)。
我尝试从 ProjectA 使用的 class 出现 ClassNotFound 异常,或者出现以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Unable to scan for SQL migrations in location: classpath:db/migration
ProjectA 包含一个带有一些迁移脚本的 Flyway,这些脚本以某种方式在 ProjectB 中执行(即使 ProjectB 不包含任何 Flyway 内容)。
当 运行 maven 编译时,我得到以下异常(它搜索中央仓库而不是本地仓库):
Could not resolve dependencies for project cz.ProjectA.MyPOJO-service:war:0.0.1: Could not find artifact cz.ProjectA:jar:0.0.1 in central (http://repo.maven.apache.org/maven2)
谁能帮我解决这个问题?我尝试了各种方法:手动将 projectA 放在 classpath 上,运行 在 ProjectA 上安装 maven,将这两个项目放在同一个工作集中等等。到目前为止没有任何效果。
如果您以这种方式导入 Spring Boot 项目,您将导入所有 @Configuration
classes 并且 Spring Boot 将扫描所有内容你在那里为了自动连接它。
解决此问题的最佳方法是创建一个包含 classes 的单独项目,这两个项目都使用它们并将其导入。
但是,您可以通过多种方式实现此功能。
首先,虽然我不确定 Flyway 是如何配置的,但如果它是在你的 @Configuration
classes 之一中完成的,那么你可以用 [=13 注释该配置=].这样,如果一个项目需要将 Flyway 迁移到 运行,那么它可以激活配置文件。否则,Flyway 不会被激活。
其次,如果自动配置不在您的项目中(如在许多 Spring Boot Starter 依赖项中),那么您可以排除任何 @Configuration
class 自动连接Flyway 通过将其放入 Spring 启动应用程序 class(好吧......任何 @Configuration
真的):
@EnableAutoConfiguration(exclude = { FlywayConfiguration.class })
... 其中 FlywayConfiguration.class
是执行自动装配的 class,无论是在您的项目中还是在导入的第三方库中。我有时使用它来禁用测试的安全自动配置。
我确定还有更多选择,但我认为这些是您最好的选择。
这似乎是一个微不足道的问题,但我花了几个小时试图解决这个问题,所以如果您能提供任何帮助和了解正在发生的事情,我将很高兴。
我在 Eclipse 中有两个 Spring-boot maven 项目。我们称它们为 ProjectA 和 ProjectB。我需要在 ProjectB 中使用来自 ProjectA 的 class (POJO)。这意味着 ProjectA 是 ProjectB 的依赖项。
我把这个依赖放在ProjectB的pom.xml:
<dependency>
<groupId>cz.my.project</groupId>
<artifactId>ProjectA</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在 Eclipse 中,一切似乎都很好,但是当我使用 ProjectB 启动 Tomcat 时,我遇到了各种异常(取决于我为此依赖项设置的范围)。
我尝试从 ProjectA 使用的 class 出现 ClassNotFound 异常,或者出现以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Unable to scan for SQL migrations in location: classpath:db/migration
ProjectA 包含一个带有一些迁移脚本的 Flyway,这些脚本以某种方式在 ProjectB 中执行(即使 ProjectB 不包含任何 Flyway 内容)。
当 运行 maven 编译时,我得到以下异常(它搜索中央仓库而不是本地仓库):
Could not resolve dependencies for project cz.ProjectA.MyPOJO-service:war:0.0.1: Could not find artifact cz.ProjectA:jar:0.0.1 in central (http://repo.maven.apache.org/maven2)
谁能帮我解决这个问题?我尝试了各种方法:手动将 projectA 放在 classpath 上,运行 在 ProjectA 上安装 maven,将这两个项目放在同一个工作集中等等。到目前为止没有任何效果。
如果您以这种方式导入 Spring Boot 项目,您将导入所有 @Configuration
classes 并且 Spring Boot 将扫描所有内容你在那里为了自动连接它。
解决此问题的最佳方法是创建一个包含 classes 的单独项目,这两个项目都使用它们并将其导入。
但是,您可以通过多种方式实现此功能。
首先,虽然我不确定 Flyway 是如何配置的,但如果它是在你的 @Configuration
classes 之一中完成的,那么你可以用 [=13 注释该配置=].这样,如果一个项目需要将 Flyway 迁移到 运行,那么它可以激活配置文件。否则,Flyway 不会被激活。
其次,如果自动配置不在您的项目中(如在许多 Spring Boot Starter 依赖项中),那么您可以排除任何 @Configuration
class 自动连接Flyway 通过将其放入 Spring 启动应用程序 class(好吧......任何 @Configuration
真的):
@EnableAutoConfiguration(exclude = { FlywayConfiguration.class })
... 其中 FlywayConfiguration.class
是执行自动装配的 class,无论是在您的项目中还是在导入的第三方库中。我有时使用它来禁用测试的安全自动配置。
我确定还有更多选择,但我认为这些是您最好的选择。