WebLogic Deployment with Maven: Dynamic Property Settings
Case
You have to deploy a WAR archive on a WebLogic server. To simplify the deployment process, you use weblogic-maven-plugin
. Then, you only have to launch a mvn clean install weblogic:deploy
to compile and deploy the WAR.
Actually, the plugin configuration expects you to hard write the settings in the pom.xml
, such as:
[xml]<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>weblogic-maven-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<name>myWebApplication-web</name>
<adminServerHostName>localhost</adminServerHostName>
<adminServerPort>7001</adminServerPort>
<adminServerProtocol>t3</adminServerProtocol>
<targetNames>myTargetServer</targetNames>
<userId>myUserId</userId>
<password>myPassword</password>
<securitymodel>Advanced</securitymodel>
<artifactPath>${project.build.directory}/myWebApplication-web.war</artifactPath>
</configuration>
</plugin>[/xml]
Yet, when you work on a multi-environment / multi-developper platform, hard writing the properties bothers. Production teams are not pleased, and, above all, it’s not safe.
Unworking fix
At first glance, I tried to use Maven filtering mechanisms. Anyway, this features was designed for compilation phase: properties are recopied from a property file to the actual one, and then included in the archive generated (may it be JAR, EAR or WAR); in a deployment phase, properties are not taken in account.
http://maven.apache.org/guides/getting-started/index.html#How_do_I_filter_resource_files
Unelegant fix
Another solution is to set properties by profile. This works, but is not elegant at all: the password for production environment has to reason to be readable in the pom.xml
used by a developper!
Fix
WebLogic / Maven plugin
Add the following block:
[xml]<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>weblogic-maven-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<name>myWebApplication-web</name>
<adminServerHostName>${weblogic.server.name}</adminServerHostName>
<adminServerPort>${weblogic.server.port}</adminServerPort>
<adminServerProtocol>${weblogic.server.protocol}
</adminServerProtocol>
<targetNames>${weblogic.target}</targetNames>
<userId>${weblogic.user}</userId>
<password>${weblogic.password}</password>
<securitymodel>${weblogic.security}</securitymodel>
<artifactPath>${project.build.directory}/myWebApplication-web.war
</artifactPath>
</configuration>
</plugin>[/xml]
Properties / Maven plugin
Under the tag, add the block:
[xml]<properties>
<weblogic.server.name>${myTargetServer.server.name}</weblogic.server.name>
<weblogic.server.port>${myTargetServer.server.port}</weblogic.server.port>
<weblogic.server.protocol>${myTargetServer.server.protocol}</weblogic.server.protocol>
<weblogic.user>${myTargetServer.user}</weblogic.user>
<weblogic.password>${myTargetServer.password}</weblogic.password>
<weblogic.target>${myTargetServer.target}</weblogic.target>
<weblogic.security>${myTargetServer.security}</weblogic.security>
</properties>[/xml]
Within the block, add the the following block:
[xml]
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>conf/${maven.user}.myTargetServer.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>[/xml]
Settings.xml
Optionnaly, in your settings.xml, in your default profile, set the following property:
[xml]<profile></pre>
<id>myDefaultProfile</id>
<properties>
<maven.user>jonathan_lalou</maven.user>
</properties>
</profile>[/xml]
You can decide to bypass this step. In this case, you will have to add the following parameter on launching Maven:
-Dmaven.user=jonathan_lalou
Property file
Create a property file, with a name corresponding to the one you specified in maven.user property.
[java]
myTargetServer.server.name=localhost
myTargetServer.server.port=7001
myTargetServer.server.protocol=t3
myTargetServer.user=myUserId
myTargetServer.password=myPassword
myTargetServer.target=myTargetServer
myTargetServer.security=Advanced[/java]
Now, you can launch mvn package weblogic:deploy
. The WAR will be deployed on the right server.