从前面的部分恢复

第1部分
第2部分
第3部分

我们正在恢复第四部分,目前我们的简单项目有

  • Web Maven模块(战争)
  • 一个ejb模块(ejb),其中包含我们的无状态会话bean(EJB 3.1)
  • 第二个(ejb)模块包含我们的实体bean(JPA2)

但是我们仍然缺少将它们打包的所有文件,即“ 耳朵”类型的文件(也称为Enterprise Archive) 。

定义我们的耳朵Maven模块

正如您在下图中所看到的,我们在sample-parent下创建了一个名为sample-ear的emtpy文件夹。 该文件夹需要有一个pom.xml文件。 我们的新模块需要在sample-parent \ pom.xml的“ 模块 ”部分中正确引用。

我们的ear Maven模块的主要目的是“配置”著名的maven-ear-plugin ,它将由maven调用并将产生最终的可部署应用程序。

我们需要做2件事,添加maven-ear-plugin的配置,并在ear模块上添加我们的“ internal ”应用程序依赖项,以便它“知道”应该查找哪些模块。 我们来看一下:

内耳pom.xml

<build><finalName>sampleapp</finalName><plugins><!--Ear plugin -creating the ear - watch out skinny WARS!--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-ear-plugin</artifactId><configuration><finalName>sampleapp</finalName><defaultJavaBundleDir>lib/</defaultJavaBundleDir><skinnyWars>true</skinnyWars><modules><webModule><groupId>gr.javapapo</groupId><artifactId>sample-web</artifactId></webModule><ejbModule><groupId>gr.javapapo</groupId><artifactId>sample-services</artifactId></ejbModule></modules></configuration></plugin></plugins></build>

这是构建部分,请注意以下事项:

  • 请记住,因为我们没有其他模块,我们定义了一些基本的常用的配置为我们的插件,在“ ” POM。 返回并查看已经为您准备的内容。
  • 请注意“ defaultJavaBundleDir ”,在这里我们定义所有库的位置(除了将驻留在我们耳朵中的顶级模块之外,通常是耳朵中的一个子文件夹,称为“ lib”)。
  • 什么是顶级模块? 实际上,是将瓶子和战争包装在耳朵里,被认为是第一级公民,正如您所看到的,我们定义了2,样本网络和样本服务。
  • 注意“ skinnyWars ”属性。 启用此开关后, 我们将根据我们的war项目引用的第三方库强制执行某种打包模式 。 简而言之,我们的战争归档文件不会在WEB-INF \ lib文件夹下包含任何我们可能定义为依赖项的外部库,而是所有这些库,它们将被包装在耳边的“ defaultJavaBundleDir ”路径中。

如果不添加耳挂的“依赖关系”部分,以上配置将无法正常工作。

<!-- our in app dependencies--><dependencies><dependency><groupId>gr.javapapo</groupId><artifactId>sample-web</artifactId><version>${project.version}</version><type>war</type></dependency><dependency><groupId>gr.javapapo</groupId><artifactId>sample-services</artifactId><version>${project.version}</version><type>ejb</type></dependency></dependencies>

记下以下内容:

  • 此pom中的dependency元素需要'type'属性。

您可能有一个很好的问题,样本域(jar)模块在哪里?

嗯,这个模块在我们的耳边不会被提升为顶层元素,因为我们将其添加为对sample-services模块的依赖。 因此,我们的服务将依赖于实体bean的模块。 (听起来很公平)。 因此,我们需要更新示例服务模块的pom.xml。

<artifactId>sample-services</artifactId><name>sample-services</name>   <description>EJB service layer</description><packaging>ejb</packaging><dependencies><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId></dependency><dependency><groupId>gr.javapapo</groupId><artifactId>sample-domain</artifactId><version>${project.version}</version></dependency></dependencies></project>

通过这样做,sample-services.jar将沿着sample-domain.jar“获取”。 默认情况下(请记住,Maven都是关于约定的),当我们为耳朵定义一个顶级模块时,就像样本服务一样,它的依赖项会自动捆绑在耳朵的defaultJavaBundleDir库下! 因此,当我们打包耳朵时,我们将期望看到打包的sample-domain jar。

再缺少一个依赖

在服务模块和实体模块之间的第一个应用程序内依赖之后,我们需要另一个。 我们的战争模块(Web层)将使用我们的一些服务,但是为了能够做到这一点,需要依赖于“服务”模块。 因此,我们需要相应地在sample-web项目上使用pom.xml。

