Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Deploying Spring Boot 2.x Applications in WebLogic 12.1.3.1 Using Gradle Build

DZone 's Guide to

Deploying Spring Boot 2.x Applications in WebLogic 12.1.3.1 Using Gradle Build

Learn more about deploying Spring 2.x applications.

· Java Zone ·
Free Resource

Deploying Spring Boot 2.x applications in WebLogic Versions 12.2.x is simpler than deploying those in WebLogic 12.1.x using Gradle build. I was struggling with the deployment of 2.x applications in 12.1.x version of WebLogic. There is no issue if you use Maven to build. But, using the Gradle build is complicated. But, finally, after some research got the solution and deployed successfully. Today, I will demonstrate how to deploy 2.x applications in 12.1.x version of WebLogic. Let's start. For my project, I'm using below tech stack:

a. Gradle 4.5+
b. Spring Boot 2.1.1.RELEASE
c. Java 8
d. WebLogic 12.1.3.1
e. javax.servlet 4.0.1 (Excliptly defining because of older WebLogic)

1. Create a Project From Spring Initializer

Once you download your project, you will see below contents in build.gradle. I've already added the configurations to deploy on WebLogic Servers.

buildscript {

    ext {
        springBootVersion = '2.1.1.RELEASE'
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("javax.servlet:javax.servlet-api:4.0.1")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'war'

group = 'com.app'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

configurations {
    providedRuntime
    compile.exclude module: 'spring-boot-starter-tomcat'
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-actuator')
    implementation('org.springframework.boot:spring-boot-starter-web')

    providedCompile('javax.servlet:javax.servlet-api:4.0.1')

    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}


There is some more configuration that needs to be done. I'm not going one by one here. Please check my earlier post on this. Let's deploy now. You will see below error:

Output Message From WebLogic Console:

AppMerge failed to merge your application. If you are running AppMerge on the command-line, merge again with the -verbose option for more details.


Output Message From WebLogic Console:

Unable to access the selected application. Error java.io.IOException Error weblogic.utils.compiler.ToolFailureException


For this, there was a bug (which was not a bug) post reported in Spring Boot Github Repo and following was the reply from one of the well known Spring Boot Developer, Andy Wilkinson.

"Spring Boot 2.0 requires Java 8. It would appear that your WebLogic Server, specifically the repackaged version of ASM that it is using, doesn’t support Java 8. If you are not in a position to upgrade WebLogic you’ll have to stick with Spring Boot 1.5."

So, I tried applying ASM patch from 12.2.x version. But, still it didn't worked. Then, I came to know that it is because of the incompatible log version which is by default added in Spring Boot:

spring-boot-starter-logging


2. Exclude spring-boot-starter-logging From Gradle:

...
...
...
configurations {
    providedRuntime
    compile.exclude module: 'spring-boot-starter-tomcat'
    all*.exclude module: 'spring-boot-starter-logging'
}
...
...
...


But still, deployment failed.

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
<Dec 15, 2018 1:22:37 PM CST> <Error> <org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter> <BEA-000000> <
***************************
APPLICATION FAILED TO START
***************************
...
...
...
Action:
Correct the classpath of your application so that it contains a single, compatible version of javax.validation.Configuration
<Dec 15, 2018 1:22:38 PM CST> <Error> <Deployer> <BEA-149265> <Failure occurred in the execution of deployment request with ID "101354633372978" for task "0". Error is: "weblogic.application.ModuleException: java.lang.NoSuchMethodException
javax.validation.Configuration.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;"
weblogic.application.ModuleException: java.lang.NoSuchMethodError: javax.validation.Configuration.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;
        at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
        at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
        at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:216)
        at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:211)
        at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)
        Truncated. see log file for complete stacktrace
Caused By: java.lang.NoSuchMethodError: javax.validation.Configuration.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;
        at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.configureParameterNameProvider(LocalValidatorFactoryBean.java:314)
        at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:290)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1804)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576)
        Truncated. see log file for complete stacktrace


3. Add javax.validation:validation-api:2.0.1.Final Dependency:

dependencies {
    ...
    providedCompile('javax.servlet:javax.servlet-api:4.0.1')
    compile('javax.validation:validation-api:2.0.1.Final')
    ...
}

Still, deployment failed with below errors:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
<Dec 15, 2018 1:36:41 PM CST> <Error> <org.springframework.boot.SpringApplication> <BEA-000000> <Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultValidator' defined in class path resource [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean]: Factory method 'defaultValidator' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/el/ELManager
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
        Truncated. see log file for complete stacktrace

Caused By: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean]: Factory method 'defaultValidator' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/el/ELManager
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
        Truncated. see log file for complete stacktrace
