原创 2017-03-06 Charles Humble 聊聊架构
作者|Charles Humble编辑|薛命灯

作为InfoQ下一年编辑关注点审核工作的一部分,我们挑选了Java作为深入探讨的主题。我们借用了Geoffrey Moore在他的经典书籍《跨越鸿沟》里的所描述的模型,这个模型贴切地概括了技术的生命周期,它包含五个阶段:创新者(Innovators)、早期采用者(Early Adopters)、早期大众(Early Majority)、后期大众(Late Majority)和落后者(Laggards)。Moore的模型在早期采用者和早期大众两个阶段之间引入了一个大缺口,早期采用者是真正愿意冒着风险使用新技术的人,而早期大众在确认新技术能够提升生产效率之前是不会采取行动的。

从下图可以看出Java技术的整体趋势:

我们可以看到,Java SE仍然保持着它的健康度,它仍然是一个被广泛使用的企业计算编程语言。Java 9有望在今年夏天发布,届时将带来Jigsaw和JShell REPL。而Java 10的开发工作已经在进行当中。我们相信Java仍然是构建大规模企业应用的一个很好的选择,最起码现在人们不希望Java走出生产环境。

说到基于JVM的编程语言,不得不提到Scala和Clojure。不过从Scala的受欢迎程度来看,它的采用率或许已经达到了最顶峰。而在Java 8推出Lambda功能时,Scala的受欢迎程度有轻微的下降。我们认为Scala还未能跨越Moore模型里的“鸿沟”,所以它仍然处在早期采用者阶段。我们不认为它会达到大众阶段。

Clojure一如既往的好,作为Python的有力竞争者,面向数据的特性让它处在一个很有利的位置上,不过它不像是一门会被广泛采用的语言。

作为Java之外的选择,Groovy仍然是很受欢迎的脚本语言,同时,JetBrain的Kotlin似乎在Android开发方面为自己找到了一个稳固的位置,不过这两门语言都无法动摇Java的统治地位。

可以说,Java SE形势一片大好,但对于Java EE来说却不是如此。我们在考虑要不要把Java EE放入“落后者”这一类,不过最近的一些迹象表明,它应该可以被放在后期大众里,这要归功于Java EE底层的那些技术。jClarity的联合创始人Ben Evans,同时也是InfoQ的编辑,他说:

我不得不说,Java EE是一个正在消褪的品牌,不过它的底层核心技术让情况看上去没有那么糟糕。

另一位编辑Chris Swan,同时也是CSC的CTO,他说:

Java EE有一些重要的规范,它们很有用。EJB作为Java EE的心脏,它把Java应用服务器推向了企业。Spring去掉了EJB的复杂性,“EE”变成了“在Java应用服务器上运行Spring”的代名词。传统的应用服务器市场(由几个大厂商所统治)正在被PaaS所代替(因为你不需要整套臃肿的应用服务器就能运行Spring应用),而企业对服务器厂商的“绑架”行为深感厌恶,同时PaaS提供商提供了更具竞争力的运营能力,从而加剧了这种情况的发生。

InfoQ之前报道过Gartner对技术走势的研究,Gartner在这方面比我们做得更为深入,而最近Gartner再次发表其观点,认为“Java EE和其它三层架构的框架,比如ASP.NET”正在走向衰退:

数字信息业务要求应用平台提供新的特性和能力,而Java EE没能赶上这趟班车。

负责应用基础设施现代化的领导者们应该想办法应对Java EE的衰退问题。

到2019年,只有不到35%的新应用会被部署在Java EE应用服务器上。

不到35%,也就是差不多三分之一,不过我们认为尽管Java EE应用服务器还会存在,但只会被用于运行遗留的系统。

不过对于Java来说,还是有一些好消息的。一些强有力的框架为构建微服务提供了更多的选择,Pivotal在这方面一路领先,它为微服务提供了一整个技术栈。Spring Boot内嵌了Tomcat、Jetty或Undertow,可以方便快速地用它来构建独立运行的Spring应用。Spring Cloud由美国的Netflix和中国的阿里巴巴共同支持,为Spring Boot加入了很多强大的云组件,比如服务发现、外部配置、回路断路器和负载均衡。Pivotal Cloud Foundry、IBM的Bluemix和SAP的HANA为此提供了商业支持。

除此之外,还有很多其他的可选方案。其中有三个值得关注,它们分别是Lightbend的Lagom、Eclipse Vert.x和Ratpack,其中Lagom是基于Play和Akka的。而Akka所使用的actor模型也非常有意思。

我们注意到,Oracle曾经声称要在今年的Java EE 8里将Java EE带入云端,并具备基本的微服务能力,不过Oracle并未透露更多相关细节。Java EE 9有望在2019发布,不知道在未来的这一两年,Java世界能否发生一些不一样的变化。

MicroProfile.io最近加入了Eclipse Foundation,广大的Java EE社区把工作转向了MicroProfile.io。

