'Integrate Spring Boot in an EAR project

I have an existing war project created using spring boot. How to package it within an EAR which has an EJB module?

Is there any way to move the model and dao packages to EJB module and injecting it with WAR module?



Solution 1:[1]

You need a parent project that includes a war project, which will be your spring boot project, and an ear project just for making your ear.

Parent will need to have the spring boot as its parent :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.3.RELEASE</version>
  </parent>

  <groupId>com.greg</groupId>
  <artifactId>ear-example</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <properties>
        <myproject.version>1.0-SNAPSHOT</myproject.version>
  </properties>

  <name>ear-example</name>
  <modules>
    <module>example-ear</module>
    <module>example-war</module>
  </modules>

</project>

Your ear project is:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.greg</groupId>
    <artifactId>ear-example</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>example-ear</artifactId>
  <packaging>ear</packaging>

  <dependencies>
    <dependency>
      <groupId>com.greg</groupId>
      <artifactId>example-war</artifactId>
      <version>${project.version}</version>
      <type>war</type>
    </dependency>
  </dependencies>

  <build>
   <plugins>
     <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.10.1</version>
        <configuration>
                <modules>
                        <webModule>
                                <groupId>com.greg</groupId>
                                <artifactId>example-war</artifactId>
                                <contextRoot>/appname</contextRoot>
                        </webModule>
                </modules>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

Solution 2:[2]

I have created a multi module gradle project including a spring RESTFul web services - EAR application name is - bluestone bluestone/settings.gradle -

rootProject.name = 'bluestone'
include ':bluestone-web'
include ':bluestone-core'
include ':bluestone-rest'

project (':bluestone-web').projectDir = new File('bluestone-web')
project (':bluestone-core').projectDir = new File('bluestone-core')
project (':bluestone-rest').projectDir = new File('bluestone-rest')

bluestone-rest project structure is -

enter image description here

bluestone-rest/build.gradle

plugins {
    id 'war'
}

group 'com.bluestone.smart.rest'
version '1.0-SNAPSHOT'



dependencies {
    compile library.spring_context
    compile library.spring_web
    compile library.spring_beans
    compile library.spring_mvc
    providedCompile library.servlet_api
    testCompile library.junit

}

all the dependencies are imported from common libraries.gradle. common libraries.gradle is user ear bluestone/libraries.gradle

/* ============================================================================
   Library definitions for project 'Bluestone'
   ============================================================================
   Define here library dependencies and use them inside sub-modules build.gradle.

   Included from: "${rootProject.projectDir}/build.gradle"
   ============================================================================

 */
ext {

    library = [
            /* testing */
            junit: "junit:junit:4.12",
            log4j: "log4j:log4j:1.2.17",

            /* Spring libraries*/
            spring_context:					"org.springframework:spring-context:${spring_lib_version}",
            spring_aop:						"org.springframework:spring-aop:${spring_lib_version}",
            spring_beans:					"org.springframework:spring-beans:${spring_lib_version}",
            spring_orm:						"org.springframework:spring-orm:${spring_lib_version}",
            spring_web:						"org.springframework:spring-web:${spring_lib_version}",
            spring_mvc:                     "org.springframework:spring-webmvc:${spring_lib_version}",
            servlet_api:                     "javax.servlet:javax.servlet-api:4.0.1"

    ]
}

Within bluestone-rest, i have created three basic file to test a sample rest message -

  1. spring Configuration named - BlueRestConfiguration.java

package com.bluestone.smart.rest.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.bluestone.smart.rest.resources", "com.bluestone.smart.rest.controller"})
public class BlueRestConfiguration {
}
  1. Initialization file - named is - RestInit.java

package com.bluestone.smart.rest.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.ServletContext;

public class RestInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    /**
     * Specify {@code @Configuration} and/or {@code @Component} classes for the
     * {@linkplain #createRootApplicationContext() root application context}.
     *
     * @return the configuration for the root application context, or {@code null}
     * if creation and registration of a root context is not desired
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {BlueRestConfiguration.class};
    }

    /**
     * Specify {@code @Configuration} and/or {@code @Component} classes for the
     * {@linkplain #createServletApplicationContext() Servlet application context}.
     *
     * @return the configuration for the Servlet application context, or
     * {@code null} if all configuration is specified through root config classes.
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    /**
     * Specify the servlet mapping(s) for the {@code DispatcherServlet} &mdash;
     * for example {@code "/"}, {@code "/app"}, etc.
     *
     * @see #registerDispatcherServlet(ServletContext)
     */
    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
}
  1. A rest service API - named - GreetingsController.java

package com.bluestone.smart.rest.resources;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingsController {
    @RequestMapping(path = "/greeting", method = RequestMethod.GET)
    public String greetings(){
        return "Welcome Spring Rest!";
    }
}

finally build this EAR application using -

gradlew clean build 

and deploy on WildFly application and then calling this service using postman - enter image description here

Please let me know if any more details required. I shall push this code on git and will share the git link here.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Pravind Kumar