Eclipse Juno(j2ee)开发环境下JBoss热部署的实现方式(暴露式部署,WTP)

如果对部署方式有疑问,请先看这个帖子:
JBoss和Tomcat部署方式的区别(解释暴露式部署)

我们说一下Eclipse J2ee版本(下个WTP插件也行)自带的run on server功能,支持好多webserver,但是jboss只支持到5了,原因你懂的。接下来我们就看一下如何使用。

1. Window-preferences-Server-Runtime Environment-Add-Jboss-选择ApplicationServer的Home即可添加一个Server。
2.新创建一个Dynamic Web Project,注意Dynamic web module version选2.5(5.10应该支持不了3.0)。
3.在WebContent下面写个index.html,然后在工程右键,run as-run on server,选择你刚才创建的JBoss,finish。然后就可以访问了。

接下来是贴题的内容了:
Eclipse的这个功能实际上是把项目打成war放到了JBoss的deploy目录下面,当我们在eclipse里面修改文件的时候,如果仔细观察console的话,会发现有类似以下的内容会闪着出现:
Buildfile: C:\eclipse\plugins\org.eclipse.jst.server.generic.jboss_1.6.1.v200904151730\buildfiles\jboss323.xml


这个目录可能和WTP或者eclipse版本有关,具体请自查。我们来看一下jboss323.xml,发现实际上是个ant脚本。以下内容
<target name="deploy.j2ee.web">
		<jar compress="false" destfile="${project.working.dir}/${module.name}.war"> 
			<zipfileset dir="${module.dir}">
	        	<include name="**/*.*"/>
				<exclude name="**/*.war"/>
			</zipfileset>
		</jar>
  		<move file="${project.working.dir}/${module.name}.war" todir="${server.publish.dir}"/>
		<sleep seconds="${pause.deploy}"/>
	</target>


描述了web项目发布时候的动作,先把整个项目打成war包,然后把他复制到了JBoss server的publish路径,这个路径我看了下应该是%JBOSS_HOME%\server\default\deploy。

现在的问题是, 每次修改完,他都要重新去做jar操作来打包,当项目比较大的时候这个操作是很耗时的,所以我们现在使用暴露式部署的方式进行部署,因为修改的文件少的时候,ant会检查文件的修改时间,没修改的文件是不会复制的
1. 把上面那段xml修改为
<target name="deploy.j2ee.web">
		<property name="deploy.dir" location="${server.publish.dir}/${module.name}.war" />
        <mkdir dir="${deploy.dir}" />
        <copy todir="${deploy.dir}">
            <fileset dir="${module.dir}">
                <include name="**/*.*"/>
                <exclude name="**/*.war"/>
                <exclude name="**/web.xml"/>
            </fileset>
        </copy>
		<copy todir="${deploy.dir}" overwrite="true">
            <fileset dir="${module.dir}">
                <include name="**/web.xml"/>
            </fileset>
        </copy>
		<sleep seconds="${pause.deploy}"/>
	</target>

2.找到undeploy.j2ee.web这个target,这个是如果undeploy进行的动作,修改为:
<target name="undeploy.j2ee.web">
		<!--<delete file="${server.publish.dir}/${module.name}.war" failonerror="false"> </delete>-->
		<delete dir="${server.publish.dir}/${module.name}.war" failonerror="false"> </delete>
		<sleep seconds="${pause.undeploy}"/>
	</target>



解释:
  • deploy.j2ee.web这个target修改为先根据项目名称在jboss的deploy里面创建一个 项目名称.war的目录,然后把eclipse工程下的所有文件,除了war和web.xml,都拷贝到那个新创建的目录下。
  • 接下来,单独拷贝web.xml。单独拷贝的原因在于,我试了一下修改一个servlet类,发现已经同步过去了,但是JBoss并没有去重新部署他,但是修改一个静态html或者jsp都会即时生效,找了好半天资料,在链接发现,如果以暴露式部署的话,必须要修改web.xml,JBoss才认为需要重新部署,所以单独复制了一下web.xml用来修改他的修改时间,这样JBoss就会重新部署了。
  • undeploy.j2ee.web就是为了把deploy里面创建的那个目录删掉。


其实这样还是稍微有一点问题,毕竟还多了一个复制操作。先把公司项目跑起来看看效率行不行吧,如果不行的话,就要修改JBoss添加自定义的load路径了,去掉这个复制操作。

参考资料: http://www.blogjava.net/brian/articles/315942.html这个没有处理web.xml

猜你喜欢

转载自wwwcomy.iteye.com/blog/2106275