从开发角度看四类企业应用架构1: 通过Maven编译并运行一个Java应用

一、前言

本文仅代表作者的个人观点;本文在书写过程中,得到了同事kylin和shuli的指导,在此表示感谢;

本文的内容仅限于技术探讨,不能作为指导生产环境的素材;

本文素材是红帽公司产品技术和手册;

本文分为系列文章,将会有多篇,初步预计将会有9篇。

一、企业应用

企业应用程序的典型示例包括企业资源规划(ERP)、客户关系管理(CRM)、内容管理系统(CMS)、电子商务系统、互联网和内联网门户。

目前,大多数企业应用都是基于Java开发的。Java企业版(Java EE)是使用Java开发企业应用程序的规范。它是一个独立于平台的标准,是在Java Community Process(JCP)的指导下开发的。

Java EE企业应用程序的好处

与平台无关的应用程序可以开发并运行在许多不同类型的操作系统上(在小型PC和大型主机上)。

  • 由于Java EE标准,应用程序可以跨Java EE兼容应用程序服务器移植。
  • Java EE规范提供了大量通常由企业应用程序使用的API,例如Web服务,异步消息传递,事务,数据库连接,线程池,批处理实用程序和安全性。没有必要手动开发这些组件,从而缩短开发时间。
  • 针对特定领域(如金融,保险,电信和其他行业)的大量第三方即用型应用程序和组件已通过认证,可以运行并与Java EE应用程序服务器集成。
  • 大量先进的工具,如IDE,监控系统,企业应用程序集成(EAI)框架和性能测量工具可用于第三方供应商的Java EE应用程序。

接下来,我们简单看一下Java EE和Java SE的区别:

  • Java SE通常用于开发独立程序,工具和实用程序,这些程序,工具和实用程序主要是从命令行、GUI程序和需要作为守护程序运行的服务器进程运行的(也就是说,程序在后台连续运行直到它们被停止)。
  • Java EE规范是一组基于Java SE构建的API。它为运行多线程、事务、安全和可扩展的企业应用程序提供了运行时环境。需要注意的是,与Java SE不同,Java EE主要是API的一组标准规范,实现这些API的运行时环境通常称为应用程序服务器。也就是我们常说,传统意义上的中间件:app server。

Java EE包含对多个配置文件或API子集的支持。例如,Java EE 7规范定义了两个配置文件:完整配置文件和Web配置文件。

Java EE 7 Web配置文件专为Web应用程序开发而设计,并支持由Java EE 7相关的基于Web的技术定义的API的一部分。

Java EE 7完整配置文件包含由Java EE 7定义的所有API(包括Web配置文件中的所有项目)。在开发EJB【EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行】,消息传递应用程序和Web服务时(与Web应用程序相反),您应该使用完整的概要文件。

符合Java EE 7的应用程序服务器(例如Red Hat JBoss企业应用程序平台:EAP)实现了两个配置文件,并提供了许多在企业应用程序中常用的API,其中包括:

  • Batch API
  • Java API for JSON Processing (JSON-P)
  • Concurrency utilities
  • WebSocket API
  • Java Messaging Service (JMS)
  • Java Persistence API (JPA)
  • Java Connector Architecture (JCA)
  • Java API for RESTful web services (JAX-RS)
  • Java API for XML web services (JAX-WS)
  • Servlet API
  • Java Server Faces (JSF)
  • Java Server Pages (JSP)
  • Contexts and Dependency Injection (CDI)
  • Java Transaction API (JTA)
  • Enterprise Java Beans (EJB)
  • Bean Validation API

二、 Java SE和Java EE应用的构建、打包、部署

对于相对简单的独立Java SE应用程序,Java EE可以使用作为JDK一部分的编译器和运行时工具(java,javac,jar,jdb等)在命令行上构建,打包和运行代码。几个成熟的集成开发环境(IDE):如红帽JBoss开发人员工作室(JBDS)或Eclipse,用于简化构建和打包过程。

Java SE应用程序的首选方法是将应用程序打包为Java Archive(JAR)文件。 JAR文件可以通过向JAR文件添加清单条目(与JAR文件内部的Java类一起打包的纯文本文件)来指定主要可运行类,从而使其可执行。

