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

2024-01-01 08:50

本文主要是介绍用Maven打包成EAR远程部署JBoss(一)——打包及手动部署到本地,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


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

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

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

[html] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.tgb</groupId>
  5. <artifactId>gxpt_b_ear</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>ear</packaging>
  8. <build>
  9. <plugins>
  10. <plugin>
  11. <artifactId>maven-ear-plugin</artifactId>
  12. <version>2.9</version>
  13. </plugin>
  14. </plugins>
  15. </build>
  16. </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都写到里面来,如:

[html] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. [...]
  2. <dependencies>
  3. <dependency>
  4. <groupId>com.tgb</groupId>
  5. <artifactId>gxpt_entity_qx</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <type>jar</type>
  8. </dependency>
  9. <dependency>
  10. <groupId>com.tgb</groupId>
  11. <artifactId>gxpt_web_qx_module</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <type>war</type>
  14. </dependency>
  15. </dependencies>
  16. [...]
[...]
<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,那么我们现在就加入以下代码:

[html] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <plugin>
  2. <artifactId>maven-ear-plugin</artifactId>
  3. <version>2.9</version>
  4. <configuration>
  5. <packagingIncludes>META-INF/**,**/gxpt_*.jar,**/gxpt_*.war</packagingIncludes>
  6. </configuration>
  7. </plugin>
<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

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

那么如何来控制顺序呢?

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

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

配置文件:

[html] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <plugin>
  2. <artifactId>maven-ear-plugin</artifactId>
  3. <version>2.9</version>
  4. <configuration>
  5. <packagingIncludes>META-INF/**,**/gxpt_*.jar,**/gxpt_*.war</packagingIncludes>
  6. <jboss>
  7. <version>5</version>
  8. <module-order>strict</module-order>
  9. </jboss>
  10. <modules>
  11. <jarModule>
  12. <groupId>com.tgb</groupId>
  13. <artifactId>gxpt_entity_qx</artifactId>
  14. <includeInApplicationXml>true</includeInApplicationXml>
  15. </jarModule>
  16. [...]
  17. </modules>
  18. </configuration>
  19. </plugin>
<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的配置信息:



这里,需要注意的是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的事就下篇再说吧,总之啊,各种心窄啊……

[html] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.tgb</groupId>
  5. <artifactId>gxpt_b_ear</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>ear</packaging>
  8. <dependencies>
  9. <dependency>
  10. <groupId>com.tgb</groupId>
  11. <artifactId>gxpt_entity_qx</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <type>jar</type>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.tgb</groupId>
  17. <artifactId>gxpt_common_tool</artifactId>
  18. <version>0.0.1-SNAPSHOT</version>
  19. <type>jar</type>
  20. </dependency>
  21. <dependency>
  22. <groupId>com.tgb</groupId>
  23. <artifactId>gxpt_common_eao</artifactId>
  24. <version>0.0.1-SNAPSHOT</version>
  25. <type>jar</type>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.tgb</groupId>
  29. <artifactId>gxpt_common_eao_impl</artifactId>
  30. <version>0.0.1-SNAPSHOT</version>
  31. <type>jar</type>
  32. </dependency>
  33. <dependency>
  34. <groupId>com.tgb</groupId>
  35. <artifactId>gxpt_mgr_qx_module</artifactId>
  36. <version>0.0.1-SNAPSHOT</version>
  37. <type>jar</type>
  38. </dependency>
  39. <dependency>
  40. <groupId>com.tgb</groupId>
  41. <artifactId>gxpt_mgr_qx_module_impl</artifactId>
  42. <version>0.0.1-SNAPSHOT</version>
  43. <type>jar</type>
  44. </dependency>
  45. <dependency>
  46. <groupId>com.tgb</groupId>
  47. <artifactId>gxpt_web_qx_module</artifactId>
  48. <version>0.0.1-SNAPSHOT</version>
  49. <type>war</type>
  50. </dependency>
  51. </dependencies>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <artifactId>maven-ear-plugin</artifactId>
  56. <version>2.9</version>
  57. <configuration>
  58. <packagingIncludes>META-INF/**,**/gxpt_*.jar,**/gxpt_*.war</packagingIncludes>
  59. <jboss>
  60. <version>5</version>
  61. <module-order>strict</module-order>
  62. </jboss>
  63. <modules>
  64. <jarModule>
  65. <groupId>com.tgb</groupId>
  66. <artifactId>gxpt_entity_qx</artifactId>
  67. <includeInApplicationXml>true</includeInApplicationXml>
  68. </jarModule>
  69. <jarModule>
  70. <groupId>com.tgb</groupId>
  71. <artifactId>gxpt_common_tool</artifactId>
  72. <includeInApplicationXml>true</includeInApplicationXml>
  73. </jarModule>
  74. <jarModule>
  75. <groupId>com.tgb</groupId>
  76. <artifactId>gxpt_common_eao</artifactId>
  77. <includeInApplicationXml>true</includeInApplicationXml>
  78. </jarModule>
  79. <jarModule>
  80. <groupId>com.tgb</groupId>
  81. <artifactId>gxpt_common_eao_impl</artifactId>
  82. <includeInApplicationXml>true</includeInApplicationXml>
  83. </jarModule>
  84. <jarModule>
  85. <groupId>com.tgb</groupId>
  86. <artifactId>gxpt_mgr_qx_module</artifactId>
  87. <includeInApplicationXml>true</includeInApplicationXml>
  88. </jarModule>
  89. <jarModule>
  90. <groupId>com.tgb</groupId>
  91. <artifactId>gxpt_mgr_qx_module_impl</artifactId>
  92. <includeInApplicationXml>true</includeInApplicationXml>
  93. </jarModule>
  94. <webModule>
  95. <groupId>com.tgb</groupId>
  96. <artifactId>gxpt_web_qx_module</artifactId>
  97. </webModule>
  98. </modules>
  99. </configuration>
  100. </plugin>
  101. </plugins>
  102. </build>
  103. </project>

 

 

