使用Spring引导maven项目作为依赖项

时间:2015-11-27 08:11:51

标签: java maven spring-boot flyway

这似乎是一个微不足道的问题,但我花了几个小时试图解决这个问题,所以我很乐意为你提供任何帮助和见解。

我在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,将这两个项目放在同一个工作集中等等。到目前为止没有任何工作。

1 个答案:

答案 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是进行自动连线的类,无论是在您的项目中还是在导入的第三方库中。我有时会使用它来禁用测试的安全自动配置。

我确信还有更多选择,但我认为这些是你最好的选择。