Java EE应用程序由多个组件组成,这些组件依赖于运行时所需的大量JAR文件。 Java EE应用程序部署在与Java EE兼容的应用程序服务器上,这些部署可以有不同的类型:

  • JAR文件:应用程序的各个模块和Enterprise Java Beans(EJB)可以作为单独的JAR文件进行部署。第三方库和框架也打包为JAR文件。如果您的应用程序依赖于这些库,则库JAR文件应该部署在应用程序服务器上。 JAR文件具有.jar扩展名。
  • Web归档(WAR)文件:如果您的Java EE应用程序具有基于Web的前端或提供RESTful服务端点,则与Web前端和服务相关的代码和资产可以打包为WAR文件。 WAR文件具有.war扩展名,实质上是一个包含代码,静态HTML,图像,CSS和JS资产以及XML部署描述符文件以及打包在其中的相关JAR文件的压缩文件。
  • 企业归档(EAR)文件:EAR文件的扩展名为.ear,实质上是一个压缩文件,其中包含一个或多个WAR或JAR文件以及一些XML部署描述符。在应用程序包含多个WAR文件或跨模块重用一些常见JAR文件的情况下,它非常有用。在这种情况下,将应用程序部署和管理为单个可部署单元更容易。

使用如Apache Maven之类的构建工具来简化构建、打包、测试、执行和部署Java SE和Java EE应用程序也是最佳实践。 Maven有一个插件架构来扩展其核心功能。

有用于构建、打包和部署Java EE应用程序的Maven插件。所有部署类型都受支持。 Maven还可以在没有重新启动应用程序服务器的情况下,将应用程序部署到JBoss EAP和从JBoss EAP取消部署应用程序。 JBoss Developer Studio(JBDS)等集成开发环境(IDE)也默认支持Maven内置的本机支持。所有Maven任务都可以在JBDS内部运行,而无需使用命令行。

要运行仅使用Java SE API的独立应用程序(例如,打包为JAR文件的基于命令行的待办事项列表应用程序),可以使用java -jar命令:例如我们安装JBoss的IDE:

而基于Web的版本则部署到符合Java EE的应用程序服务器。 “待办事项列表应用程序”示例打包为部署到应用服务器(如EAP)的WAR文件。

如果已经部署了较旧版本的WAR文件,则旧版本会被取消部署,并且在不重新启动应用程序服务器的情况下部署新版本。 这样的过程称为热部署,在开发、测试以及生产部署期间广泛使用。

三、Java EE 7规范(JSR 342)

Java Community Process(JCP)是一个开放、参与式的过程,用于开发、维护和修改Java技术规范。 JCP与国际Java开发人员社区合作,促进了Java平台的发展。

任何个人或组织都可以加入JCP并参与标准化进程。 JCP使用Java Specification Requests(JSR)管理大量API的规范。

成员可以自由地为任何Java API提交JSR的提议。该提案由JCP执行委员会(EC)进行审核,该委员会由JCP成员选出的若干Java高级社区领导人组成。一旦批准,一个提案由JCP成员组成的一个专家组(EG)管理。

专家组负责在规范主管(SL)领导下定义,完成和维护API的规范。当JSR准备发布时,它被执行委员会批准并成为JCP标准。根据Java开发人员的需求和当前的技术趋势,每个JSR都可以逐步发展和完善。

构成Java EE 7规范的所有单独的API(本身在单独的JSR中进行管理)都是在JCP流程下开发的,并且由单独的专家组专门从事特定技术领域的单个JSR进行管理。

JCP与专家组合作,还负责发布技术兼容性工具包(TCK),这是一个用于验证实现是否符合规范的测试套件。例如,应用程序服务器只有在完全且完全通过Java EE 7 TCK时才被认为是“Java EE 7兼容”的,没有任何错误或故障。

三、多层应用体系架构

Java EE应用程序在设计时考虑了多层体系结构。该应用程序被分割成组件,每个组件都服务于特定的目的。每个组件都按逻辑排列在一个层中。某些层在单独的物理机器或服务器上运行。应用程序的业务逻辑可以在托管在一个数据中心中的应用程序服务器上运行,而数据库的实际数据可以存储在单独的服务器上。

使用分层体系结构的优势在于,随着应用程序扩展以处理越来越多的最终用户,每个层可以独立扩展以通过添加更多服务器(称为“扩展”)来处理增加的工作负载。另外还有一个额外的好处,即跨层的组件可以独立升级而不影响其他组件。

