针对新手的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.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中,我们需要在所应用的配置之上添加一些配置(额外)。 参见下图。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最大公因数和最小公倍数

一丶 最大公因数求法&#xff1a;辗转相除法(也称欧几里得算法)原理: 二丶最小公倍数求法&#xff1a;两个整数的最小公倍数等于两整数之积除以最大公约数1 #include <iostream>2 3 using namespace std;4 5 //辗转相除法(欧几里得算法)6 7 int gcd(int a, int b)8 {9…

css实现div内一段文本的两端对齐

在一个固定宽度的div内&#xff0c;使得P标签内的文本两端对齐&#xff1a; text-align: justify;text-justify:inter-ideograph; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>justify</title>…

QT学习三 标准对话框 QMessageBox

QMessageBox内置了几种static方法,例如 QMessageBox::question() 返回值:StandardButton 参数:QWidget * 父窗口&#xff0c;标题名&#xff0c;内容&#xff0c;按钮 YES|NO,默认选中按钮) 示例: 1 #include "mainwindow.h"2 #include <QApplication>3 #incl…

react学习笔记2

1.build文件介绍 &#xff08;1&#xff09;react.js 是react的核心库 &#xff08;2&#xff09;react-dom.js 提供与DOM相关功能 &#xff08;3&#xff09;browser.js 是将JSX语法转为javascript语法 2.组件的继续学习 注意&#xff1a;组件的第一个字母必须大写&…

HOW-TO:带有MySQL的JEE应用程序中具有集群功能的Quartz Scheduler

Quartz Scheduler是Java世界中最流行的调度库之一。 过去&#xff0c;我主要在Spring应用程序中使用Quartz。 最近&#xff0c;我一直在研究将在云中部署的JBoss 7.1.1上运行的JEE 6应用程序中的调度。 我考虑的一种选择是Quartz Scheduler&#xff0c;因为它提供了与数据库的集…

C语言使用scanf()函数时,%c前面和后面分别加上空格后的结果

在使用scanf()读取输入的字符时&#xff0c;当转换说明为%c时&#xff0c;"%c"、" %c"、"%c " 这三种不同的写法&#xff0c;对数据读取的结果有什么影响吗&#xff0c;答案是肯定的&#xff0c;%c 加不加空格&#xff0c;空格在前还是在后&am…

Python -- 自动导入所需要的模块

try: import xlwtexcept ImportError as e:   import os   print(e)   os.system("pip install xlwt")转载于:https://www.cnblogs.com/xlx12138/p/10551894.html

借助Apache Hadoop大规模扩展Apache Solr实时实时索引

播客的第22集是与Patrick Hunt的谈话 我们讨论了Apache Solr&#xff08;上游&#xff09;中的新工作&#xff0c;使它可以在Apache Hadoop上工作。 Solr支持将其索引和事务日志文件写入和读取到HDFS分布式文件系统。 这不使用Hadoop Map-Reduce处理Solr数据&#xff0c;而是仅…

linux查看用户、创建用户、设置密码、修改用户、删除用户命令

查看用户 tail -1 /etc/passwd tail -1 /etc/shadow id alex echo 123 |passwd --stdin alex # 设置密码&#xff0c;不需要交互[rootlocalhost ~]# tail -l /etc/passwd rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS …

去除git版本控制

命令&#xff1a;find . -name ".git" | xargs rm –Rflinux $ find . -type d -iname __pycache__ -exec rm -rf {} \;转载于:https://www.cnblogs.com/gispathfinder/p/10555347.html

如何在Java中找到整数的质因数–因式分解

编程课程中的常见家庭作业/任务之一是关于Prime Factorization。 要求您编写一个程序以找到给定整数的素因子 。 一个数字的质数因子是将精确地除以给定数字的所有质数。 例如&#xff0c;35的素数因子分别是7和5&#xff0c;它们本身都是素数&#xff0c;并且精确地除以35。上…

Arduino Serial系列函数 有关print read 的总结

总结一下 在学习arduino srial函数时 的几个知识点&#xff1a; /*** 汇总一下Serial.print输出的一些情况&#xff0c;后面部分要和Serial.read配合使用&#xff1b;* 1. print 输出字符 和int数的结果&#xff0c;* 2. print 输出字符串和一连串的数字* 3. read 读取一个字符…

C#经典名著:《C#入门经典》(第4版)

博客园专题&#xff1a;http://book.cnblogs.com/zt/begin_csharp/ 作  者&#xff1a; &#xff08;美&#xff09;沃森&#xff08;Watson&#xff0c;K.&#xff09;&#xff0c;&#xff08;美&#xff09;内格尔&#xff08;Nagel&#xff0c;C.&#xff09; 等著&#…

您必须学习Java 8的函数式编程吗?

我最近一直在研究Java 8&#xff0c;并掌握了Manning出版的“ Java 8 In Action” 。 让我印象深刻的第一件事是Java 8的独特销售主张是函数式编程。 函数现在是一流的变量&#xff0c;您可以像int或String一样在代码中传递它们。 这是一个很大的变化。 近年来&#xff0c;功能…

巨蟒django之权限6: 权限控制表设计登录权限

1.权限控制表设计 内容 1. 什么是权限&#xff1f; 2. 为什么要有权限&#xff1f;不同用户拥有不同的功能 3. 在web开发中&#xff0c;什么是权限&#xff1f;url 代表 权限4. 开发一个权限的组件&#xff0c;为什么要开发组件&#xff1f;5. 表结构的设计# 第一版权限表 pe…

CSS制作镂空字体

1.效果图 2.html内容&#xff1a; <!doctype html><html lang"en"><head> <meta charset"UTF-8"> <title>Document</title></head><style> body{background: rgb(248,248,248);} span{font-size: 240px;…

为什么要在Java的Serializable类中使用SerialVersionUID

序列化和SerialVersionUID始终是许多Java开发人员的难题。 我经常会看到类似此SerialVersionUID的问题&#xff0c;或者如果不在我的Serializable类中声明SerialVersionUID会发生什么情况&#xff1f; 除了涉及到的复杂性和罕见的使用之外&#xff0c;这些问题的另一个原因是Ec…

SQL2005-使用openrowset 里读取excel文件

很多时候我们都知道使用.net代码去读取word,excel文档&#xff0c;但是我们如何使用sql句语里读取excel文件呢&#xff1a;SQL2005为我们提供了OPENROWSET来访问各种数据源&#xff1a;,当然我还是建议使用.net代码来读取这些文件。这里就不多说了。 我们先看一下官方的解释&am…

Java中的SynchronousQueue示例–生产者使用者解决方案

SynchronousQueue是BlockingQueue的一种特殊类型&#xff0c;其中每个插入操作必须等待另一个线程进行相应的删除操作&#xff0c;反之亦然。 当您在SynchronousQueue上调用put&#xff08;&#xff09;方法时&#xff0c;它将阻塞&#xff0c;直到有另一个线程将该元素从Queue…

OnSen UI结合AngularJs打造”美团APP我的”页面 --Hybrid App

1、页面效果图&#xff1a; 演示地址&#xff1a;http://www.nxl123.cn/bokeyuan/meiTuanDemo_mine/ 2、核心代码 mine.html&#xff1a; <ons-page id"mine" ng-controller"MineController"> <!--toolbar开始--> <ons-toolbar>…