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

从前面的部分恢复

第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的“ 模块 ”部分中正确引用。

CapturFiles_3

我们的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的最终版本)。

CapturFiles_5

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

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

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

Manifest-Version: 1.0
    Built-By: papo
    Build-Jdk: 1.7.0_45
    Class-Path: lib/sample-services-0.0.1-SNAPSHOT.jar lib/sample-services-0.0
     .1-SNAPSHOT.jar lib/sample-domain-0.0.1-SNAPSHOT.jar
    Created-By: Apache Maven 3.2.1
    Archiver-Version: Plexus Archiver

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

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

CapturFiles_6

有一个有趣的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值