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

java ee maven

为什么呢

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

Maven对于新来者来说可能会有陡峭的学习曲线,如果您将现代Java EE应用程序的“ 有时 ”复杂的配置要求添加进来,事情会变得更加令人沮丧。 在我的职业生涯中,我还看到很多初级Java开发人员 ,当他们加入一个大团队或一个项目时,大多数时候,项目结构已经由高级成员细化和配置。 他们认为这是可行的,并且没有花费时间来了解接线和配置。 我过去自己犯过这个错误。 他们被分配了简单的编码任务并且对需求进行了深入研究,但是不幸的是他们忘记了研究应用程序结构,而他们的高级同事也常常由于时间限制而忘记在特定领域进行培训。 当人们在没有经验的情况下开始尝试弄乱应用程序的结构而试图使其正常工作时,可能会导致事故。 Maven及其约定旨在为建立项目的结构和结构提供很多帮助,但是您仍然需要了解工具的约定,然后精通“ 配置 ”。

您经常会听到有人说“ 我在这里添加了这个库,它起作用了 ”,如果您回复“在那定义 ”,那么您可能会得到一些有趣的答案。 有时是偶然或幸运的,它起作用了,但是在复杂的多模块应用程序中,大多数情况下“ 它只是起作用 ”是一种轻描淡写,问题很快就会开始出现。

本系列文章主要针对Maven和Java EE新手 ,但如果您是高级开发人员,可以随时分享或用作演示。 我将在演示的基础上“攻击”我在日常工作中发现的一些实际问题,并尝试在提供基本解释或相关资源链接的同时提供解决方案。 请欢迎为可以以更简洁的方式执行/完成的操作添加评论,更正或参考。 学习Maven并创建“复杂”但易于维护的应用程序的最佳方法是从头开始创建空的pom文件。

我要传达给初级开发人员阅读我的文章的主要信息是, 研究”您的应用程序结构,询问底层构建工具是您工作的一部分,并且您永远不应以为其他方法总是会照顾您它 这也是挑战更艰巨的任务并提高您作为Java开发人员的技能的一步。

使用的核心技术

  • 基于Java EE 7的应用程序
  • 将包装为EAR
  • 将具有多个组件(wars,jars,ejb jars)
  • 将针对Java 7进行编译
  • 将使用Maven 3打包

我的演示耳应用

我的应用程序将是EAR ,对于这个特定的职位,该耳朵将包括2个顶级模块war和ejb-jar。 还有一个jar,其中将包含将成为我的数据库域模型(JPA实体)的类。 我将扩展结构,在以后的帖子中添加更多资源。 一个非常抽象的图像,仅用于提供一个想法,说明将“包含在我们的耳朵中”的内容。 将来的war模块将包含servlet或jsf组件,services模块将包含一组常见的无状态Sesson Bean(或消息驱动的Bean)。 域项目将具有用JPA 2构造正确注释的普通Java类。

CapturFiles_1

使用Maven构成我们应用程序的基本结构

为了让您耳目一新,我们需要使用Maven来定义模块和应用程序的各个部分,而Maven仍然是我们的构建/打包/配置工具。 这是最重要的步骤之一,如果您从一开始就掌握了这一步骤,那么其余的将只是简单的技术或特定的配置。 我要提出的并不是最终的解决方案,而是与标准非常接近的标准,这在大多数情况下是启动新应用程序的“ 路要走 ”,因此在这里没有有趣的细节,让我们遵循标准并开始在混凝土基础。

因此,让我们现在忘记上面的图片,让我们考虑一下Maven,可以定义哪些模块和多少模块,如何互连它们以及定义依赖项。 注意,我建议的工作方式是标准的,但不是最终的解决方案,这意味着您可以通过将应用程序打包成耳朵,定义更少的模块和依赖项来获得相同的结果。 假设我想涵盖高度复杂的结构,那么我将始终遵循标准来定义通用结构。

我假设您已经涵盖了Maven的一些基本知识,并且至少熟悉该术语。 如果没有在这里看看。

请记住,Maven即将按照正确定义的结构将文件放置在正确的位置,并定义maven插件,maven插件是用于完成特定工作的某种工具,包括编译,打包,复制文件等。 Maven,所以再次需要将插件定义到正确的位置并使用适当的配置。 您不是在编写make或ant脚本,而只是“插入”插件并要求Maven以明确定义的顺序执行它们。