以上观点并不代表我们将对Java EE开发失去兴趣,或者说它将会消失。我们只是认为,对于构建现代化的系统,我们总是会有更好的选择。

InfoQ观察:Java EE的未来的更多相关文章

  1. Java EE的未来

    http://www.infoq.com/cn/articles/enterprise-Java-opinion 作为InfoQ下一年编辑关注点审核工作的一部分,我们挑选了Java作为深入探讨的主题. ...

  2. Oracle居然把Java EE的未来押在Rest API上了

        然而Lehman并不赞同Rahman对Java EE 9的说法,所以他重申Oracle暂时专注于Java EE 8."我们正在倾全力推出EE 8,现在这是我们主要的关注点," ...

  3. Java EE中的容器和注入分析,历史与未来

    Java EE中的容器和注入分析,历史与未来 java中的容器 java中的注入 容器和注入的历史和展望 一.java中的容器 java EE中的注入,使我们定义的对象能够获取对资源和其他依赖项的引用 ...

  4. 影响Java EE性能的十大问题(转)

    本文作者是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE.中间件和JVM技术.他在性能优化和提升方面也有很深刻的见解,下面他将和大家分享一下常见的10个影响Java EE性能问题 ...

  5. 转:Red Hat JBoss团队发布WildFly 8,全面支持Java EE 7并包含全新的嵌入式Web服务器

    原文来自于:http://www.infoq.com/cn/news/2014/02/wildfly8-launch Red Hat的JBoss部门今天宣布WildFly 8正式发布.其前身是JBos ...

  6. 2016年会成为Java EE微服务年吗?

    原文  http://www.infoq.com/cn/news/2016/02/javaee-microservices 进入2016年时间还不是很长,让我们回顾下去年年底的一个预言.去年12月,来 ...

  7. java EE中的hello1.java及Annotation(注解)

    一.Annotation(注解) 注解(Annotation)很重要,未来的开发模式都需要注解,注解是java.lang.annotation包,Annotation是从java5引入的,它提供一些不 ...

  8. Java EE开发技术课程

    新的学期开始了,j2e已经上了两节课,接下来就是对该课程的一些作业以及相关的认识: 一.课程目标: Java EE是java的企业级应用,所以在我看来在学习这门课程之前肯定要对java有一个具体的认识 ...

  9. Java EE 8 来了

      作者 李士窑 发布于 2014年9月2日. 估计阅读时间: 不到一分钟 | 自2013年6月Java EE 7发布以来,Java开发团队在这段时间内一直在规划和搜集下一个大版本Java EE 8带 ...

随机推荐

  1. oracle 切换用户操作--or--sys用户密码忘记

    1.sqlplus中以普通用户登录oracle后, 普通用户的登录方式: sqlplus /nolog conn 用户名/密码@IP地址/orcl:1521; 这个时候,想要切换sys用户,conn ...

  2. MySQL数据导入到Mongo

    背景:如题干所述,需要将一份数据导入到mongo数据库,减少项目依赖的数据源. 解决方案: 使用mongo自带的mongoimport工具. 首先在test库里创建一个空集合:[import_test ...

  3. 基于sql service会话共享,实现SSO

    1:session的存储基于sql service数据库来存储 2:修改sql service中会话管理的系统存储过程 3:实现几个站点的会话共享 4:应用共享会话,实现单点登录

  4. tomcat如何正确的开启远程调试功能

    在日常开发中,有时需要对远程服务器上的应用进行远程调试,对于tomcat,要进行远程调试其实很简单,只需要在启动tomcat时开启jpda服务即可. 什么是JPDA呢? JPDA(JavaPlatfo ...

  5. 优先队列/oriority queue 之最大优先队列的实现

    优先队列(priority queue)是一种用来维护一组数据集合S的数据结构.每一个元素都有一个相关的值,被称为关键字key. 这里以实现最大优先队列为例子 最大优先队列支持的操作如下:INSERT ...

  6. 结构体访问成员变量什么时候该用“->”或者是"."呢?的困惑

    煎蛋栗子: typedef struct Node{int data;struct Node *next;}LinkList; LinkList *p=(LinkList *)malloc(sizeo ...

  7. 编译centos6.5:glibc 升级2.14问题

    第一种:不需要 ln 创建软连接,缺点嘛,就是直接安装到系统文件夹/lib64下,想换回来就比较麻烦.(我选择的第二种,因为公司需要fpm打包,写到脚本里面,第一种之间安装在/usr目录下,打包的包安 ...

  8. java.util.ServiceLoader的用法

    在很多开源组件里经常会看到java.util.ServiceLoader的使用,这里给大家介绍下怎么通过ServiceLoader找到一个接口的所有实现类. 我们新建一个接口Hello public ...

  9. 搭建laravel到nginx

    一.laravel的安装 搭建的第一步当然是安装好laravel,这里推介composer安装,由于国内的问题,极其推介使用国内的镜像去搭建,我在终端里本已经设置好常规的https和http之类的FQ ...

  10. apk的php解析

    <?php/****************************************************** * Android APK File Parser * Author: ...