如何在OpenShift上部署多模块maven spring boot应用程序

时间:2016-08-23 14:29:40

标签: maven jenkins spring-boot openshift multi-module

我有一个多模块的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 个答案:

答案 0 :(得分:2)

如果你想在openshift上使用多模块maven项目,那么你必须告诉openshift如何构建它们。您可以通过定义构建环境变量或编写可由Openshift解释的自定义构建脚本来完成此任务。

对于这两种方法,您都可以关注this教程:

如果你想使用第一种方法,你可以通过定义&#34; MAVEN_ARGS_APPEND&#34;来告诉openshift在构建过程时使用额外的maven命令。构建配置的变量。

因此,当构建操作在openshift上启动时,它会告诉Maven使用这些附加参数构建应用程序。

定义下面列出的其他构建环境变量,以独立部署war模块:

MAVEN_ARGS_APPEND:-pl modulename --also-make

ARTIFACT_DIR:modulename / target /

MODULE_DIR:modulename

在这里&#34; -pl&#34;命令提供构建&#34; xyz-data-services&#34;与其所有依赖。所以如果你的&#34; xyz-data-services&#34;模块依赖于&#34; xyz-common&#34;然后maven将构建&#34; xyz-common&#34;,为&#34; xyz-data-services&#34;创建相关的工件。 ,将它们打包在一起并部署&#34; xyz-data-services&#34;作为战争的豆荚。

在您的情况下,假设您要打包&#34; xyz-data-services&#34;模块和&#34; xyz-front-end&#34;模块作为战争并部署它们。

案例1:

如果您想让这些模块可自行部署,那么您必须创建两个将在不同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中,则可以向项目添加一个额外的模块,将两个战争打包成单耳并定义此耳朵的变量。

所以,让这个耳朵成为&#34; webapp&#34;,你的父母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

如果您只想使用单一战争和单一吊舱,那么;

案例3:

您可以将前端应用程序打包为war,并将依赖关系声明为其他模块,这些模块都打包为&#34; .jars&#34;

你可以继续你想要的是哪种情况。它在这里很重要,它取决于你的微服务&#34;实现。因为&#34;微服务&#34;术语和实现没有明确定义,它可能因架构或某些业务需求而有所不同,您决定将前端,api,后端打包在一起或独立管理它们。