JavaOne 2015:高级模块化开发

JavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的,并且充满了宝贵的信息,我敦促每个Java开发人员都注意它们。

除此之外,我想给社区一种搜索和引用它们的方法,因此我在这里总结一下:

  • 准备JDK 9
  • 模块化开发简介
  • 先进的模块化开发
  • 拼图项目的幕后花絮(即将上映)

我努力链接到尽可能多的外部资源,以使各个帖子简短。 播放图标将带您直接进入Oracle每天为每个房间在线播放的长达十小时的视频流中的相应点。 (很棒的格式,伙计们!)(到目前为止)他们不仅弄乱了声音,而且似乎还诉诸于低音量的单声道声音,因此请确保提高音量。

让我们在介绍的基础上提供一些高级模块化开发和迁移建议!

总览

  • 内容 :如何将应用程序和库迁移到模块系统
  • 演讲者 :马克·莱因霍尔德,亚历克斯·巴克利,艾伦·贝特曼
  • 链接 : 视频和幻灯片

引言

马克·雷因霍尔德(Mark Reinhold)首先强调当前的原型仍在开发中,该提案存在一些粗糙的边缘和缺失的部分。 拼图团队花费大量时间谈论它的原因是为了传播信息并收集反馈。

因此,请尝试并提供反馈!

应用程序迁移

版权所有©2015,Oracle和/或其分支机构。版权所有。

版权所有©2015,Oracle和/或其分支机构。
版权所有。

在演讲的第一部分中,Alex Buckley介绍了如何将应用程序迁移到模块系统。 他在假设应用程序的依赖项尚未发布为模块的情况下对此进行了讨论。 (因为如果是这样,这将非常简单直接。)

自上而下的迁移

每当将JAR转换为模块时,都必须回答两个问题:

  • 该模块需要什么?
  • 模块输出什么?

可以在jdeps的帮助下回答第一个问题。 第二个要求模块的作者有意识地决定哪些包包含其公共API。

然后,必须按照模块化开发简介和快速入门指南中的说明将这两个答案都输入到module-info.java中。

自动模块

Buckley现在解决了他的示例的一个内在问题:如何处理尚未发布为模块的应用程序依赖项? 解决方案是自动模块

版权所有©2015,Oracle和/或其分支机构。版权所有。

版权所有©2015,Oracle和/或其分支机构。
版权所有。

只需将JAR放置在模块路径而不是类路径上,它便成为自动模块。 这是一个完整的模块,但不需要更改JAR本身。 它的名称是从JAR名称派生的,并导出所有包。 它可以读取模块路径上的所有模块(通过隐式要求所有模块) 类路径上的所有类。

这为迁移JAR文件提供了最大的兼容性。

系统结构

即使使用了一些自动模块,它们在模块路径上增加了很多优势,但情况还是比类路径要好。 那里的所有内容都可以访问其他所有内容,JVM只是删除了开发人员设想的任何系统结构。

编译并运行示例

该示例已编译并使用快速入门指南中涵盖的命令运行。

Buckley还演示了javac标志-modulesourcepath来启用多模块编译 。 它需要一个目录,并且期望每个模块包含一个子目录。 然后,每个模块目录都可以包含构建模块所需的源文件和其他资源。 这对应于JEP 201和

摘要

对于自上而下的迁移,可通过为应用程序的JAR创建module-info.java文件将其转换为模块。 通过将依赖项放在模块路径而不是类路径上,它们将变成自动模块。

图书馆迁移

艾伦·贝特曼(Alan Bateman)从不同的角度看待同一场景。 他正在展示如何将库转换为模块,而无需应用程序使用它们来完成。

自下而上的迁移

对于库,需要回答与应用程序模块相同的问题:

  • 该模块需要什么?
  • 模块输出什么?

再次, jdeps被带出回答第一个。 但是,这里的Bateman还演示了如何使用-genmoduleinfo标志生成module-info.java文件的初稿。 在这种模式下, jdeps从JAR名称中获取模块名称,需要正确的依赖关系,并简单地导出所有软件包。 然后,模块作者应确定要导出的出口。

然后,Bateman像上面和快速入门指南中所述编译和打包模块。

混合类路径和模块路径

该应用程序尚未转换为模块,这有两个含义:

版权所有©2015,Oracle和/或其分支机构。版权所有。

版权所有©2015,Oracle和/或其分支机构。
版权所有。

  • 运行它既需要类路径又需要模块路径。
  • 该应用程序无法表示它依赖哪个模块。

在命令行上混合类和模块路径是冗长但直接的。 最重要的是,必须使用-addmods标志来指定模块系统必须根据其解析模块路径的根模块。 在正在运行的示例中,这将是新转换的库模块。

高级迁移挑战

在给出的示例中,新创建的库模块之一使用反射来访问应用程序的代码。 这是有问题的,因为模块只能从它们所依赖的模块访问代码,而显然库不能依赖于使用它们的应用程序。

解决方案是对新类java.lang.Module的addReads 。 它可用于允许调用方法的模块读取指定的模块。 要获取模块,请调用Class.getModule()。