作为我的好前同事(最近写了一封电子邮件), 打破生活和编码惯例是件好事,但绝不能使用Maven 。 他是对的!

如果不确定如何安装Maven,请在此处查看Windows或Mac

我的Maven项目结构–摘要

我们正在使用Maven进行构建,因此我们需要考虑Maven Pom和模块。 为了制作出所需的耳朵包装(见上文),我们需要5 poms

  • pom – 充当父母
  • 包含/定义最终耳朵的pom –负责配置最终程序包。
  • 一个包含/定义Web应用程序代码的pom,即我们的.war
  • 一个pom,它将包含/定义ejb-module的代码,ejb-module是我们要打包EJB的模块
  • 一个pom,它将包含将成为我们的JPA(数据库实体)的类

CapturFiles_4
如您所见,每个模块都有自己的pom,并且有父级,由于项目很小,假设他们不需要它,那么很多人都不会在其结构中添加东西。过了一会儿,当添加更多的模块时,您最终会陷入混乱。 因此,在此处记下“ parent pom真的很不错,可以进行配置 ”。 这是pom,您可以在其中定义所有依赖项版本(即库)并配置maven插件,以便所有子pom都继承通用配置。

我的Maven项目结构–父pom

正如我已经详细说明的那样,我们将从头开始,因此我将创建一个名为“ sample-parent ”的新文件夹,并在该文件夹中添加一个名为“ pom.xml ”的新文件。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>gr.javapapo</groupId><artifactId>sample-parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging></project>

是的,不要激动,只需在定义“ pom ”的包装元素上记下即可。parent被称为parent,因为它“定义”并管理子模块,这是在模块定义部分完成的。 我们原来的pom变成了这样的样子。 这意味着我们必须在sample-parent下创建相关文件夹,然后将pom.xml添加到每个文件夹中。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>gr.javapapo</groupId><artifactId>sample-parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><modules><module>sample-ear</module><module>sample-web</module><module>sample-services</module><module>sample-domain</module></modules></project>

让我们继续添加更多配置...

这是重要的部分,因为我们为

  • 我们将要使用和配置的Maven插件
  • 任何库–使用的依赖项以及其他模块的引用
  • 其他通用属性,例如我们将要编译的Java运行时的版本
  • 源文件或其他资产的默认编码。
<properties><!--  encoding--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--java version --><java-version>1.7</java-version><!-- plugin versions --><ejb-plugin-version>2.3</ejb-plugin-version><war-plugin-version>2.4</war-plugin-version><ear-plugin-version>2.9</ear-plugin-version><compiler-plugin-version>3.1</compiler-plugin-version><!-- dependency versions --><javaee-api-version>7.0</javaee-api-version><!-- EJB spec version --><ejb-spec-version>3.2</ejb-spec-version></properties>

让我们在属性部分之后添加另一个重要的部分,即dependencyManagement 。在这里,我们将定义可以在我们的应用程序模块中潜在使用的依赖关系及其版本。 在本节中,我们实际上关心版本,依赖项的包含或排除取决于子pom(这意味着它们不会自动添加)以及它们的范围。 因此, DependencyManagement部分是要控制的部分,版本集中在一处。

<dependencyManagement><dependencies><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>${javaee-api-version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit-version}</version></dependency></dependencies></dependencyManagement>

父pom中的另一个最后但很重要的部分与dependencyManagemt相似,称为pluginManagement ,这是我们将在应用程序配置和打包期间定义和参考的所有maven插件的版本和通用配置的部分。在下面的示例中,我定义了最基本的编译器插件之一,但是我当然需要更多!