Caused By: java.lang.NoClassDefFoundError: javax/el/ELManager
        at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:88)
        at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:47)
        at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolator(ConfigurationImpl.java:474)
        at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:54)
        at org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration.defaultValidator(ValidationAutoConfiguration.java:57)
        Truncated. see log file for complete stacktrace


4. Add javax.el:javax.el-api:3.0.0 Dependency:

dependencies {
    ...
    compile('javax.el:javax.el-api:3.0.0')
    ...
}


But still, it got failed with below errors:

Caused by: java.lang.IllegalAccessError: javax/el/ELUtil
        at javax.el.ELManager.getExpressionFactory(ELManager.java:61)
        at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:88)
        at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:47)
        at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolator(ConfigurationImpl.java:474)
        at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:54)
        at org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration.defaultValidator(ValidationAutoConfiguration.java:57)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
        ...


5. Add Compatible hibernate-validator Dependency:

After some research, I came to know that this error was because of the incompatible issue of hibernate-validator. Add below dependency in build.gradle and try deploying. This time, the application will deploy successfully.

dependencies {
    ...
    ...
    compile('org.hibernate:hibernate-validator:5.4.1.Final')
    ...
    ...
}

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

Dec 15, 2018 1:43:56 PM org.springframework.boot.StartupInfoLogger logStarting
INFO: Starting ServletInitializer on *** with PID 15804 (C:\Users\***\Documents\Oracle\user_projects\domains\***\servers\AdminServer\tmp\_WL_user\spring-boot-2x-demo-0.0.1-SNAPSHOT\emnq38\war\WEB-

.jar started by *** in C:\Users\***\Documents\Oracle\user_projects\domains\***)

Dec 15, 2018 1:43:56 PM org.springframework.boot.SpringApplication logStartupProfileInfo
INFO: No active profile set, falling back to default profiles: default
Dec 15, 2018 1:44:00 PM org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext prepareWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 3152 ms
Dec 15, 2018 1:44:02 PM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize
INFO: Initializing ExecutorService 'applicationTaskExecutor'
Dec 15, 2018 1:44:03 PM org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver <init>
INFO: Exposing 2 endpoint(s) beneath base path '/actuator'
Dec 15, 2018 1:44:03 PM org.springframework.boot.StartupInfoLogger logStarted
INFO: Started ServletInitializer in 7.442 seconds (JVM running for 1452.507)
Dec 15, 2018 1:44:34 PM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Initializing Servlet 'dispatcherServlet'
Dec 15, 2018 1:44:34 PM org.springframework.web.servlet.FrameworkServlet initServletBean

INFO: Completed initialization in 24 ms

<Dec 15, 2018 1:44:41 PM CST> <Warning> <Socket> <BEA-000449> <Closing the socket, as no data read from it on 0:0:0:0:0:0:0:1:57,128 during the configured idle timeout of 5 seconds.>


This time, the application deployed successfully. To test this deployment, I've added spring-boot-starter-actuator library. Go ahead and access the below URL. I'm running my domain in port 7103.

You should see below output:

{
    "_links": {
        "self": {
            "href": "http://localhost:7103/app/api/actuator",
            "templated": false
        },
        "health": {
            "href": "http://localhost:7103/app/api/actuator/health",
            "templated": false
        },
        "health-component": {
            "href": "http://localhost:7103/app/api/actuator/health/{component}",
            "templated": true
        },
        "health-component-instance": {
            "href": "http://localhost:7103/app/api/actuator/health/{component}/{instance}",
            "templated": true
        },
        "info": {
            "href": "http://localhost:7103/app/api/actuator/info",
            "templated": false
        }
    }
}


Final build.gradle contents:

buildscript {
    ext {
        springBootVersion = '2.1.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("javax.servlet:javax.servlet-api:4.0.1")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'war'

group = 'com.app'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

configurations {
    providedRuntime
    compile.exclude module: 'spring-boot-starter-tomcat'
    all*.exclude module: 'spring-boot-starter-logging'
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-actuator')
    implementation('org.springframework.boot:spring-boot-starter-web')

    providedCompile('javax.servlet:javax.servlet-api:4.0.1')

    compile('javax.validation:validation-api:2.0.1.Final')
    compile('javax.el:javax.el-api:3.0.0')
    compile('org.hibernate:hibernate-validator:5.4.1.Final')

    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}


NOTE: Don't forget to add the weblogic.xmlfile. Check out the contents of weblogic.xml. You can find the full project from my GitHub Repo. If you encounter any issues, please comment. I will try to help you. Happy Coding!

Topics:
java 8 ,web developement ,spring boot 2.0 ,gradle 4.10.2 ,weblogic 12c ,java ,spring boot ,gradle ,tutorial

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}