从前面的部分恢复
第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