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,一经查实,立即删除!

相关文章

Halcon学习笔记——机器视觉应用工程开发思路及相机标定

机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分,硬件部分和软件部分。 1.硬件部分,硬件的选型至关重要,决定了后续工作是否可以正常开展,其中关键硬件部分包括:光源,相机以及镜头。 2.软件…

输入框不可以输入中文

输入框不可以输入中文1.输入框不可以输入中文&#xff0c;中文直接消失 <input oninput "valuevalue.replace(/[\u4e00-\u9fa5]{0,}$/g,)"/>2.说明 oninput 事件在元素值发生变化是立即触发 匹配使用正则表达式 正则表达式在线测试网站

图片上传js验证图片长宽_js判断图片上传时的文件大小,和宽高尺寸

今天在做图片上传的小功能&#xff0c;使用了一个kissy上传组件。很好奇它是如何在图片上传前&#xff0c;检测到图片的大小和尺寸的&#xff1f;我们来写个小实例实现一下吧如何读取图片的size首先&#xff0c;原生input file控件有个files属性&#xff0c;该属性是一个数组。…

必填校验加变色,点击颜色消失

必填校验加变色&#xff0c;点击颜色消失1.例子 <td changeColorForNull"ah0"><input class"noNull" type"text" id"ah0"name"ah" notNull"案号" onfocus"myFocus(this)" value"" …

一个关于python装饰器参数的问题

看到廖雪峰python教程上&#xff0c;python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000 在最后的作业题上 再思考一下能否写出一个log的decorator&#xff0c;使它既…

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

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

apache shiro_Apache Shiro第1部分–基础

apache shiroApache Shiro &#xff08;最初称为JSecurity&#xff09;是Java安全框架。 它被接受并于2010年成为Apache顶级项目。它的目标是功能强大且易于使用。 该项目正在积极开发中&#xff0c;用户和开发人员的邮件列表均处于活动状态。 最重要的区域记录在其网页上。 但…

js编码解码

js编码解码//对输出结果编码 function encodeStr(val) {return encodeURIComponent(encodeURIComponent(trim(val))); }// 对参数解码 function decodeStr(val) {return decodeURIComponent(decodeURIComponent(trim(val))); }后端解码 public static String urlDecode(String …

PHP 中文文件名 空格等 CURL 读取

用rawurlencode 对文件名进行编码转载于:https://www.cnblogs.com/zhaoyun4122/p/7198895.html

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

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

谨慎使用JUnit的预期异常

有时&#xff0c;当我们收到对jOOQ或其他库的拉取请求时&#xff0c;人们会将单元测试中的代码更改为更“惯用的JUnit”。 特别是&#xff0c;这意味着他们倾向于更改此代码&#xff08;公认的不是那么漂亮的代码&#xff09;&#xff1a; Test public void testValueOfIntInv…

plupload使用例子

plupload使用例子1. 例子 <li><a id"uploadFile">上传</a></li>//文书上传和显示 $(function () {var uploader new plupload.Uploader({runtimes: html5,flash,silverlight,html4,// 指定上传方式browse_button: uploadFile,unique_names…

mysql获取相隔时间段的数据

思路&#xff1a;为时间段内的数据进行编序号&#xff0c;然后计算好相隔时间&#xff0c;拿到id作为搜索条件 SELECT * FROM ( SELECT (i:i1) as i, id, data_send_time FROM jl_pims_machine_time mt,(select i:0) as it where mt.company_id 1001 AND mt.machine_id 1 ord…

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

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

字符串工具类

字符串工具类import javax.servlet.http.HttpServletRequest; import java.util.UUID;public class CommonUtil {/*** param request 请求* return java.lang.String 返回路径* description 获取绝对路径* date 2021/7/14 20:45*/public static String getUrlPath(HttpServletR…

JSonP跨域请求

JSonP跨域请求 我们在通过自己的页面或程序通过ajax请求其它网站或服务时&#xff0c;会存在一个ajax直接请求普通文件存在跨域无权限访问的问题&#xff0c;甭管你是静态页面、动态网页、web服务、WCF&#xff0c;只要是跨域请求&#xff0c;一律不准。不过我们又发现&#xf…

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

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

gwt 嵌入html_GWT和HTML5画布演示

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

使用UIWebView载入本地或远程server上的网页

大家都知道&#xff0c;使用UIWebView载入本地或远程server上的网页&#xff0c;sdk提供了三个载入接口&#xff1a;- (void)loadRequest:(NSURLRequest *)request; - (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL; - (void)loadData:(NSData *)data MI…

css使按钮固定在界面上面

css使按钮固定在界面上面<div><div style"border-bottom: 1px solid #e7e7e7"><a class"" onclick"saveTable()" style"margin-left: 2%"><i class""></i>保存</a><a class"&q…