<packaging>war</packaging><build><finalName>${project.artifactId}</finalName></build><dependencies><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><scope>provided</scope></dependency><dependency><groupId>gr.javapapo</groupId><artifactId>sample-services</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>

让我们打包战争吧。

现在我们已经准备好,已经设置了基本依赖项,已经配置了我们的耳朵,只需要打包即可。 在命令行的sample-parent文件夹级别下,我们只需要输入:

mvn清洁包装

我们完成了,让我们检查sample-ear模块的“ target”文件夹下。 我们的最后一只耳朵已经准备好了,maven还创建了耳朵的“ 分解 ”版本(在下图中展开)。 注意我们的两个顶级耳朵元素,以及sample-domain.jar如何位于我们耳朵的“ lib”文件夹下。 还请注意,lib文件夹中未包含某些基本库,例如javaee-api.jar。 由于我们已经在pom中添加了提供的内容。 (请参阅xml的最终版本)。

最后一件事……皮包骨头的战争和MANIFEST.MF文件

最终,我们可以在这里停下来,我们的最后一只耳朵可以正常工作,但是在上述所有配置下,尤其是在我们偏好进行皮包骨头的战争的情况下,我们需要注意一个小细节。 MANIFEST文件是jar和wars中的特殊描述符,供应用程序服务器在耳朵内的类路径中查找和类加载“相关” jar时使用。

我们的小问题存在于sample-web.war的MANIFEST.MF文件中。 如果解压缩生成的war文件,并使用文本编辑器MANIFEST.MF打开,我们将看到类似的内容。

Manifest-Version: 1.0Built-By: papoBuild-Jdk: 1.7.0_45Class-Path: lib/sample-services-0.0.1-SNAPSHOT.jar lib/sample-services-0.0.1-SNAPSHOT.jar lib/sample-domain-0.0.1-SNAPSHOT.jarCreated-By: Apache Maven 3.2.1Archiver-Version: Plexus Archiver

你能发现错误吗? 默认情况下,生成的MANIFEST.MF为我们的顶级ejb jars(sample-services)指示错误的路径。 我们的sample-services.jar不在耳朵的\ lib下,而是顶级元素。 那么我们如何创建正确的清单?

最终,我们需要对Maven-war插件进行一些微调。 我们需要覆盖父pom中指定的默认行为,并为此特定依赖项指定正确的条目。 如果碰巧有多个jar,则需要在配置中附加所有作为顶级元素的jar(确保正确执行,在条目之间使用空格)。因此在sample-war pom中,我们需要在所应用的配置之上添加一些配置(额外)。 参见下图。

有一个有趣的stackoverflow问题 ,您可以有关此的知识,小技巧或其他可能的解决方法,以防您使用骨瘦如柴的战争。

就是这样,我们的耳朵已经准备好了。

摘要

您可以在Git Tag中找到此文章的最终版本。本文将完成从头开始,应用基本的Maven原理并为Java企业应用程序创建一些基本的Maven模块的系列文章。 请随意重用此示例并对其进行扩展,以满足您自己的需求。 就满足您的所有需求而言,它是完整的,但它是在Maven中入门,思考和配置的可靠示例。

我将在此示例中进行扩展,在以后的文章中添加更多的模块并使用maven的更多功能。

翻译自: https://www.javacodegeeks.com/2014/06/java-ee7-and-maven-project-for-newbies-part-4-defining-the-ear-module.html