用Maven打包成EAR远程部署JBoss(一)讲了怎样使用Maven打包,但是在文章的最后也留下了一个问题,那就是怎样将包部署到远程的JBoss中呢?最近在对之前的学习进行总结,发现少了这样一篇重要的博客没有写……

远程部署,所用到的插件叫做:Cargo。这里我是以Maven插件形式使用的,这样就可以实现使用Maven从编译、打包、部署一条龙服务了。

我当时的学习资料很简单,就是官网。就是通过一次又一次这样的学习,让我更加坚定了:学习最好的资料就是官网提供的文档。但是,在我们最最刚开始的阶段,不是通过视频,而是通过文档来学习,又是那么的不现实。因为我们根本没有心情去将那些天文数字一样的东西看完,又怎么谈得上理解呢?所以在这里祝福你快速到达文档学习的阶段,真的要比视频学习高效。

好了,现在咱们来看下怎样部署吧,其实很简单:

我们在往JBoss部署的时候,其实都是很粗暴的往部署目录里面丢。但是JBoss是提供了接口,让你通过1099(默认)这个端口,进行上传部署的。而这也就是为什么可以使用Cargo实现远程部署,并且具有返回信息的原因。

说到返回信息,在这里多说一句,虽然远程部署弄出来了,由于各方面原因吧,没有使用Cargo进行远程部署。而是使用的bat脚本与Jenkins实现的远程部署。而使用bat脚本,那么你就不可能接到部署后JBoss的返回信息,也就是,在你Jenkins打包,然后执行bat脚本后,就完事了,部署有没有错,你是不知道的。而这个方案的具体实施,可以看下这篇博客:我的jenkins自动部署方案演进史。在Jenkins自动部署的这个过程中,真心感觉到google比度娘好使,看来大男子主义有时也挺好~~~

到现在还没开始正题,个人认为:我给大家分享我的成果,并不能帮助你提高多少,重要的是解决问题的过程。我列这些技术博客,目的就是让你不用再搜这样的博客,因为官网给你带来的不只是解决方法。

下面是我列的一个Cargo插件的配置列表:

<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.4.5</version>
<configuration>
<container>
<containerId>jboss51x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<cargo.remote.username>admin</cargo.remote.username>
<cargo.remote.password>admin</cargo.remote.password>
<cargo.hostname>192.168.24.48</cargo.hostname>
<cargo.rmi.port>1099</cargo.rmi.port>
</properties>
</configuration>
</configuration>
<dependencies>
<dependency>
<groupId>org.jboss.integration</groupId>
<artifactId>jboss-profileservice-spi</artifactId>
<version>5.1.0.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.jbossas</groupId>
<artifactId>jboss-as-client</artifactId>
<version>5.1.0.GA</version>
<type>pom</type>
</dependency>
</dependencies>
</plugin>


很清爽的配置,让你可以完成远程部署。

下面我给大家分享一下此后碰到的问题:

由于我们是小组开发,大家必定会使用到Maven私服库。我们使用的私服为Nexus,关于这个的搭建我就不列了,想知道怎样搭建的,留邮箱并说明要什么。而中央仓库使用的是Nexus默认,而这个上面是没有JBoss中Client的包的,后来通过查找,找到了开源中国搭建的一个Maven库,这个里面还是很全的,在默认中央库里没有的,在这里都可以找到。

唯一蛋疼的地就是:将开源中国的Maven库配到Nexus中后,索引可以更新下来,但是当下载jar时,死活就是不down。最后采取的解决方法就是在自己的电脑上clean install一下,然后把jar再手动上传到私服库上。虽然麻烦一点,但想到这样的事不会经常发生,所以也就这样过来了。这个问题当时查了一下,也有好些人遇到这个问题,如果谁解决了这个问题,还望分享~~

最后给大家分享一句话:最让你受益的,往往是那些你很轻易就可以看到的~

 

这篇关于用Maven打包成EAR远程部署JBoss(一)——打包及手动部署到本地的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558736

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

Solr部署如何启动

Solr部署如何启动 Posted on 一月 10, 2013 in:  Solr入门 | 评论关闭 我刚接触solr,我要怎么启动,这是群里的朋友问得比较多的问题, solr最新版本下载地址: http://www.apache.org/dyn/closer.cgi/lucene/solr/ 1、准备环境 建立一个solr目录,把solr压缩包example目录下的内容复制