【问题标题】:Is there a way to properly integrate two (or more) Spring-Boot projects?有没有办法正确集成两个(或更多)Spring-Boot 项目?
【发布时间】:2014-07-03 15:14:57
【问题描述】:

只是为了更好地理解 Spring:例如,我想开发一个 Web 门户和数据访问层(使用 JPA/Hibernate/MySQL 等)作为不同的 Spring-Boot 项目,由使用 Maven 或 Gradle 来集成这两个部分

有没有办法做到这一点?还有其他最佳实践来组织涉及多人的大型项目?

我可以为它们中的每一个定义一个主类还是可能会导致问题?

注意:在这种情况下,Web 门户代表集成点:它导入 DAL 的 jar,而不是相反。

【问题讨论】:

  • 您不希望数据访问层可运行,是吗?

标签: java spring maven gradle spring-boot


【解决方案1】:

在您的场景中,我个人会做的是使 Web 门户模块成为 Spring Boot 项目,而数据访问层不会是 Spring Boot 项目(因为它不应该单独运行)。 所有的自动配置都将由门户网站模块完成(当然需要将数据访问层作为依赖项包含在内)。

数据访问层的单元和集成测试可以很容易地在该模块上使用或不使用仅测试 Spring Boot 配置运行

【讨论】:

  • 嗯...我应该为 Web 门户定义 spring-boot-starter-data-jpa 依赖项吗? (我想我没有。)
  • 为了让数据访问模块能够自己编译,并且测试能够在那里自己运行(不是作为整个项目构建的一部分),模块本身需要依赖 Spring Data JPA。一旦您在数据访问模块中拥有了正确的依赖关系,您就不需要添加spring-boot-starter-data-jpa,因为开始所做的只是强制包含您已经拥有的依赖关系。 spring-boot-starter-data-jpa 不包含任何 Spring Boot 代码。
  • 但这并不意味着您不应该包含它。我个人认为:这是获得一组一致的依赖项的好捷径。
  • @DaveSyer 是的,当然你可以添加它以更加一致:)
【解决方案2】:

这当然是可能的。一旦你掌握了它的窍门,设置就很简单了——只需在库中添加一个配置类,在消费应用程序中添加一个 @Import。

注意:到目前为止,我只使用 JPA 和自动装配对此进行了测试,我相信它应该适用于大多数常见的 Spring 功能,但还不能确认这一点。

所以在你的库中的 src/main/etc..

@Configuration
@EntityScan(basePackages = "uk.co.company.name.models")
@ComponentScan(basePackages = { "uk.co.company.name" })
@EnableJpaRepositories("uk.co.company.name")
public class LibraryNameConfig {

}

然后在 src/test 中

@SpringBootApplication
@Import({ LibraryNameConfig.class})
public class FakeTestApp {
    public static void blah() {}
} 

正常测试

 @RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = FakeTestApp.class)
public class TestTestModelWiredUp {

    @Autowired
    TestModelService testModelService;

    @Test
    public void contextLoads() {
    }
}

这应该可以很好地与标准 gradle/mvn 一起使用以生成经过测试的 jar。

然后在另一个 Spring Boot 应用程序中使用它,将 jar 作为依赖项包含在标准中

要使其在应用程序中工作,您只需像上面一样再次@Import。我已经使用导入的配置类以相同的方式设置了我的应用程序和库。似乎有几十种方法可以在 Spring Boot 中使用注释进行配置,这种设置对我有用。

@SpringBootApplication
@Import({ LibraryNameConfig.class, RealAppConfig.class})
public class SpringBootApp {
    public static void aFunction() {}
}

您需要库中的 application.properties 进行测试,但当作为库包含时,它将使用应用程序的属性。

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2017-02-15
    • 1970-01-01
    • 2022-01-23
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2014-03-14
    相关资源
    最近更新 更多