Hoje o post está relacionado ao post anterior na qual ensinava como corrigir de maneira manual o problema gerado pelo weblogic 11g ao tentar deployar uma aplicação Grails.
Hoje vou mostrar como automatizar esse processo criando um script que deve ser executado toda vez que a intenção for gerar um war/ear.

Responsabilidades do script:

Gerar o arquivo application.xml.

  • Corrigir o arquivo web.xml gerado dentro do war devido a uma falha no plugin do spring-ws. (Essa falha impedia do war ser deployado com sucesso)
  • Empacotar os arquivos gerados mais o arquivo war em um arquivo ear.
  • Localiza o arquivo ear dentro de DIR_PROJETO/target.

1 – Vamos criar o arquivo ear.sh dentro do diretório raiz de sua aplicação:

echo "Executando o script com o jdk $JAVA_HOME"
cd aplicacao/
grails -Dgrails.env=production ear
echo "Executando o script com o jdk $JAVA_HOME"

2 – Agora crie um arquivo chamado Ear.groovy. Esse arquivo será responsavel por fazer alterações necessárias no arquivo web.xml para que vc tenha sucesso ao deployar o war ou ear no weblogic 11g:

import org.apache.commons.io.FileUtils

includeTargets << grailsScript("_GrailsClean")
includeTargets << grailsScript("_GrailsWar")
includeTargets << grailsScript("_GrailsSettings")
includeTargets << grailsScript("_GrailsEvents")
includeTargets << grailsScript("_GrailsClasspath")
includeTargets << grailsScript("_GrailsArgParsing")

earFile = ""

target(ear: "Creates an EAR file from a Grails WAR") {
 clean()
 appPath = "${System.getProperty('user.dir')}"
 warPath = "${appPath}/target"
 warName = "${grailsAppName}-${metadata.'deploy.version'}.war"
 warFile = "${warPath}/${warName}"

 depends(parseArguments, defineContextRoot)
 def date = new Date().format('yyyyMMdd-HHmm')
 metadata.'deploy.date' = new Date().format('dd/MM/yyyy-HH:mm')

 metadata.persist()
 checkTargetExists()
 war()

 fixWebXml()

 event("StatusUpdate", ["Building EAR file"])
 generateApplicationXml()

 if(argsMap.earDest){
 new File(argsMap.earDest).mkdirs()
 earFile = "${argsMap.earDest}/${contextRoot}-beta-${date}.ear"
 }else{
 earFile = "${projectTargetDir}/${contextRoot}-beta-${date}.ear"
 }

 ant.ear(destfile:earFile, appXml:appXml, update: true, ) {
 fileset(dir:warPath, includes:"*.war")
 fileset(dir:projectTargetDir, includes: "APP-INF/**")

 }
 ant.delete(dir:"${projectTargetDir}/war_temp")
 event("StatusFinal", ["Done creating EAR $earFile"])
}

//Corrige o arquivo web.xml
target(fixWebXml: "Corrige o arquivo web.xml") {

 ant.unzip(src: "${warFile}", dest: "${warPath}/war_temp")

 def xmlFile = FileUtils.toFile(new URL("file://${warPath}/war_temp/WEB-INF/web.xml"))

 def rootWebXml = new XmlParser().parse(xmlFile)

 ant.replace(file:xmlFile, token:"web-services", value:"")
 ant.zip(basedir: "${warPath}/war_temp", destfile: "${warFile}")
 ant.delete(dir: "${warPath}/war_temp")
}

target(defineContextRoot:"defines the context root") { contextRoot = "${grailsAppName}" }

target(generateApplicationXml:"Generates an application.xml file") {
 depends(defineContextRoot)
 def warDest = new File(warName)
 appXml = "${projectTargetDir}/application.xml"
 new File(appXml).write """\

<!--?xml version="1.0" encoding="UTF-8"?-->

${grailsAppName}

 ${warDest.name}
 ${contextRoot}

"""
}<a href="https://geekdeep.wordpress.com/wp-admin/edit.php">Posts</a>

setDefaultTarget(ear)

def checkTargetExists(basedir){
 def f = new File(basedir+'/target')
 f.exists() ?: f.mkdirs()
}

Espero ter ajudado.

@LucasBrum