前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java EE7和Maven工程入门(4)

Java EE7和Maven工程入门(4)

作者头像
哲洛不闹
发布2018-09-18 14:15:32
8540
发布2018-09-18 14:15:32
举报
文章被收录于专栏:java一日一条

我们现在开始第四部分。目前我们的简单工程包含了:

1.一个web maven模块(war) 2.一个支持无状态会话beans的ejb模块(EJB3.1) 3.支持实体beans的ejb模块(JPA2)

但是,我们仍然缺少把它们打包到一起的存档文件,即‘ear’类型(亦称企业存档)

定义EAR maven模块

在下图可以看到,我们在sample-parent下定义了一个空文件夹,叫做sample-ear。这个文件夹需要有一个pom.xml文件。我们的新模块需要被sample-parent\pom.xml的“modules”部分正确引用。

EAR MAVEN模块的主要目的是为了“配置”著名的maven-ear插件,这个插件将会被maven引用,并且用来生成我们最后的部署应用程序。

有两件简单的事情需要做:为maven-ear插件增加配置和在EAR模块增加我们的“内部”应用依赖关系,以便让它“知道”应该寻找哪个模块。我们来看一看:

ear pom.xml内容

上面是创建过程,下面是需要注意的地方:

  • 记得我们在另一个模块中的做法。我们已经为插件定义了一些常用的基本配置,在“父”pom中。可以回顾一下那里已经做好的配置。
  • 注意“defaultJavaBundleDir”。这是我们所有库定义的地方(除了包含ear的顶层模块,通常也包会含ear的’lib’子文件夹)。
  • 什么是顶层模块?它实际上是,将会打包在ear中的jar包和wars包,而且将会被看成是一等公民。正如你知道的,我们定义了两个顶层模块,sample-web和sample-services。
  • 注意’skinnyWars‘属性。当该属性启用时,我们会对war项目中引用的第三方库打包时执行一个确定的模型。简单来说,我们的war档案会包含任何WEB-INF\lib文件夹中定义依赖的外部函数库。和这些libs相反,它们将在ear级’defaultJavaBundleDir‘路径上打包。

如果不添加ear-pom的“依赖关系”,上述的配置无法工作。

请注意下面内容:

  • 在这个pom上的依赖元素,需要“type”属性。

一个很好的问题:sample-domain(jar)模块在哪里?

好吧,这个模块在ear中不会提升为顶级模块。因为我们将会把作为sample-services模块的一个依赖关系,所以我们的services将在实体beans模块拥有一个依赖关系(听起来很公平)。因此需要更新sample-services模块的pom.xml。

这样,sample-services.jar会和sample-domain.jar一起被“获取(fetch)”。默认情况下(记住Maven都是约定),当我们给一个ear定义一个顶级模块,像sample-services,它的依赖关系在ear的defaultJavaBundleDir库中是自动绑定的!所以,当我们打包ear时,将会看到打包的sample-domain.jar。

再次失踪的依赖关系

在第一个services模块和实体模块的应用依赖关系之后,我们还需要另外一个依赖关系。我们的war模块(web层面)将会用到一些services。为了做到这一点,需要在“services”模块有一个依赖关系。所以相应的,在sample-web项目上需要pom.xml。

让我们来打包war吧

现在我们准备好了。基本的依赖关系都设置好了,ear已经配置,我们只需要打包了。在sample-parent文件夹下,只需在命令行输入:

我们就完成了。让我们检查一下sample-ear模块的’target’文件夹,最终的ear已经生成了。maven还在ear中创建了’exploded’版本,(下图是放大版本)。请注意,我们的两个顶级ear元素,以及sample-domain.jar是如何在ear的’lib’文件夹下的。同时还需要注意一些基本的库,像javaee-api.jar,并没有包含在lib文件夹下。既然我们已经添加了规定的“pom”(见xml的最终版本)。

最后的工作:skinny war和MANIFEST.MF文件

最后,我们可以在这里结束。最后的ear是对的并且可以工作了,但是和所有上述的配置一起,特别是根据我们的喜好的设置来创建skinny wars。需要注意的一个细节:MANIFEST文件是jar和war中的特殊描述符。应用服务器通过MANIFEST文件定位和加载classpath上“依赖”的jar包。

有一个小问题存在于sample-web.war的MANIFEST.MF文件中。解压已生成的war文件,用文本编辑器打开MANIFEST.MF,会看到类似下面的内容:

你能找到错误吗?默认生成的MANIFEST.MF中,顶级ejb jars(sample-services)指向了一个错误路径。我们的sample-services.jar并没有放在ear中的\lib下,而是一个顶级元素。所以,怎样创建一个正确的MANIFEST呢?

最后,我们需要微调一下maven-war插件。我们需要在父pom中覆盖指定的默认行为,并为这个特殊的依赖关系指定一个正确项。如果碰巧有多个,那么需要为所有的在配置中的顶级元素的jars添加(请确保你正确的做了这一点,在条目之间使用一个空格)。所以,在sample-war pom中,我们需要在一个应用的顶层增加一些(额外的)配置。

在stackoverflow上有一个有趣的问题。如果使用skinny-wars的话,你可以从这里了解更多的小窍门或者其他可能的解决方法。

就是这样,ear模块已经准备就绪。

总结

点击这个Git Tag可以看到这篇文章的最终版。到这篇文章为止,我们已经完成了第一个系列的文章。从零开始,应用基本的maven准则为Java企业级应用构建一些基本的maven模块。你可以使用这个例子,任意扩展满足你的需求。迄今为止它完全满足你的所有需求,它是Maven开始、思考和配置的一个很好的实例。

接下来的文章将会扩充这个例子,加入更多maven的模块,使用更多maven的功能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java一日一条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义EAR maven模块
  • ear pom.xml内容
  • 一个很好的问题:sample-domain(jar)模块在哪里?
  • 再次失踪的依赖关系
  • 让我们来打包war吧
    • 最后的工作:skinny war和MANIFEST.MF文件
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档