Some time ago I already explained how you could use Maven and the jboss-plugin to deploy your war or ear to your JBoss server. Now this works fine as long as your JBoss is a local installation running on the same machine as the one that is running Maven.
Of course there is a big chance that this is not the case in your development environment. In that case you can do the following in Maven to deploy your ear to the JBoss instance:
- Transfer the war or ear file to the remote machine
- Run a script on the remote machine
Actually it isn’t doing anything JBoss specific, so you could use it for other application servers too (like Tomcat, at least when they are using hot deployment).
To perform step 1 you have to add the following plugin in your ‘pom.xml’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>wagon-maven-plugin</artifactId> <version>1.0-beta-1</version> <executions> <execution> <id>upload-artifact</id> <phase>deploy</phase> <goals> <goal>upload</goal> </goals> <configuration> <serverId>${project.deploy.serverId}</serverId> <fromDir>target</fromDir> <includes>*.war</includes> <url>${project.deploy.url}</url> <toDir>${project.deploy.toDir}</toDir> </configuration> </execution> </executions> </plugin> ... </plugin> </build> |
And this plugin needs the ‘distributionManagement’ section to be filled like this:
1 2 3 4 5 6 7 8 9 10 | <distributionManagement> <repository> <id>m2-internal-repo</id> <url>http://local.redstream.nl:8888/artifactory/libs-releases-local/</url> </repository> <snapshotRepository> <id>m2-internal-repo</id> <url>http://local.redstream.nl:8888/artifactory/libs-snapshots-local</url> </snapshotRepository> </distributionManagement> |
The second step is a bit more complicated. I want to execute a script on the remote server using SSH. This can rather easily be done by using an Ant target, so to get this working in Maven we have to use the plugin to run an Ant target. It will ook like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> <dependencies> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant-jsch</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.41</version> </dependency> </dependencies> <executions> <execution> <id>deploy-artifact</id> <phase>deploy</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <sshexec host="${project.deploy.host}" username="${projecte.deploy.username}" password="${project.deploy.password}" trust="true" command="bin/deploy_web.sh"/> </tasks> </configuration> </execution> </executions> </plugin> |
Thta’s it. These two plugins together do the job. For completeness I show the used properties that I have setup in my ‘settings.xml’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <profiles> <profile> <id>develop</id> <properties> <project.deploy.serverId>mule-server</mule.deploy.serverId> <project.deploy.url>scp://mule-server</mule.deploy.url> <project.deploy.toDir>/home/pascal</mule.deploy.toDir> <project.deploy.host>mule-server</mule.deploy.host> <project.deploy.username>pascal</mule.deploy.username> <project.deploy.password>pascal</mule.deploy.password> </properties> </profile> ... </profiles> |
And the script that is executed at the remote server ‘deploy_web.sh’:
[code]
#
# Deploy Mule applications
#
#
source /etc/profile
echo "Start deploying"
for archive in ~/deploy/*.war; do
echo "Copying to tomcat: web-archive \"$archive\""
cp $archive /$TOMCAT_HOME/webapps/
done
echo "Deploying finished"
echo "Clean up ~/deploy directory"
rm -rf ~/deploy/*.war
[/code]
If all this is in place you can deploy the ear/war file by using the command:
mvn clean deploy
Like I said before there is nothing JBoss specific to this and actually I am using the script to deploy my Mule applications to our Tomcat server.
fantastic, I was literally looking for this today, your solution worked great, I could not for the life of me, get cargo’s jboss plugin to deploy remotely, wagon was the trick.
fantastic, I was literally looking for this today, your solution worked great, I could not for the life of me, get cargo’s jboss plugin to deploy remotely, wagon was the trick.
When I use your setup, I can get maven to run with no errors, but I do not see any file on the remote server.
I can see maven executing my script, but the file does nothing, because the file are not there.
[INFO] [antrun:run]
[INFO] Executing tasks
[sshexec] Connecting to cssw-sals01:22
[sshexec] cmd : bin/deploy_web.sh
Start deploying
Copying to jboss: web-archive “/css/eServ/temp/*.jar”
bin/deploy_web.sh: total
Deploying finished
My jar files are in my maven repository.
What is wrong?
@Dea
No error msg’s? Could you share your “deploy_web.sh” and your “maven-antrun-plugin” configuration?
I noticed you’re copying jar-files iso war-files?
when i am using wagon-maven-plugin to transfer war file to my server pc,it is asking for password.
plz tell me how to configure password for SCP transfer.
@newbea
Ah, I realize I forgot to mention that one:
In my settings.xml I have configured some servers like this:
[xml]
mule-server
pascal
pascal
…
[/xml]
So you should do that for your server pc also.
Hope that helps
the deploy_web.sh file is the same as above, but I am copying *.jar instead of *.war
echo “Start deploying”
for archive in /css/eServices/temp/*.jar; do
echo “Copying to JBoss: web-archive ”$archive”\"
cp $archive /css/eServices/temp/
done
echo “Deploying finished”
echo “Clean up ~/deploy directory”
My AntRun-plugin configuration:
org.apache.maven.plugins
maven-antrun-plugin
1.3
org.apache.ant
ant-jsch
1.7.1
com.jcraft
jsch
0.1.41
deploy-artifact
deploy
run
My setup seems correct to what is listed in the article, the only thing missing is that the files from the target directory are not getting downloaded to to the remote servers.
Is Wagon only for war file?
@Dea, can you show the wagon plugin config and the distributionManagement section? Also note that I commented at 23 December you also have to define the servers in your settings.xml with the username/password if applicable for your situation.
And to show xml content in the comment you have to enclose it in [ xml] and [ / xml] (without the spaces).
For my first walk thru of the project. I just hardcoded all the properties into the pom.xml file.
But here is my DM section and the wagon plugin.
org.codehaus.mojo
wagon-maven-plugin
1.0-beta-1
upload-artifact
deploy
upload
crm-dals02
target
*.jar
scp://crm-dals02.comp.wepco.com
/css/eServices/temp
org.apache.maven.plugins
maven-antrun-plugin
1.3
org.apache.ant
ant-jsch
1.7.1
com.jcraft
jsch
0.1.41
deploy-artifact
deploy
run
I took a step back and tried to get mvn to a local deployment.
m2-internal-repo
NameSomething
file:///home/csstech/.m2/deploy/repository/
<!– scp://crm-dals02.comp.wepco.com/css/eServices/temp
–>
Here it go again:
org.codehaus.mojo wagon-maven-plugin
1.0-beta-1</version
upload-artifact
deploy
upload
crm-dals02
target
*.jar
scp://crm-dals02.comp.wepco.com
/css/eServices/temp
m2-internal-repo
NameSomething
file:///home/csstech/.m2/deploy/repository/
<!-- scp://crm-dals02.comp.wepco.com/css/eServices/temp
-->
I have to apologize, I can not get the XML tags to display in the posting.
I am using the
[ xml ][ / xml]
Can I get help please on posting?
Thank you for your patience!
Hi Dea,
I apologize for the xml syntax not working properly in the plugin I use. Can you send your pom.xml to ‘pascal.alma at redstream.nl’ so I can give it a quick look to see if I can find something.
<distributionManagement>
<repository>
<id>m2-internal-repo</id>
<name>NameSomething</name>
<url>file:///home/csstech/.m2/deploy/repository/</url>
</repository>
</distributionManagement>
Thanks Pascal,
I sent you the snippets of my plugin and DM from the pom.xml
He must got frustrated and stop posting! We never got it to work. So he started to block my email.