Gradle ear build with dependencies from war file

8.1k views Asked by At

I am trying to build an EAR from a java multi project. There are three different WAR projects and multiple JAR projects in this project. When I build the project all dependencies of JAR are imported into ear-lib and all dependencies of WAR projects are imported into their respective WEB-INF/lib. But all WAR projects uses many common dependencies. With this all of there dependencies the result EAR becomes very big in size(>100 mb). Is there any way to add all of the dependencies into one EAR file and none in the WAR files.

My EAR build.gradle looks like as below..

apply plugin: 'ear'
apply plugin: 'java'


configurations {
    earLib.extendsFrom runtime
    earLib.transitive = true
}

description = 'JavaEE6 Assembly'
dependencies {
  deploy project(path: ':WAR1', configuration: 'archives')
  deploy project(path: ':WAR2', configuration: 'archives')
  deploy project(path: ':WAR3', configuration: 'archives')

  earlib project(':CommonJAR1')
  earlib project(':CommonJAR2') 

  // Writing as below does not work in this case
  // earLib group: 'io.springfox', name: 'springfox-swagger2', version:'2.1.1'
}

ear {
     archiveName='EARNAME.ear'
     libDirName 'lib'
     into("META-INF"){
        from("META-INF") 
     }

}

Following is one of the WAR file build.gradle

apply plugin: 'war'


description = 'WAR2'
dependencies {
  compile project(':CommonJAR1')
    compile group: 'commons-beanutils', name: 'commons-beanutils', version:'1.9.2'
    compile group: 'org.springframework', name: 'spring-jdbc', version:'4.0.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-core', version:'4.0.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-beans', version:'4.0.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-webmvc', version:'4.0.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-oxm', version:'4.0.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-orm', version:'4.0.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-context-support', version:'4.0.5.RELEASE'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:'2.2.3'
    compile group: 'org.json', name: 'json', version:'20090211'
    compile(group: 'org.springframework', name: 'spring-context', version:'4.0.5.RELEASE') {
exclude(module: 'commons-logging')
    }
    compile group: 'org.aspectj', name: 'aspectjrt', version:'1.7.4'
    compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.5'
    compile(group: 'log4j', name: 'log4j', version:'1.2.15') {
exclude(module: 'mail')
exclude(module: 'jms')
exclude(module: 'jmxtools')
exclude(module: 'jmxri')
    }
    compile group: 'javax.inject', name: 'javax.inject', version:'1'
    compile group: 'javax.servlet', name: 'jstl', version:'1.2'
    runtime group: 'io.springfox', name: 'springfox-swagger2', version:'2.1.1'
    runtime group: 'org.springframework', name: 'spring-web', version:'4.0.5.RELEASE'
    runtime group: 'org.slf4j', name: 'jcl-over-slf4j', version:'1.7.5'
    runtime group: 'org.slf4j', name: 'slf4j-log4j12', version:'1.7.5'
    providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5'
    providedCompile group: 'javax.servlet.jsp', name: 'jsp-api', version:'2.1'
}

I have tried any sources those I could find for doing the same, But none worked. Please suggest. The project is to be deployed on WAS 8.5

1

There are 1 answers

2
Ankur Kumawat On BEST ANSWER

I had found this solution earlier, but was short on time so answering it now.

The build.gradle for ear should be as follows

apply plugin: 'ear'
apply plugin: 'java'


description = 'JavaEE6 Assembly'
dependencies {
  deploy project(path: ':WAR1', configuration: 'archives')
  deploy project(path: ':WAR2', configuration: 'archives')
  deploy project(path: ':WAR3', configuration: 'archives')

  earlib project(':CommonJAR')



}

def deployedModules = [ 'WAR1', 'WAR2', 'WAR3' ]

deployedModules.forEach {
    def projectPath = ":${it}"

    evaluationDependsOn(projectPath)

    findProject(projectPath).configurations.providedCompile.allDependencies.forEach {
        boolean isEarModule = it instanceof ProjectDependency &&
                (it as ProjectDependency).dependencyProject.name in deployedModules
        if (!isEarModule) {
            dependencies.add('earlib', it)
        }
    }
}

ear {
     archiveName='EARNAME.ear'
     libDirName 'lib'
     into("META-INF"){
        from("META-INF") 
     }
}

The build.gradle for the war files should be as follows

apply plugin: 'war'
apply plugin: 'java'

description = 'WAR1'
dependencies {
  providedCompile project(':CommonJAR')
    providedCompile group: 'commons-beanutils', name: 'commons-beanutils', version:'1.9.2'
    providedCompile group: 'org.springframework', name: 'spring-jdbc', version:'4.0.5.RELEASE'
    providedCompile group: 'org.springframework', name: 'spring-core', version:'4.0.5.RELEASE'
    providedCompile group: 'org.springframework', name: 'spring-beans', version:'4.0.5.RELEASE'
    providedCompile group: 'org.springframework', name: 'spring-webmvc', version:'4.0.5.RELEASE'
    providedCompile group: 'org.springframework', name: 'spring-oxm', version:'4.0.5.RELEASE'
    providedCompile group: 'org.springframework', name: 'spring-orm', version:'4.0.5.RELEASE'
    providedCompile group: 'org.springframework', name: 'spring-context-support', version:'4.0.5.RELEASE'
    providedCompile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:'2.2.3'
    providedCompile group: 'org.json', name: 'json', version:'20090211'
    providedCompile(group: 'org.springframework', name: 'spring-context', version:'4.0.5.RELEASE') {
exclude(module: 'commons-logging')
    }
    providedCompile group: 'commons-logging', name: 'commons-logging', version: '1.2'
    providedCompile group: 'org.aspectj', name: 'aspectjrt', version:'1.7.4'
    providedCompile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.5'
    compile(group: 'log4j', name: 'log4j', version:'1.2.15') {
exclude(module: 'jms')
exclude(module: 'jmxtools')
exclude(module: 'jmxri')
    }
    providedCompile group: 'javax.inject', name: 'javax.inject', version:'1'
    providedCompile group: 'javax.servlet', name: 'jstl', version:'1.2'
    providedCompile group: 'io.springfox', name: 'springfox-swagger2', version:'2.1.1'
    providedCompile group: 'org.springframework', name: 'spring-web', version:'4.0.5.RELEASE'
    providedCompile group: 'org.slf4j', name: 'jcl-over-slf4j', version:'1.7.5'
    providedCompile group: 'org.slf4j', name: 'slf4j-log4j12', version:'1.7.5'
    providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5'
    providedCompile group: 'javax.servlet.jsp', name: 'jsp-api', version:'2.1'
    providedCompile group: 'org.apache.axis', name: 'axis', version:'1.4'
}


war{
  manifest {
      attributes(
         "Manifest-Version": "1.0",
         "Class-Path": configurations.providedCompile.collect {" lib/" + it.getName() }.join(' ')
      )
   }

}