<!-- Plugin management --><build><pluginManagement><plugins><!-- compiler plugin --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${compiler-plugin-version}</version><configuration><source>${java-version}</source><target>${java-version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin></plugins></pluginManagement></build>

让我们添加并配置一些稍后将要使用的插件。在“插件管理”部分中添加它们。 我们定义了将要编译并打包我们的ejb的ejb插件以及将要打包我们的war的war插件。

<!-- ejb plugin --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-ejb-plugin</artifactId><version>${ejb-plugin-version}</version><configuration><ejbVersion>${ejb-spec-version}</ejbVersion></configuration></plugin><!-- war plugin -skinny wars mode! --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>${war-plugin-version}</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml><packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest></archive><webResources><resource><filtering>true</filtering><directory>src/main/webapp</directory><includes><include>**/web.xml</include></includes></resource></webResources></configuration></plugin>

那是现在

您可以在此处下载我们的最小样本(标记post1,bitbucket)。 当时,我们似乎还没有完成任何工作,但是最终定义一个干净而具体的父pom将成为我们在后续职位中要做的其余工作的基础。

学习要点

  • Maven标准布局
  • 父pom
  • DependencyManagement和pluginManagement的重要性

资源资源

  • Maven3
  • Java EE 7教程
  • Maven项目结构
  • 父pom
  • 什么是依赖管理?
  • 什么是插件管理?
  • 您可以在此处下载以上代码。

翻译自: https://www.javacodegeeks.com/2014/04/java-ee7-and-maven-project-for-newbies-part-1-a-simple-maven-project-structure-the-parent-pom.html

java ee maven

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

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

相关文章

什么是SFP光模块?光模块知识介绍!

光模块(optical module)由光电子器件、功能电路和光接口等组成&#xff0c;光电子器件包括发射和接收两部分。简单的说&#xff0c;光模块的作用就是光电转换&#xff0c;发送端把电信号转换成光信号&#xff0c;通过光纤传送后&#xff0c;接收端再把光信号转换成电信号。常见…

中继(洪泛中继、定向中继)在无线通讯中的应用

无线中继&#xff0c;即中继节点在无线网络中起到中继的作用&#xff0c;能实现信号的中继和放大&#xff0c;从而延伸无线网络的覆盖范围。就中继的运行机制而言&#xff0c;中继可分为洪泛中继、定向中继。 洪泛中继&#xff0c;是指中继设备在任何时刻收到的任意数据包&…

Jakarta EE 8状态

遵循Jakarta EE的您可能知道即将发布的Jakarta EE 8在功能上将与Java EE 8等效。其原因是我们想证明从Oracle的传输是完整的&#xff0c;并且我们能够产生流程&#xff0c;规范&#xff0c;测试套件以及通过Eclipse Foundation的兼容实现。 到目前为止&#xff0c; Eclipse Gl…

光模块的正确安装方法和使用须知

光模块(optical module)由光电子器件、功能电路和光接口等组成&#xff0c;光电子器件包括发射和接收两部分。简单的说&#xff0c;光模块的作用就是光电转换&#xff0c;发送端把电信号转换成光信号&#xff0c;通过光纤传送后&#xff0c;接收端再把光信号转换成电信号。那么…

大功率无线数传设备不接天线有何影响?

从无线传输技术诞生以来&#xff0c;给人们也是带来了极大的方便&#xff0c;与此同时和无线设备密切和分不开的设备就是天线了。天线在无线设备中发挥了极大的作用。在以前的无线电台&#xff0c;在电影上面看过的都是很熟悉&#xff0c; 如图1.1所示&#xff0c;这种无线电台…

光模块该如何使用,光模块的使用方法介绍!

业内说的光模块&#xff0c;特指可热插拔的小型封装光模块&#xff0c;就是用在设备端口上的、可以在运行时进行热插拔的光模块&#xff0c;主要用来将设备&#xff08;一般指的是交换机或者路由器设备&#xff09;中的电信号转换成光信号。那么光模块该如何使用呢&#xff1f;…

CUBA 7的新功能

三年前&#xff0c;我们宣布了该框架的第二个公开可用的主要版本。 CUBA 6是改变游戏规则的版本–许可从专有转为Apache 2.0。 那些日子&#xff0c;我们甚至无法猜测从长远来看它将把框架带到哪里。 CUBA社区开始呈指数级增长&#xff0c;因此我们了解了开发人员如何使用框架的…

光模块功能失效的原因有哪些?

光模块主要用来将设备&#xff08;一般指的是交换机或者路由器设备&#xff09;中的电信号转换成光信号&#xff0c;然后通过一根光纤发射出去&#xff08;由光模块的发射端实现&#xff09;&#xff0c;同时可以接收外部一根光纤发射过来的光信号且转换成电信号&#xff08;通…

高速连传与LORA的区别和优势

高速连传电台&#xff0c;支持Modbus协议&#xff0c;超远距离&#xff0c;不限包长&#xff0c;不间断连续传输&#xff0c;实现低延迟/高响应的半双工通讯&#xff1b;多种功率可选&#xff0c;同时支持RS232与RS485接口&#xff0c;适合于&#xff1a;高速连续传输、工控Mod…

光模块兼容性介绍,如何测试兼容光模块的兼容性?

经常买光模块的人都知道&#xff0c;光纤模块通常需要确认兼容码&#xff0c;因为目前市面上存在2种&#xff0c;一种是高性能的兼容模块&#xff0c;一种是原交换机品牌光模块&#xff0c;两者之间的价格差距较大。接下来就由飞畅科技的小编来为大家介绍下光模块的兼容性&…

无线传感器网络详解

随着传感器技术、嵌入式技术、分布式信息处理技术和无线通信技术的发展&#xff0c;以大量的具有微处理能力的微型传感器节点组成的无线传感器网络(WSN)逐渐成为研究热点问题。 与传统无线通信网络Ad Hoc网络相比&#xff0c;WSN的自组织性、动态性、可靠性和以数据为中心等特点…

4G与5G网络有哪些区别

一、帧结构比较 4G和5G相同之处 帧和子帧长度均为&#xff1a;10ms和1ms。最小调度单位资源&#xff1a;RB4G和5G不同之处 1)&#xff1b;子载波宽度 4G&#xff1a;固定为15kHz。5G&#xff1a;多种选择&#xff0c;15kHz、30kHz、60kHz、120kHz、240kHz&#xff0c;且一个…

什么是SFP光模块?SFP光模块小知识介绍!

SFP光模块是SFP封装的热插拔小封装模块&#xff0c;目前最高速率可达10.3G&#xff0c;接口为LC。SFP光模块主要由激光器构成。SFP分类可分为速率分类、波长分类、模式分类。接下来就由飞畅科技的小编来为大家详细介绍下SFP光模块&#xff0c;一起来看看吧&#xff01; SFP是S…

无线通信模块

无线通信模块是各类智能终端得以接入物联网的信息入口。它是链接物联网感知层和网络层中的关键环节。目前在M2M的场景下&#xff0c;应用得更多的是蜂窝通信模块&#xff08;2G/3G/4G),未来 LPWAN 模块&#xff08;NB/IoT、 LoRa&#xff09;将快速的得到应用。根据GAMA&#x…

无线传感器主要应用领域及发展趋势

工业无线传感器网络产品为系统级产品&#xff0c;其包括了无线传感器、数据转发网关和监控主机等在内的整体解决方案。因其具有成本低、范围大、布置灵活、支持移动的特点&#xff0c;工业无线传感器网络产品在力学参数检测、工业监控、智能电力、矿山安全、医疗健康、环境监测…

哪些原因会导致rs485转换器信号受干扰?

485转换器主要的作用是将单端的RS-232信号转换为平衡差分的RS-485或RS-422信号。由于长距离信息传输、抗干扰能力强等原因&#xff0c;rs485转换器在安防通信等领域得到普遍的使用。但是&#xff0c;经常会有使用者遇到信号受到干扰的情况&#xff0c;那么&#xff0c;哪些原因…

无线传感器在智能家居中的应用

传统的传感器在智能家居领域的应用中任然还是存在着一定的局限性&#xff0c;与总线相连的传感器价格昂贵&#xff0c;传感器组网的开销成本巨大&#xff0c;在一些特殊的区域布线很困难&#xff0c;不同类型的传感器和控制系统的软硬件之间协议不兼容。 在此背景下&#xff0c…

光猫、路由器、交换机、wifi通俗释义

如今&#xff0c;网络已经进入了千家万户&#xff0c;上网已成为了我们生活中必不可少的事情。通常&#xff0c;在家里最常见的网络设备有&#xff1a;光猫&#xff08;光调制解调器&#xff09;、路由器、交换机、wifi&#xff0c;但很多小白用户并不能轻易区分它们。当遇上网…

物联网无线技术蓝牙和WiFi的区别有哪些?

在现在物联网井喷式发展的大环境下&#xff0c;联网设备的数量也越来越多&#xff0c;无缐通信技术在物联网中发挥的作用也越来越大。无线网络技术的发展正在不断的改变信息发送的方式&#xff0c;在任何时间、任何地点都能够无缝、自由地访问信息正在使设备和用户环境发生戏剧…

物联网的应用领域有哪些?

智能仓储 目前&#xff0c;国内最成熟的智能仓储解决方案智能仓储解决方案&#xff0c;智能仓储是物流过程的一个环节&#xff0c;智能仓储的应用&#xff0c;保证了货物仓库管理各个环节数据输入的速度和准确性&#xff0c;确保企业及时准确地掌握库存的真实数据&#xff0c;…