如何在 OpenShift 上部署多模块 maven spring boot 应用程序
Posted
技术标签:
【中文标题】如何在 OpenShift 上部署多模块 maven spring boot 应用程序【英文标题】:How to deploy multi-module maven spring boot application on OpenShift 【发布时间】:2016-12-30 10:47:03 【问题描述】:我有一个多模块 spring-boot 项目,我想在 Openshift 上部署它,我也在那里安装了 Jenkins。源代码托管在 Github。 每个模块都包含在一个战争中,以便拥有一个微服务结构:
<modules>
<module>xyz-common</module>
<module>xyz-data-services</module> <!--a REST service to interact with mongodb-->
<module>xyz-batch-importer</module> <!--a service to import files into Mongo-->
<module>xyz-frontend</module>
</modules>
我找到了部署单个 spring-boot 应用程序的教程,但我无法弄清楚这如何应用于多模块 maven 项目。
【问题讨论】:
这是微服务架构的主要目标之一:独立部署每个应用程序! 那我该怎么办?为每个模块创建不同的项目? 【参考方案1】:如果您想在 openshift 上使用多模块 maven 项目,那么您必须告诉 openshift 如何构建它们。您可以通过定义构建环境变量或编写可由 Openshift 解释的自定义构建脚本来完成此任务。
这两种方法你都可以按照this教程:
如果您想使用第一种方法,您可以通过为构建配置定义“MAVEN_ARGS_APPEND”变量来告诉 openshift 在构建过程中使用额外的 maven 命令。
所以当构建操作在 openshift 上开始时,它会告诉 Maven 使用这些附加参数构建应用程序。
定义下面列出的其他构建环境变量以独立部署战争模块:
MAVEN_ARGS_APPEND: -pl 模块名 --also-make
ARTIFACT_DIR:模块名/目标/
MODULE_DIR:模块名称
在这里,“-pl”命令提供构建“xyz-data-services”及其所有依赖项。因此,如果您的“xyz-data-services”模块依赖于“xyz-common”,那么 maven 将构建“xyz-common”,为“xyz-data-services”创建相关工件,将它们打包在一起并部署“xyz-数据服务”作为 pod 上的战争。
在您的情况下,假设您要将“xyz-data-services”模块和“xyz-front-end”模块打包为war并部署它们。
案例一:
如果您想让这些模块可以自我部署,那么您必须创建两个将在不同的 pod 上运行的应用程序。
第一个应用程序将具有以下构建环境变量:
MAVEN_ARGS_APPEND: -pl xyz-data-services --also-make
ARTIFACT_DIR: xyz-data-services/target/
MODULE_DIR: xyz-data-services
第二个会有这些家伙:
MAVEN_ARGS_APPEND: -pl xyz-front-end --also-make
ARTIFACT_DIR: xyz-front-end/target/
MODULE_DIR: xyz-front-end
案例 2:
如果你想将这些模块部署到同一个 pod 中,那么你可以在你的项目中添加一个额外的模块,它将两个战争打包到一个耳朵中,并为这个耳朵定义变量。
所以让这个耳朵成为“webapp”,你的父 pom 会是这样的;
...
<modules>
<module>xyz-common</module>
<module>xyz-data-services</module>
<module>xyz-batch-importer</module>
<module>xyz-frontend</module>
<module>xyz-webapp</module>
</modules>
...
xyz-webapp pom 看起来像;
....
<artifactId>xyz-webapp-</artifactId>
<dependencies>
<dependency>
<groupId>$project.groupId</groupId>
<artifactId>xyz-common</artifactId>
<version>$project.version</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>$project.groupId</groupId>
<artifactId>xyz-data-services</artifactId>
<version>$project.version</version>
<type>war</type>
</dependency>
<dependency>
<groupId>$project.groupId</groupId>
<artifactId>xyz-frontend</artifactId>
<version>$project.version</version>
<type>war</type>
</dependency>
</dependencies>
....
所以你的构建环境变量将是;
MAVEN_ARGS_APPEND: -pl xyz-webapp --also-make
ARTIFACT_DIR: xyz-webapp/target/
MODULE_DIR: xyz-webapp
如果您只想使用单个战争和单个 pod;
案例3:
您可以将前端应用程序打包为war,并声明对其他模块的依赖关系,这些模块都打包为“.jars”
您可以继续处理您想要的情况。重要的是,它取决于您的“微服务”实现。由于“微服务”术语和实现没有明确定义,并且可能因架构或某些业务需求而异,因此您可以决定将前端、api、后端打包在一起还是独立管理。
【讨论】:
以上是关于如何在 OpenShift 上部署多模块 maven spring boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
在 Openshift 上部署战争文件后未找到合适的驱动程序错误