How to deploy multi-module maven spring boot application on OpenShift

Deadly 提交于 2019-12-10 10:34:29

问题


I have a multi-module spring-boot project that I want to deploy on Openshift, where I have installed Jenkins as well. Source code is hosted in Github. Each module consists in a war, in order to have a microservices structure:

    <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>

I found tutorial to deploy single spring-boot application, but I cannot figure out how this applies to a multi-module maven project.


回答1:


If you want to work with multi-module maven project on openshift, then you have to tell openshift how to build them. You can achieve this task by defining build environment variables or writing custom build scripts which can be interpreted by Openshift.

For both method you can follow this tutorial:

If you want to work with first method, you can tell openshift to use additional maven commands while building process by defining "MAVEN_ARGS_APPEND" variable for build config.

So when the build operation starts on openshift, it will tell Maven that build the application with these additional parameters.

Define additional build environment variables that listed below to deploy war modules independently:

MAVEN_ARGS_APPEND: -pl modulename --also-make

ARTIFACT_DIR: modulename/target/

MODULE_DIR: modulename

In here "-pl" command provides to build "xyz-data-services" with its all dependencies. So if your "xyz-data-services" module has dependency to "xyz-common", then maven will build "xyz-common", create related artifacts for "xyz-data-services" ,package them together and deploy "xyz-data-services" as war on the pod.

In your case, suppose that you want to package "xyz-data-services" module and "xyz-front-end" module as war and deploy them.

Case 1:

If you want to make these modules self deployable, then you have to create two applications which will run on different pods.

First application will have these build environment variables:

MAVEN_ARGS_APPEND:  -pl xyz-data-services --also-make
ARTIFACT_DIR:       xyz-data-services/target/
MODULE_DIR:         xyz-data-services

And the second one will have these guys:

MAVEN_ARGS_APPEND:  -pl xyz-front-end --also-make
ARTIFACT_DIR:       xyz-front-end/target/
MODULE_DIR:         xyz-front-end

Case 2:

If you want to deploy these modules into same pod, then you can add an additional module to your project which packages both wars into single ear and define the variables for this ear.

So let this ear be "webapp", your parent pom will look like;

...
<modules>
     <module>xyz-common</module>
     <module>xyz-data-services</module>  
     <module>xyz-batch-importer</module> 
     <module>xyz-frontend</module>
     <module>xyz-webapp</module>
</modules>
...

and the xyz-webapp pom will look like;

....
<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>
.... 

So your build environment variables will be;

MAVEN_ARGS_APPEND:  -pl xyz-webapp --also-make

ARTIFACT_DIR:   xyz-webapp/target/

MODULE_DIR:    xyz-webapp

If you want to work with just single war and single pod then;

Case 3:

You can just package front-end application as war and declare dependencies to other modules which all packaged as ".jars"

You can go on with which case do you want. It's important here that it depends on your "microservices" implementation. Because the "microservice" term and the implementation is not explicitly defined and it can vary on the architecture or some business requirements, it's your decision that packaging front-end,api,backend together or manage them independently.



来源:https://stackoverflow.com/questions/39104003/how-to-deploy-multi-module-maven-spring-boot-application-on-openshift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!