针对新手的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,一经查实,立即删除!

相关文章

合并两个有序数组,并输出中间值

示例1&#xff1a; nums1 [1,3] nums2 [2,4] output: (23) / 2 2.5 示例2&#xff1a; nums1 [2,5,7] nums2 [3,6] output:5 Python解决方案&#xff1a; def findMedianSortedArrays(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int…

Python中关于文件路径的简单操作 [转]

1: os.listdir(path) #path为目录 功能相当于在path目录下执行dir命令&#xff0c;返回为list类型 举例&#xff1a; print os.listdir(..) 输出&#xff1a; [a,b,c,d] 2: os.path.walk(path,visit,arg) path &#xff1a;是将要遍历的目录 visit &#xff1…

生产上完成TopN统计流程

背景 现有城市信息和产品信息两张表在MySQL中&#xff0c;另外有用户点击产品日志以文本形式存在hdfs上&#xff0c;现要求统计每个个城市区域下点击量前三的产品名&#xff0c;具体信息见下方。 mysql> show tables; --------------------------------- | Tables_in_d7 …

最大公因数和最小公倍数

一丶 最大公因数求法&#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>…

JPA 2.1实体图–第2部分:在运行时定义延迟/急切加载

这是我关于JPA 2.1实体图的第二篇文章。 第一篇文章描述了命名实体图的用法。 这些可用于定义在编译时将使用查找或查询方法获取的实体和/或属性的图形。 动态实体图以相同的方式但以动态方式这样做。 这意味着您可以在运行时使用EntityGraph API定义实体图。 如果您错过了第一…

HDU1166-敌兵布阵

http://acm.hdu.edu.cn/showproblem.php?pid1166 线段树第一题 #include<cstdio> #define lson l,m,rt<<1 #define rson m1,r,rt<<1|1 const int maxn55555; int sum[maxn<<2]; void PushUP(int rt) {sum[rt]sum[rt<<1]sum[rt<<1|1]; } …

js对象序列化为json字符串

网上找了找将js对象序列化为json字符串的方法。结果都不近人意&#xff0c;最后自己写了一个。 注意你得自己为Date增加toString()方法。 function Serialize(obj){switch(obj.constructor){case Object:var str "{";for(var o in obj){str o ":" Seri…

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;组件的第一个字母必须大写&…

Spring4:没有默认构造函数的基于CGLIB的代理类

在Spring中&#xff0c;如果要代理的目标对象的类未实现任何接口&#xff0c;则将创建基于CGLIB的代理。 在Spring 4之前&#xff0c;基于CGLIB的代理类需要默认的构造函数。 这不是CGLIB库的限制&#xff0c;而是Spring本身。 幸运的是&#xff0c;从Spring 4开始&#xff0c;…

linux里面i386 i686 i486 i586代表什么?是什么意思

URL:http://hi.baidu.com/software_one/blog/item/85c7ccedd70d6925acafd5e0.html 在linux里面&#xff0c;我们经常会遇到i386 i686 i486 I586 这些代码&#xff0c;例如查看内核版本&#xff1a; [rootlocalhost logs]# uname -a Linux localhost.localdomain 2.6.18-164.el5…

汇编语言學習

汇编语言 汇编语言(Assembly Language)是面向机器的程序设计语言.汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言”作为一门语言&#xff0c;对应于高级语言的编译器&#xff0c;需要一个“汇编器”来把汇编语言原文件汇编…

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

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

DevStack方式安装queens版openstack

最近在学习openstack,在安装阶段就遇到了很多问题&#xff0c;特把安装过程记录如下&#xff0c;经笔者验证能正确安装openstack。 说明&#xff1a;安装后即为中文版。 2019/01/29: 安装环境&#xff1a; 宿主&#xff1a; Ubuntu 16.04 xenial Hypervisor: kvm 虚拟机&#x…

dev c++ 报错[Error] ld returned 1 exit status 的解决办法

我是个C语言的初学者&#xff0c;在使用dev c 编译器时&#xff0c;遇到一个情况&#xff1a;程序是正确的&#xff0c;能够正常的编译和运行&#xff0c;但是运行一次之后再次运行之时就出现了 报错[Error] ld returned 1 exit status&#xff0c;出现这个问题的原因是&#x…

2008年12月答疑贴

有问题请在此贴跟贴回复&#xff0c;我亦会在此贴回复。 请不要到无关的帖子中跟帖 请尽量描述清楚你的问题和需要&#xff0c;我的理解能力不是很强&#xff0c;呵呵。 请您遵守以下规则&#xff1a; 提问内容中请不要出现 感叹号&#xff0c;跪求等字样。 请尽量不要称呼我为…

androidmanifest.xml权限中文说明

程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允 许读写访问”properties”表在checkin数据库中&#xff0c;改值可以修改上传( Allows read/write access to the “properties” t…

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