2 月份,IBM 在 Java 领域的 CTO John Duimovich 先生参加了一次座谈会,会中他和与会人员一起讨论了 Java 这门编程语言除了版本升级(Java 9、Java 10)之外的动向,并且分享了 IBM 的一些研究内容。读完这篇文章后,我觉得有必要针对他提出的各点进行深入讨论,也想谈谈自己对于 Java9 的理解。
Duimovich 先生列举的内容主要包括以下几点:
1、Oracle 公司决定将 Java EE 的管理权移交至 Eclipse Foundation;
2、Kotlin、Scala 等语言会尽快被纳入到 Java EE;
3、对于容器应用而言,VM 的启动时间太长了,IBM 进行了优化;
4、JIT 编译器独立作为服务,从 JVM 里移除出去。
本文,我想就 Duimovich 先生提及的 Java EE、函数式语言、VM 启动时间优化、JIT 编译器改变、Java 新版本设计思路等谈谈自己的理解。
关于 JavaEE
我们先来聊聊 Java EE 移交这个事的看法,对于一般开发者而言,由于 Eclipse Foundation 组织更加贴近于开发人员,所以移交至 Eclipse Foundation 很有可能起正面作用,这一变化有可能会加速新特性的开发节奏,也会有利于响应用户需求,毕竟民间组织没有那么官僚,在 Spring 生态系统的强大冲击下,捐赠给更具活力的组织运营,也许是 Java EE 的一线生机吧。
之前聊聊架构也有聊过这个话题,这里不再赘述。
Duimovich 先生认为企业级 Java 可能在 IoT 应用场景下会有施展空间。毕竟,相对于 Web 而言,IoT 还是蓝海市场。
之前阮一峰在其微博上发过一张图,我想也可以看出这几年 Web 的发展趋势。可以说,大概从 2012 年开始,全球的网站数量已经停止增长了。
函数式语言
Scala、Kotlin 这些函数式语言会优于 Java 的原因可能有四点:
开发和部署时间较短;
整体代码行数少;
第三方依赖库少;
内置的异步线程和无阻塞 IO。
回到主题,Kotlin 会和 Java EE 完全整合,这是因为 Kotlin 和 Java 语言的集成很好,而对于如何与 Java EE 集成,我们来看一个示例。
示例程序由 EJB、JAX-RS 资源、测试程序、Gradle 脚本所组成。首先构建一个无状态会话 bean,仅包含一个“sayHello”方法,返回一个字符串,代码如下所示:
@Stateless
class HelloBean {
fun sayHello(caller: String) = "Hello, $caller"
}
接下来构建 JAX-RS 源,类 HelloResource 有一个属性 helloBean,这种方式使用了 CDI 特性完成构造器注入,用于获取针对 HelloBean EJB 的应用。JAX-RS 资源定义了一个单独方法响应 HTTP 的 GET 请求。
@Path("/hello")
class HelloResource @Inject constructor(val helloBean: HelloBean) {
@GET
@Path("/")
fun get(@PathParam("caller") caller: String) = helloBean.sayHello(caller)
}
接下来是在 Arquillian 测试平台上集成 EJB 进行测试的代码,通过 @Test 注解在应用程序服务上运行测试用例。
@RunWith(Arquillian::class)
class HelloBeanIntegrationTests {
@Inject
lateinit var helloBean: HelloBean
@Test
fun sayHello_whenInvokedWithDuke_thenReturnsHelloDuke() {
// Given
val caller = "Duke"
// When
val message = helloBean.sayHello(caller)
// Then
assertEquals("Hello, Duke", message)
}
}
JAX-RS 资源的客户端代码如下所示,这个测试是一个 Arquillian 客户端测试,通过
@RunAsClient 注解强制执行测试方法。
@RunWith(Arquillian::class)
class HelloResourceIntegrationTests {
@ArquillianResource
lateinit var url: URI
@Test @RunAsClient
fun get_whenInvokedWithDuke_thenReturnsHelloDuke() {
// Given
val caller = "Duke"
// When
val message = ClientBuilder.newClient().target(url)
.path("/api/hello/$caller")
.request()
.get(String::class.java)
// Then
assertEquals("Hello, Duke", message)
}
}
最后是编写 Gradle 脚本,这样我们就可以通过 Gradle 的“kotlin”插件完成 Kotlin 源代码的编译。以下代码仅是部分代码,确保可以在 Arquillian 平台上运行测试。
test {
environment 'JBOSS_HOME', rootProject.wildflyHome
systemProperty 'java.util.logging.manager', 'org.jboss.logmanager.LogManager'
}
task unzipWildFlyAppServer(type: Copy) {
from zipTree(configurations.install.singleFile)
into file("$/unpacked/dist")
tasks.test.dependsOn unzipWildFlyAppServer
}
发个小广告!!!走过路过,不要错过!新书来啦!!!
注:本公众号与当当店铺并无从属关系,仅为大家提供一个便捷购物地址。若有所冲突,纯属巧合,立删。
麦克叔叔每晚十点说
领取专属 10元无门槛券
私享最新 技术干货