全部放在一起

版权所有©2015,Oracle和/或其分支机构。版权所有。

版权所有©2015,Oracle和/或其分支机构。
版权所有。

将这两种方法放在一起会产生一个不错的依赖关系图和超短命令来启动应用程序。

然后Bateman继续使用jlink将生成的应用程序打包到带有jlink的最小独立运行时映像中,如模块化开发简介中所述 。

摘要

总之,这两种方法显示了应用程序和库维护者如何按照自己的步调独立地模块化他们的项目。 但是请注意,可能需要更改一些代码。

继续进行模块化!

由Joe Parks在CC-BY-NC 2.0下发布。

由Joe Parks在CC-BY-NC 2.0下发布 。

问题

绝大多数问题都很有趣,所以我们开始吧。

有人可以覆盖您的安全软件包吗?

拼图团队正在制作可选验证步骤的原型。 在构建时,它将计算模块的强哈希并将其烘烤到模块中。 然后它将在启动时验证哈希。

是否可以访问未导出的类型?

不是来自代码。 如果某些类型必须以这种方式可用(例如,用于依赖项注入框架),则必须将其导出。 故意没有办法用反射破坏模块封装。

但是可以使用命令行标志-XaddExports,如JEP 261中的 “破坏封装”一节中所述。

拼图与OSGi兼容吗?

不,但是OSGi将在其之上运行。

模块可以包含DLL,SO吗?

JNI的工作原理与以前完全相同,模块可以包含各种资源,包括特定于OS的库。

为什么在module-info.java中未指定主类?

因为对于编译器和JVM而言,它不是必不可少的信息。 实际上,它甚至不是程序的必要属性,因为对于同一项目版本的不同部署,它可能会更改。

如何表达对未模块化JAR的依赖性?

该库可以要求其依赖关系,如上所示。 如果尚未将其模块化,则文档应提及仍然必须将它们添加到模块路径(与类路径相对)。 然后将它们转换为自动模块,从而使它们可用于库。 当然,类路径仍然是出口,并且库始终可以放在此处,并且所有内容都像以前一样工作。

另外,如果项目之间的协作受到限制,Buckley建议使用反思。 然后,该库将不必要求其依赖关系,而是在运行时开始读取它,而不管它是放在类还是模块路径上。

那么像Maven这样的工具呢?

拼图团队希望与所有工具供应商合作以提供支持,但目前尚无计划,因为它还为时过早。

Buckley试图通过将模块系统并入工具中作为一个分布式问题来描述来管理期望。 Java 9发行版不应被视为所有事物必须完美协作的起点,而应被视为使一切相互协作的起点。

那(上下文)类加载器呢?

该模块系统几乎与类装载机正交,并且应该没有问题的相互作用。 加载程序被描述为低级机制,而模块则是更高的抽象。

有关更多详细信息,请等待Jigsaw项目幕后的概览。

是否可以将多个模块打包到一个JAR中?

或者换句话说,是否有可能构建包含多个模块(通常是其所有依赖项)的fat / uber JAR?

目前尚不支持,但是创建映像可能是某些用例的解决方案。 由于这个问题反复出现,Reinhold承诺会考虑一下。

翻译自: https://www.javacodegeeks.com/2016/01/javaone-2015-advanced-modular-development.html

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

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

相关文章

action怎么获得 ajax date参数_ajax()gt;load()事件的新用法!!!

load()函数用于从服务器加载数据,并使用返回的html内容替换当前匹配元素的内容。load()函数默认使用GET方式,如果提供了对象形式的数据,则自动转为POST方式。load()函数只会替换每个匹配元素的内部内容(innerHTML)。你还可以在URL字符串后面追…

无显示器u盘安装centos_最新版 CentOS 8.1.1911 安装教程及常见问题图文详解

基于笔记本(华硕)操作,使用软碟通(UltraISO)制作的系统启动盘(U盘,内存大于8G)操作可自行百度,非常简单(或可留言,择情况出一期U盘制作启动盘教程)。a、登录 centos 官网下载镜像文件官网地址:https://www.centos.org阿…

bom实现方块移动_从0开始实现一个俄罗斯方块

写在前面得话:这篇文章主要记录了我是怎么一步一步写出俄罗斯方块,整个代码用的函数编程,主要是为了让一些不熟悉es6, 面向对象写法得 新手能更容易看明白,全部得代码中都是一些js的基础知识,很容易理解。要说有点麻烦…

cli3解决 ie11语法错误 vue_基于 Vue + Koa2 + MongoDB + Redis 实现一个完整的登录注册...

项目地址:https://github.com/caochangkui/vue-element-responsive-demo/tree/login-register通过 vue-cli3.0 Element 构建项目前端,Node.js Koa2 MongoDB Redis 实现数据库和接口设计,包括邮箱验证码、用户注册、用户登录、查看删除用户…

gwt 嵌入html_GWT和HTML5画布演示

