用Maven打包成EAR远程部署JBoss(一)——打包及手动部署到本地

        这两天分到了一个任务,需要弄一下怎样用Maven将我们现在的项目打成一个EAR包,然后部署到远程JBoss中,这样我们每次部署的时候就会方便很多,话不多说,先看下我们项目的一个大致包结构,包前面的数字表示部署之后的加载顺序。

        用Maven打包成EAR远程部署JBoss(一)——打包及手动部署到本地_第1张图片

        1:实体;2,3:数据库操作封装的EJB接口和实现;4,5:业务逻辑层EJB的接口和实现;7web层

        首先我们要做的是将这些打成一个ear包,推荐网址:官网。

        我先是创建了一个空的Maven Project,然后写入以下代码。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.tgb</groupId>
	<artifactId>gxpt_b_ear</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>ear</packaging>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-ear-plugin</artifactId>
				<version>2.9</version>
			</plugin>
		</plugins>
	</build>
</project>

        如果你的pom文件报错,那么安装一下 m2e-wtp这个插件就可以了哦~~~

        这样,一个最简单的ear插件就配置好了。

        现在,我们将需要打包的jar以及war都写到里面来,如:

       

[...]
<dependencies>
	<dependency>
		<groupId>com.tgb</groupId>
		<artifactId>gxpt_entity_qx</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<type>jar</type>
	</dependency>
	<dependency>
		<groupId>com.tgb</groupId>
		<artifactId>gxpt_web_qx_module</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<type>war</type>
	</dependency>
</dependencies>
[...]

       然后运行mvn ear: generate-application-xml,此命令是用来生成ear中的部署描述符的。

       成功后运行mvn ear:ear,不得不说一下ear:ear所处的生命周期,它其实位于的生命周期是package。也就是install之前。成功后,从target中打开打包好的ear,我们发现除了要打包的几个包外,这几个包的依赖包也全在这里面。而ear这个插件为我们提供了一种配置:Creating Skinny WARs,那么我们现在就加入以下代码:

<plugin>
	<artifactId>maven-ear-plugin</artifactId>
	<version>2.9</version>
	<configuration>
		<packagingIncludes>META-INF/**,**/gxpt_*.jar,**/gxpt_*.war</packagingIncludes>
	</configuration>
</plugin>

       注:上面这句话是说要将META-INF下(有application.xml等)及所有的gxpt开头的jar、war都打包进来。

       现在再来看,这样生成的ear包如下,现在就只剩下我们需要部署的jarwar

       用Maven打包成EAR远程部署JBoss(一)——打包及手动部署到本地_第2张图片

       现在就可以部署了么?如果真的是这样,那么这篇文章也就没有必要了。我们现在将其丢进去,发现会报空指针问题,原因就是JBoss在加载jar的时候,是按照字母顺序进行加载的,这样就导致了接口的实现在接口之前加载,这样肯定会有问题啊。

       那么如何来控制顺序呢?

       这里不得不提一下给出我答案的博客。只是这位仁兄对自己写的代码关键部分没有文字的说明,导致我刚开始认为他这是一个不好的文章……JBoss中的ear包中类加载顺序控制。现在你可以直接看我的文章的。

       需要做的其实并不多,只是在pom中对JBoss进行配置,还得将那些jar加载顺序写到application.xml文件(用ear:generate-application-xml生成的)里面。在这里不进行全部列出,只列出部分及结果图。

       配置文件:

<plugin>
	<artifactId>maven-ear-plugin</artifactId>
	<version>2.9</version>
	<configuration>
		<packagingIncludes>META-INF/**,**/gxpt_*.jar,**/gxpt_*.war</packagingIncludes>
		<jboss>
		<version>5</version>
		<module-order>strict</module-order>
	</jboss>
	<modules>
		<jarModule>
			<groupId>com.tgb</groupId>
			<artifactId>gxpt_entity_qx</artifactId>
			<includeInApplicationXml>true</includeInApplicationXml>
		</jarModule>
		[...]
	</modules>
	</configuration>
