Posts Tagged ‘Ant’
Hot Redeploy EJBs on JOnAS
Case
I ogten have to redeploy my JEE application on JOnAS. Basically, I stopped the server, copied the files (EAR, JAR, etc.), then started up again the server. I was fed up with implementing this method.
How to speed up?
Solution
Below is a proposal of solution, without any pretention (I am not fond of JOnAS…), based on an Ant script running under Maven. The code is commented, in a summary: build the EAR (or JAR, WAR, etc.), then copy it to JOnAS deploy folder, undeploy the beans, check which beans are still deployed, deploy the new version of the beans, check which beans are deployed:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <executions> <execution> <id>copyToJonas</id> <phase>install</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <property name="jonas.root" value="${env.JONAS_ROOT}"/> <property name="jonas.base" value="${env.JONAS_BASE}"/> <echo>Copy files</echo> <copy todir="${jonas.base}/deploy" overwrite="true"> <fileset dir="${build.directory}/"> <include name="*.*ar"/> </fileset> </copy> <echo>Undeploy beans</echo> <exec executable="${jonas.root}/bin/jonas.bat"> <arg line="admin -r ${jonas.base}/deploy/${artifactId}-${version}.${packaging}"/> </exec> <echo>Currently deployed beans:</echo> <exec executable="${jonas.root}/bin/jonas.bat"> <arg line="admin -j"/> </exec> <echo>Deploy beans:</echo> <exec executable="${jonas.root}/bin/jonas.bat"> <arg line="admin -a ${jonas.base}/deploy/${artifactId}-${version}.${packaging}"/> </exec> <echo>Currently deployed beans:</echo> <exec executable="${jonas.root}/bin/jonas.bat"> <arg line="admin -j"/> </exec> </target> </configuration> </execution> </executions> </plugin> </plugins> </build>
At first glance I assume I should swap the phases of copying file and undeploying beans. Anyway, this scripts works for me and allows to redeploy after each mvn clean install
😉
Embedded error: Could not create task or type of type: apt.
Case:
In your Maven2’s pom.xml
, you call Java’s APT (Annotation Processing Tool) via maven-antrun-plugin
, to generate additional sources based on annotations in your java code.
<plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>...</id> <phase>process-resources</phase> <configuration> <tasks> <apt srcdir="src/main/java/com/lalou/jonathan/" destdir="classes" debug="on" compile="false" factory="com.lalou.jonathan.Factory preprocessdir="generated-sources/javacc" classpathref="cpannot" /> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin>
You get the following error:
Embedded error: Could not create task or type of type: apt.
Complete stacktrace:
Embedded error: Could not create task or type of type: apt. Ant could not find the task or a class this task relies upon. This is common and has a number of causes; the usual solutions are to read the manual pages then download and install needed JAR files, or fix the build file: - You have misspelt 'apt'. Fix: check your spelling. - The task needs an external JAR file to execute and this is not found at the right place in the classpath. Fix: check the documentation for dependencies. Fix: declare the task. - The task is an Ant optional task and the JAR file and/or libraries implementing the functionality were not found at the time you yourself built your installation of Ant from the Ant sources. Fix: Look in the ANT_HOME/lib for the 'ant-' JAR corresponding to the task and make sure it contains more than merely a META-INF/MANIFEST.MF. If all it contains is the manifest, then rebuild Ant with the needed libraries present in ${ant.home}/lib/optional/ , or alternatively, download a pre-built release version from apache.org - The build file was written for a later version of Ant Fix: upgrade to at least the latest release version of Ant - The task is not an Ant core or optional task and needs to be declared using <taskdef>. - You are attempting to use a task defined using <presetdef> or <macrodef> but have spelt wrong or not defined it at the point of use Remember that for JAR files to be visible to Ant tasks implemented in ANT_HOME/lib, the files must be in the same directory or on the classpath Please neither file bug reports on this problem, nor email the Ant mailing lists, until all of these causes have been explored, as this is not an Ant bug.
Fix:
At least in my case, the error is not related at all to Ant. Therefore, no use searching for any ant-apt.jar and placing in in Ant’s lib folder…
Indeed, the error is known and was fixed with Maven 2.0.10 release. You simply have to upgrade your Maven2 installation, and environment variables (M2_HOME
).
WebLogic deployment automatization with Maven and/or Ant
Case
I had to automatize the deployment of a basic GWT application, packaged as a WAR
archive, on a WebLogic 9.2 server.
Maven 2
Mojo Plugin
Firstly, I tried to use Mojo’s maven plugin for Weblogic. I had to add some lines in my pom.xml, almost identical to those available in Mojo’s documentation.
The main issue I encountered was to retrieve the jars mandatory to the plugin, and install them in my local Maven repository. Since the missing jars names given by Maven are not so obvious, here are the paths to retrieve these jars, all included with WebLogic 9.2 installation:
mvn install:install-file -DgroupId=weblogic -DartifactId=xbean -Dversion=9.2 -Dpackaging=jar -Dfile=%BEA_HOME%\server\lib\wlxbean.jar mvn install:install-file -DgroupId=weblogic -DartifactId=wlw-langx -Dversion=9.2 -Dpackaging=jar -Dfile=%BEA_HOME%\server\lib\wlw-langx.jar mvn install:install-file -DgroupId=weblogic -DartifactId=wlw-util -Dversion=9.2 -Dpackaging=jar -Dfile="%BEA_HOME%\common\lib\wlw-util.jar" mvn install:install-file -DgroupId=weblogic -DartifactId=bcel -Dversion=5.1 -Dpackaging=jar -Dfile="%BEA_HOME%\javelin\lib\bcel-5.1.jar" mvn install:install-file -DgroupId=weblogic -DartifactId=javelinx -Dversion=9.2 -Dpackaging=jar -Dfile="%BEA_HOME%\javelin\lib\javelinx.jar" mvn install:install-file -DgroupId=weblogic -DartifactId=weblogic-container-binding -Dversion=9.2 -Dpackaging=jar -Dfile="%BEA_HOME%\server\lib\schema\weblogic-container-binding.jar"
Issues
Once this issue fixed, I tried to launch the deployment (with mvn weblogic:deploy
). But I encountered the following error:
Response: '404: Not Found' for url: 'http://localhost:7070/bea_wls_deployment_internal/DeploymentService'
Complete stacktrace in debug and verbose mode:
weblogic.deploy.api.internal.utils.DeployerHelperException: The source 'C:\LOCALS~1\Temp\appliGWT-1.0-SNAPSHOT.war' for the application 'iVarGwt' could not be loaded to the server 'http://localhost:7070/bea_wls_deployment_internal/DeploymentService'. Response: '404: Not Found' for url: 'http://localhost:7070/bea_wls_deployment_internal/DeploymentService' at weblogic.deploy.api.internal.utils.JMXDeployerHelper.uploadSource(JMXDeployerHelper.java:658) at weblogic.deploy.api.spi.deploy.internal.ServerConnectionImpl.upload(ServerConnectionImpl.java:653) at weblogic.deploy.api.spi.deploy.internal.BasicOperation.uploadFiles(BasicOperation.java:319) at weblogic.deploy.api.spi.deploy.internal.BasicOperation.execute(BasicOperation.java:411) at weblogic.deploy.api.spi.deploy.internal.BasicOperation.run(BasicOperation.java:169) at weblogic.deploy.api.spi.deploy.WebLogicDeploymentManagerImpl.deploy(WebLogicDeploymentManagerImpl.java:369) at weblogic.deploy.api.tools.deployer.DeployOperation.execute(DeployOperation.java:47) at weblogic.deploy.api.tools.deployer.Deployer.perform(Deployer.java:139) at weblogic.deploy.api.tools.deployer.Deployer.runBody(Deployer.java:88) at weblogic.utils.compiler.Tool.run(Tool.java:158) at weblogic.utils.compiler.Tool.run(Tool.java:115) at weblogic.Deployer.run(Deployer.java:70) at org.codehaus.mojo.weblogic.DeployMojoBase.executeDeployer(DeployMojoBase.java:510) at org.codehaus.mojo.weblogic.DeployMojo.execute(DeployMojo.java:49) at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:451) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:558) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:512) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:482) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:330) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:291) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:142) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:336) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:129) at org.apache.maven.cli.MavenCli.main(MavenCli.java:287) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Deploying another application worked, deploying my application using WebLogic console worked too… After many hours of search, I gave up Maven2 way.
Ant
After retiring from using Mojo’s plugin, I used a way I feared would be less elegant: Ant.
Indeed, Ant script is very short and efficient:
<?xml version="1.0" encoding="UTF-8"?> <project name="redeploy" basedir="." default="deploy"> <property file="redeploy.properties" /> <target name="init-weblogic-task"> <available file="${env.WL_HOME}/server/lib/weblogic.jar" property="weblogic-jar.present" /> <fail unless="weblogic-jar.present">${env.WL_HOME}/server/lib/weblogic.jar does not exist</fail> <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy" classpath="${env.WL_HOME}/server/lib/weblogic.jar" /> </target> <target name="deploy" depends="init-weblogic-task"> <wldeploy action="deploy" source="${source}" name="${name}" user="${user}" password="${password}" verbose="true" adminurl="${adminurl}" debug="true" targets="${targets}" upload="true" securitymodel="${securitymodel}" stage="stage" /> </target> </project>
In the same folder, I created a property file, gathering the properties hinted at in Ant build.xml
.
env.WL_HOME=C:/bea/weblogic_9_2 adminurl=t3://localhost:7070 name=appliGWT user=weblogic password=myPassword targets=myTarget securitymodel=Advanced source=../../../target/appliGWT-1.0-SNAPSHOT.war
I launched Ant and the deployment was successful.
Maven anyway, but with Ant
Yet, since I build with Maven, I do not want to have to build, change folder, and then deploy: I want a unique command line to package and deploy. To perform that, I added a profile in my pom.xml
, using a Maven plugin to call Ant tasks:
<profiles> <profile> <id>deploy</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.2</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <ant antfile="./src/resources/ant/build.xml" target="deploy" inheritall="false" inheritrefs="false"/> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
At last, my target was OK: I can build and deploy with a simple mvn package -Pdeploy