gwt 嵌入html这是我对GWT和HTML5 Canvas的第一个实验。 我的第一个尝试是创建矩形,仅用几行代码就得出了这样的内容: 码: public class GwtHtml5 implements EntryPoint {static final String canvasHolderId "canvasholder";sta…

tez什么意思_传统数仓和大数据数仓的区别是什么?

概念与容器为什么先说这个,其实很简单:因为绝大多数人都把这两个概念混为一谈。然后就会出现各种各样的问题:oracle不是数据库么,怎么又是数据仓库?Hive不是数据仓库么?怎么又是数据库?数据仓库…

华为M2平板打不开云课堂_能运行PC应用的安卓生产力平板:华为MatePad Pro 5G登场...

当手机屏幕无法承担更复杂的工作任务,当PC重量不能满足更随性的移动办公,拥有全面屏和便携优势的平板电脑或是中间值,但前提是其必须拥有足够强大的生产力。5月27日华为在国内上市的其首款5G平板——华为MatePad Pro 5G,就是5G时代…

soa示例_SOA示例应用程序

soa示例SOA描述了一组用于创建松散耦合的,基于标准的,与业务相关的服务的模式,由于描述,实现和绑定之间的关注点分离,因此提供了新的灵活性。 近年来,至少在参与大多数信息技术活动的人们中,面向…

body curl 设置post_curl 命令详解

常用参数常用参数分类# 调试类-v, --verbose 输出信息-q, --disable 在第一个参数位置设置后 .curlrc 的设置直接失效,这个参数会影响到 -K, --config -A, --user-agent -e, --referer-K, --config FILE …

NetBeans Java EE技巧7:忽略的Java类和XHTML编辑器快捷方式

有时,最被忽略的是IDE最有用的功能。 在本文中,我将概述在开发Java EE应用程序时可以使用的五个NetBeans Java和XHTML编辑器快捷方式。 #1 –轻松修复命名空间和类 也许您已经向尚未声明名称空间的视图中添加了新的JSF标记,或者…

python学习第三十二节(进程间通信、进程池、协程)

当多线程创建完毕之后,start并没有了立刻运行,依旧需要和其他线程抢CPU的资格,只是时间很短。进程之间的通信分为两种,queue和pipe 1 import multiprocessing2 def foo(q):3 q.put([1,hello,True])4 if __name____main__:5 …

备份ad_IT管理公开课——备份恢复解决方案

时间:2020年5月28日 14:00内容:调查显示,44%的客户面临意外删除或修改数据,如果没有提前备份,这些数据是很难恢复的。RecoveryManager Plus是一款针对AD域,Exchange,Sharepoint以及O…

Ajax中的url使用规则

Ajax中的url使用规则Ajax中的url使用规则如下: 先封装项目访问地址: String basePath request.getScheme() "://" request.getServerName() ":" request.getServerPort() request.getContextPath();然后在js中定义&#xff1…

[网络管理]全双工与半双工的差别

[网络管理]全双工与半双工的差别 同事说新办公室的网络一直不稳定,常常掉线延迟。检查进口线路和更换转接网线。都无法解决这个问题。预计是不是进口网线中一根或者2根短路,那就改动下网卡属性吧。 把自适应改成全双工10M模式,測试OK。全双工…

echarts大屏模板_完整的可视化大屏分享,科技感十足,各行业直接就能用

你的老板有没有要求过你做一个可视化大屏?或许在你看来,这就是一个无理的需求,很简单啊,做几个动态图表,直接投影到屏幕上不就行了?就算做出来能用数据增长业务吗?不懂为什么要拍脑袋做大屏&…

Java面试基础知识(1)

1、final, finally, finalize的区别final:修饰符(关键字)如果一个类被声明为final,没有子类也不能被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们…

bird 报表_轻松完成Birt报告

bird 报表这是使用Birt插件在Eclipse中构建报告的完整指南。 Birt或Business Intelligence and Reporting工具是一种无需编写太多Java代码即可生成报告的工具。 如果您使用的是ireport,那么您知道我在说什么:)(晶体报告..毫无意义…

通过kubeadm安装kubernetes 1.7文档记录[docker容器方式]

参照了网上N多文档,不一一列表,共享精神永存!!!! 获取所有安装包 安装包分为两类,rpm安装包和docker镜像 rpm安装包 rpm为以下四个 kubeadm-1.7.0-0.x86_64.rpm kubectl-1.7.0-0.x86_64.rpm ku…

san框架计数的textarea

san框架计数的textarea<template><div style"height: 100%;width:100%;"><div style"border-bottom: 1px solid #e7e7e7"><div style"height:230px;overflow: hidden;"><t-textarea id"cxfssy" value"…

京东五星电器送扫地机器人_京东五星电器联手打造互联网小家电“孵化器”

出新迭代迅速、件均价较低的生活小家电复购率高&#xff0c;易“种草”&#xff0c;是最具活力的家电品类。11月24日&#xff0c;京东小家电事业部联合京东五星电器召开“小家电发展战略沟通会”&#xff0c;美的、苏泊尔、九阳、小熊、雀巢、德龙、戴森、飞利浦、科沃斯等众多…