</plugin>

       结果,生成了jboss-app.xml文件而且现在在application中也有了jar的配置信息:

                            用Maven打包成EAR远程部署JBoss(一)——打包及手动部署到本地_第3张图片      

                            用Maven打包成EAR远程部署JBoss(一)——打包及手动部署到本地_第4张图片


       这里,需要注意的是includeInApplicationXml这个标签的设置,刚开始就是没有注意到这个标签的作用,所以一直生成不了自己想要的application.xml文件。还有就是对jboss的配置的那句,就是说加载的时候要按照application中说明的先后顺序进行加载。

       现在,万事俱备,只欠往JBoss中丢这个生成好的ear了。

       悲催的事又来了,一起报一个叫java.lang.IllegalStateException:Null beannMetaData的异常,在JBoss的社区找到一篇文章,说这个错误在6.0.0.M1中修复了(我们用的是5.1.0.GA),这不是开玩笑么,看来免费的就是会有这样那样的问题啊。再往后看,说需要将jar放到lib中,这个在前面提到的Create Skinny WARs中的那个页面就存在,只是我比较懒,将那句省去了,到这又不得不加上,就是那句defaultJavaBundleDir的配置。

       是不是说我加上了就没事了呢?答案当然是否定的了。

       没有了之前的那个错误,又来了java.lang.IllegalStateException:Context already exists这个异常,更是让人摸不着头脑。最后在JBoss社区也没有找到有用的解决方法,但是找到了思路。有一个人说将persistent.xml放到它自己的jar文件中就没有问题了(PS:真心看不懂这个人在说什么)。

       但有思路了有木有,就是实体造成的(我也是试了半天…),我将实体从ear中删除(记得删application.xml中的配置哦),然后先将实体部署,然后再部署打包成功的ear,结果,你懂的,成功了~~

       既然成功了,就没有再往下研究了,我想这也是目前为止最折中的方法了,在时间与效果上都是一个比较乐观的结果。够用就好~~~

       最后,贴一下我这个项目的完整pom。由于这篇已经足够长了,部署到远程JBoss的事就下篇再说吧,总之啊,各种心窄啊……

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.tgb</groupId>
	<artifactId>gxpt_b_ear</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>ear</packaging>
	
	<dependencies>
		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>gxpt_entity_qx</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>gxpt_common_tool</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>gxpt_common_eao</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>gxpt_common_eao_impl</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>gxpt_mgr_qx_module</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>gxpt_mgr_qx_module_impl</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<type>jar</type>
		</dependency>
		<dependency>
			<groupId>com.tgb</groupId>
			<artifactId>gxpt_web_qx_module</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<type>war</type>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-ear-plugin</artifactId>
				<version>2.9</version>
				<configuration>
					<packagingIncludes>META-INF/**,**/gxpt_*.jar,**/gxpt_*.war</packagingIncludes>
					<jboss>
						<version>5</version>
						<module-order>strict</module-order>
					</jboss>
					<modules>
						<jarModule>
							<groupId>com.tgb</groupId>
							<artifactId>gxpt_entity_qx</artifactId>
							<includeInApplicationXml>true</includeInApplicationXml>
						</jarModule>
						<jarModule>
							<groupId>com.tgb</groupId>
							<artifactId>gxpt_common_tool</artifactId>
							<includeInApplicationXml>true</includeInApplicationXml>
						</jarModule>
						<jarModule>
							<groupId>com.tgb</groupId>
							<artifactId>gxpt_common_eao</artifactId>
							<includeInApplicationXml>true</includeInApplicationXml>
						</jarModule>
						<jarModule>
							<groupId>com.tgb</groupId>
							<artifactId>gxpt_common_eao_impl</artifactId>
							<includeInApplicationXml>true</includeInApplicationXml>
						</jarModule>
						<jarModule>
							<groupId>com.tgb</groupId>
							<artifactId>gxpt_mgr_qx_module</artifactId>
							<includeInApplicationXml>true</includeInApplicationXml>
						</jarModule>
						<jarModule>
							<groupId>com.tgb</groupId>
							<artifactId>gxpt_mgr_qx_module_impl</artifactId>
							<includeInApplicationXml>true</includeInApplicationXml>
						</jarModule>
						<webModule>
							<groupId>com.tgb</groupId>
							<artifactId>gxpt_web_qx_module</artifactId>
						</webModule>
					</modules>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>


你可能感兴趣的:(用Maven打包成EAR远程部署JBoss(一)——打包及手动部署到本地)