在经典的基于Web的Java EE应用程序体系结构中,共有四层:

客户端层:这通常是用于在最终用户机器上呈现用户界面的浏览器,或者嵌入在网页中的小程序(越来越少见)。

Web层:Web层组件在应用程序服务器内部运行,并生成可由客户端层中的组件呈现或使用的HTML或其他标记。此层还可以通过诸如简单对象访问协议(SOAP)或具象状态传输(REST)Web服务等协议为非交互式客户端(如其他企业系统(内部和外部))提供服务。

业务逻辑层:业务逻辑层中的组件包含应用程序的核心业务逻辑。这些通常是企业Java Bean(EJB),普通旧Java对象(POJO),实体Bean,消息驱动Bean和数据访问对象(DAO)的混合体,它们与持久性存储系统(如RDBMS,LDAP和其他。

企业信息系统(EIS)层:许多企业应用程序存储和处理组织内多个系统和应用程序使用的持久性数据。例如关系数据库管理系统(RDBMS),轻量级目录访问协议(LDAP)目录服务,NoSQL数据库,内存数据库,大型机或其他安全存储和管理组织数据的后端系统。

接下来,我们分别看一下常见的四类企业应用架构:

第一类:以Web为中心的架构

这种架构适用于基于浏览器的前端和由Servlets、Java Server Pages(JSP)或Java Server Faces(JSF)提供支持的简单后端的简单应用程序。 不使用诸如事务、异步消息传递和数据库访问等功能。

第二类:结合网络和业务逻辑组件的架构

在此体系结构中,客户端层中的浏览器与由Servlet、JSP或JSF页面组成的Web层进行交互,负责呈现用户界面、控制页面流和安全性。 核心业务逻辑托管在独立的业务逻辑层中,该层具有Java EE组件,如EJB、实体Bean(JPA)和消息驱动Bean(Message Driven Beans,MDB)。 业务逻辑层组件与企业信息系统集成,例如关系数据库和后台应用程序,这些应用程序公开用于管理持久数据的API,并为应用程序提供事务性功能。

第三类:B2B架构

在这种类型的体系结构中,前端通常不是由最终用户访问的交互式图形用户界面(GUI),而是与应用程序集成并使用互相理解的标准协议(例如Remote)交换数据的内部或外部系统 方法调用(RMI),HTTP,简单对象访问协议(SOAP)或具象状态传输(REST)。

第四类:Web服务应用程序架构

现代应用程序体系结构通常设计为基于Web服务。 在此体系结构中,应用程序提供了一个API,可通过基于HTTP的协议(如SOAP或REST)通过与应用程序的业务功能对应的一组服务(端点)进行访问。 这些服务由非交互式应用程序(可以是内部或第三方)或交互式HTML / JavaScript前端使用,如使用AngularJS,Backbone.js,React等框架。

四、Maven

目前开发、测试、构建、打包和部署Java SE和Java EE应用程序的最佳实践是使用Apache Maven。 Maven是一个项目管理工具,它使用声明性方法(在项目文件夹根目录下的一个名为pom.xml的XML文件中)来指定如何构建,打包,执行(对于Java SE应用程序)以及与依赖关系一起部署应用程序 信息。

Maven有一个小型核心,并有大量的插件来扩展核心功能,以提供如下功能:

  • 最终产品的预定义构建生命周期称为工件,如WAR,EAR和JAR。
  • 为每个构建内置最佳实践,例如源文件位置和运行单元测试。
  • 自动下载缺失依赖关系的依赖管理。
  • 广泛的插件集合,包括特定于JBoss开发和部署的插件。
  • 包括Javadocs在内的项目报告生成,测试覆盖率等等。

Maven项目文件开始被命名为pom.xml。 以下是项目pom.xml文件的缩写示例:

1.groupid就像一个Java包。

2. artifact-id是一个项目名称。

3.项目的版本。

4.包装定义了项目的包装方式。 在这种情况下,这是一种war类型。

5.依赖描述项目依赖的资源。 这些资源是正确构建和运行项目所必需的。 Maven从指定的存储库下载并链接依赖关系。

6.该项目的插件。

使用Maven的好处是自动处理源代码编译和资源包含在工件中。 Maven创建了一个标准的项目结构。 以下目录命名约定是必需要有的:

Asset

Directory

Outcome

Java Source Code

src/main/java

该目录包含用于WAR或JAR根目录的WEB-INF / classes中包含的Java类。

Configuration Files

src/main/resources

该目录包含WAR或JAR根目录的WEB-INF / classes中包含的配置文件。

Java Test Code

src/test/java

该目录包含测试源代码。

Test Configuration Files

src/test/resources

该目录包含测试资源。

当我们在pom.xml文件中命名依赖关系时,可以给它们一个范围。 这些范围控制构建生命周期中依赖项的使用位置,以及它们是否包含在构件中。 以下范围是最常见的:

Scope

Outcome

compile

如果没有指定其他作用域并且需要解析import语句,则编译是默认作用域。

test

编译和运行单元测试需要测试。 它不包含在artifact.中。

runtime

编译时不需要运行时依赖关系。 它用于任何执行并包含在artifact中。

provided

提供的范围就像编译和容器在运行时提供的依赖关系。 它在构建和测试过程中使用。

maven的常用命令如下:

  • mvn package -编译\、测试、构建artifact。
  • mvn package -Dmaven.test.skip=true - 构建artifact并跳过所有测试。
  • mvn jboss-as:deploy - 将artifact部署到在$ JBOSS_HOME上运行的实例(假定在pom.xml中配置了插件)。
  • mvn install -这就将artifact安装在本地Maven存储库中,以用作其他项目的依赖项的包。

要构建、打包和运行仅使用Java SE API的独立应用程序(例如使用Maven的基于命令行的待办事项列表应用程序),可以使用如下命令:

mvn clean package

java -jar target/todojse-1.0.jar

mvn clean package wildfly:deploy

mvn clean package命令将应用程序构建为可执行JAR文件,并由java -jar命令执行。

使用以下命令构建基于Web的应用程序并将其部署到JBoss EAP:

mvn clean package wildfly:deploy

以上命令将删除旧的WAR文件,编译代码并构建部署到正在运行的EAP实例的WAR文件。 如果已经部署了较早版本的应用程序,则旧版本会被取消部署,并且在不重新启动应用程序服务器的情况下部署新版本。 这个过程称为热部署,在开发和测试以及生产部署期间广泛使用。

红帽有自己的maven repo:

https://maven.repository.redhat.com/earlyaccess/all/,可以被访问;

公网最大的maven repo:

https://repo.maven.apache.org/maven2/

我们可以定义maven repo的地址,在配置文件中:

查看settings.xml配置文件:

五、实验展示

我们使用jboss的开发工具:

选择import:查看可以导入文件的类型:

选择已经存在的maven项目:

开始导入maven project:

导入成功:

浏览pom.xml文件:

可以看到:Group Id, Artifact Id 和 the Version。此项目的包装格式为jar。 Maven确保在构建项目时,将生成一个带有适当MANIFEST条目的JAR文件,其中包含有关该jar文件的元数据。

单击“Dependencies”选项以查看项目的依赖关系(该项目依赖的库,框架和模块),里面是空的,说明在这种情况下,我们不依赖任何外部库,只使用Java标准库。

该项目与JDK 1.8兼容。

Maven可以通过使用大量的插件来进行扩展。我们可以通过声明适当的插件来控制项目的构建、打包、测试和部署方式。

在这个项目中,使用exec-maven-plugin从命令行或从JBoss Developer Studio中运行项目中的主类。 作为应用程序运行入口点的主要方法被声明为com.redhat.training.TestTodoMap类。

<artifactId>exec-maven-plugin</artifactId>

<version>1.5.0</version>

<executions>

<execution>

<goals>

<goal>java</goal>

</goals>

</execution>

</executions>

<configuration>

<mainClass>com.redhat.training.TestTodoMap</mainClass>

</configuration>

可以使用maven-assembly-plugin构建独立于平台的可执行JAR文件,该文件可以使用java -jar命令运行。 尽管此项目不使用任何外部依赖项,但具有大量依赖JAR文件的项目可以打包为单个大型的fat jar文件,可以直接执行,而无需将所有相关的JAR文件明确添加到CLASSPATH

<artifactId>maven-assembly-plugin</artifactId>

<version>2.6</version>

<executions>

<execution>

<id>package-jar-with-dependencies</id>

<phase>package</phase>

<goals>

<goal>single</goal>

</goals>

接下来,我们查看应用的源代码:

TodoMap.java

todojse应用程序是一个没有图形用户界面的命令行应用程序。 主要方法调用executeMenu()函数,该函数使用多个选项来管理待办事项列表,向用户显示一个菜单。

TodoMap.java类包含此应用程序的主要业务逻辑。该类存储和管理TodoItem对象的Map。 TodoItem类是一个简单的Java Bean类,它封装待办事项列表的属性; 即包含任务描述的项目字段、和指示任务是否正在等待或完成的状态字段。

在下面的源码中,重点查看TodoMap类中的addTodo()、printTodo()、completeTodo()、deleteTodo()和findItemTodo()方法的源代码,以便我们解如何分别创建、列出、标记为完成、删除和找到任务。

Status.java文件用一个项目状态的两个选项(PENDING或COMPLETED)声明一个枚举。

使用Maven从命令行构建并运行todojse:

确认可以看到来自Maven的BUILD SUCCESS消息,并且todojse-1.0.jar已成功构建并复制到todojse/target文件夹。

接下来,运行应用:

运行起来以后:

我们还可以直接运行编译好的jar包:

我们也可以直接在JBoss的IDE上编译:

点击 Apply、Run Configurations

我们看到:JBDS Maven插件现在应该启动构建、打包并执行应用程序。

截止到目前,一个java应用通过Maven编译打包、运行成功。

魏新宇

  • "大魏分享"运营者、红帽资深解决方案架构师
  • 专注开源云计算、容器及自动化运维在金融行业的推广
  • 拥有MBA、ITIL V3、Cobit5、C-STAR、TOGAF9.1(鉴定级)等管理认证。
  • 拥有红帽RHCE/RHCA、VMware VCP-DCV、VCP-DT、VCP-Network、VCP-Cloud、AIX、HPUX等技术认证。

原文发布于微信公众号 - 大魏分享(david-share)

原文发表时间:2018-06-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏屈定‘s Blog

工作--JWT实战总结

公司的登录模块也从Session切换到JWT挺长一段时间了,抽时间来总结一下遇到的问题以及解决方案.

1304
来自专栏zhisheng

日志工具现状调研

  针对这类问题,对当前java比较流行的一些日志工具进行了调研,以期能够在未来的开发使用中做到全组代码风格统一,日志写得好对于我们开发调试,线上问题追踪等都有...

942
来自专栏Ceph对象存储方案

RGW endpoint绑定多域名

参考:https://github.com/ceph/ceph/blob/d038e1da7a6c9b31ba4463b8ebedb9908981a55e/do...

662
来自专栏张善友的专栏

负载均衡环境下缓存处理

深入学习Enterprise Library for .NET Framework 2.0的Cache机制——分析篇, 这篇文章介绍了很多Caching方面的...

1865
来自专栏SDNLAB

SDN实战团分享(二十一):ONOS开发实战之OVS Manager(Bootcamp 2016)

Agenda: 1.ONOS整体架构简介、ONOS子系统架构简介 2.App应用代码框架、运行机制简介 3.OVS Manager需求及技术分析 4.OVS ...

4709
来自专栏pangguoming

Comet:基于 HTTP 长连接的“服务器推”技术

基于客户端套接口的“服务器推”技术 Flash XMLSocket 如果 Web 应用的用户接受应用只有在安装了 Flash 播放器才能正常运行, 那么使用 ...

3757
来自专栏IT派

Python 新功能:或将允许安全工具查看运行时操作

针对 Python 编程语言的新功能提议之一是希望为运行时添加“透明度”,并让安全和审计工具查看 Python 何时可能运行潜在危险的操作。

842
来自专栏技术博文

H5缓存机制浅析

1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性。离线存储(也可称为缓存机制)是其中一个非常重要的特性。H5 引入的离...

3098
来自专栏Java成神之路

Comet:基于 HTTP 长连接的“服务器推”技术

很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。本文首先介绍、比较了常用的 “服务器推”方案,着...

863
来自专栏水击三千

Arcgis Runtime sdk for android 授权

要下载和安装 ArcGISRuntime SDK for Android,您需要注册开发者账户,进而便拥有了访问所有功能的权限,从而实现开发和测试目的。但是,这...

2849

扫码关注云+社区