这似乎是一个微不足道的问题,但我花了几个小时试图解决这个问题,所以我很乐意为你提供任何帮助和见解。
我在Eclipse中有两个Spring-boot maven项目。让我们称他们为 ProjectA 和 ProjectB 。我需要在ProjectB中使用ProjectA中的一个类(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尝试使用的类得到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 install,将这两个项目放在同一个工作集中等等。到目前为止没有任何工作。
答案 0 :(得分:1)
如果以这种方式导入Spring Boot项目,则导入所有@Configuration
类,Spring Boot将对您在那里的所有内容进行扫描,以便自动连接它。
解决此问题的最佳方法是创建一个单独的项目,其中包含两个项目使用的类并导入它们。
但是,有几种方法可以使这项工作得以实现。
首先,虽然我不确定如何配置Flyway,但是如果它是在您的@Configuration
个类中完成的,那么您可以使用@Profile("flyway")
注释该配置。这样,如果项目需要运行Flyway迁移,那么它可以激活配置文件。否则,Flyway不会被激活。
其次,如果您的项目中没有自动配置(就像许多Spring Boot Starter依赖项中那样),那么您可以通过将它放在Spring Boot应用程序类中来排除任何@Configuration
类auto-wires Flyway (嗯......任何@Configuration
真的):
@EnableAutoConfiguration(exclude = { FlywayConfiguration.class })
...其中FlywayConfiguration.class
是进行自动连线的类,无论是在您的项目中还是在导入的第三方库中。我有时会使用它来禁用测试的安全自动配置。
我确信还有更多选择,但我认为这些是你最好的选择。