针对新手的Java EE7和Maven项目-第4部分-定义Ear模块相关推荐

  1. ejb的maven_针对新手的Java EE7和Maven项目-第3部分-定义ejb服务和jpa实体模块

    ejb的maven 从前面的部分恢复 第1部分 第2部分 我们在第三部分继续介绍,我们已经有一个父pom,并且已经为我们的war模块定义了pom. 在我们的原始设置中,我们定义了我们的应用程序将包含一 ...

  2. 针对新手的Java EE7和Maven项目-第3部分-定义ejb服务和jpa实体模块

    从前面的部分恢复 第1部分 第2部分 我们在第三部分继续介绍,我们已经有一个父pom,并且已经为我们的war模块定义了pom. 在我们的原始设置中,我们定义了我们的应用程序将包含一个ejb jar形式 ...

  3. java ee maven_针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom...

    java ee maven 为什么呢 很多时候,我在日常工作中试图解决一些基本或复杂的Maven / Java EE项目结构问题. 为了提供解决方案,我经常最终会尝试项目结构,测试我在不同应用程序服务 ...

  4. 针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom

    为什么呢 很多时候,我在日常工作中试图解决一些基本或复杂的Maven / Java EE项目结构问题. 为了提供解决方案,我经常最终会尝试项目结构,测试我在不同应用程序服务器上的部署并细化我的配置. ...

  5. 针对新手的Java EE7和Maven项目-第2部分-为我们的应用程序定义一场简单的战争

    从第一部分恢复 第1部分 我们刚刚定义了父 pom. 一种特殊的pom类型,它最终定义了我们的应用程序将要使用的库. 它还配置了所有用于包装我们应用程序每个模块的Maven工具. 您可以在此处 签出 ...

  6. java ee maven_针对新手的Java EE7和Maven项目–第5部分–使用Arquillian / Wildfly 8进行单元测试...

    java ee maven 从前面的部分恢复 第1 部分 , 第2 部分 , 第3 部分 , 第4部分 , 这是第一篇"额外"文章,基于我在该系列博客文章中"构建&quo ...

  7. 针对新手的Java EE7和Maven项目–第5部分–使用Arquillian / Wildfly 8进行单元测试

    从前面的部分恢复 第1 部分 , 第2 部分 , 第3 部分 , 第4部分 , 这是第一篇"额外"的帖子,基于我正在此系列博客文章上"构建"的Maven Jav ...

  8. 针对新手的Java EE7和Maven项目–第2部分–为我们的应用程序定义一场简单的战争...

    从第一部分恢复 第1部分 我们刚刚定义了父 pom. 一种特殊的pom类型,它最终定义了我们的应用程序将要使用的库. 它还配置了所有用于打包我们应用程序每个模块的Maven工具. 您可以在此处 签出 ...

  9. java ee maven_针对新手的Java EE7和Maven项目–第8部分

    java ee maven 第一部分 , 第2部分 , 第3部分 , 第4部分 , 第5部分 , 第6部分 , 第7部分 第8部分 自上一篇文章以来,这一系列教程已经有很长时间了. 是时候恢复并在我们 ...

最新文章

  1. php模拟超级课程表,一个功能完善、UI简洁的仿超级课程表的课表控件 TimetableView...
  2. 教你如何使用Solitude评估应用程序中的用户隐私问题
  3. python获取代码行号
  4. 手机调试java代码_【奇技淫巧】Intellij IDEA调试ysoserial等Java项目的方法
  5. Java之品优购课程讲义_day19(6)
  6. js关闭setInterval及终止ajax请求
  7. 12.混淆——混叠图像,对比敏感度,图像压缩_4
  8. php 邮件收发 (乱码)
  9. Acrobat Pro DC 教程,如何压缩PDF文件?
  10. leetcode第一刷_ Flatten Binary Tree to Linked List
  11. Primer – 支撑 GitHub 的 CSS 工具包和准则
  12. 最新Vue2.0+组件开源项目库集合
  13. PLSQL14下载与安装及使用
  14. 为什么我们创业失败了和选择创业公司的思考
  15. C++编程-牛客网-雀魂启动
  16. vue2 vant组件库报错:ERROR in ./node_modules/@vant/use/dist/index.esm.mjs 101:12-19export ‘isVNode‘ (imp
  17. Matlab plot画图 坐标字体、字号、范围、间隔等的设置
  18. react(let命令)
  19. Unity开发OpenXR | (二)使用 OpenXR 制作一款简单VR示例场景 的全过程详细教程,包含两个实战案例。
  20. oracle 自动填充,jQuery 实现自动填充邮箱功能(带下拉提示)

热门文章

  1. mysql id生成器自定义_MybatisPlus使用自定义Id生成器数据自动填充
  2. grub shell 错误_使用grub-install修复Grub时出错
  3. 关闭(杀死)8080端口
  4. SpringBoot+MyBatis搭建迷你小程序
  5. 做一个完整的Java Web项目需要掌握的技能
  6. skynet.fork_Apache Ant 1.10.6发布–用于junitlauncher的fork模式以及新的jmod和链接任务
  7. payara 创建 集群_Apache Payara:让我们加密
  8. java-jar jvm_使用Java流和In-JVM-Memory的超低延迟查询
  9. openapi_MicroProfile OpenAPI上的Swagger UI
  10. assertj_AssertJ的SoftAssertions –我们需要它们吗?