javaone_JavaOne 2015:高级模块化开发

javaone

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

javaone

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

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

相关文章

php劫持代码,利用php来嗅探劫持服务器数据

前几天刺在我们的maillist发了一个老外写的文章,大意是可以用php来实现数据的劫持和转发。我瞄了一下,确实可行,于是今天抽出了以前用来扯淡的时间,写了段代码验证了一下想法。老外的原文是一个PDF,有兴趣看的可以看看…

LeetCode 371 两个整数之和

原题链接 解题思路&#xff1a;位运算 class Solution { public:int getSum(int a, int b) {while(b){auto c((unsigned int) a & b)<<1;aa^b;bc;}return a;} };

spark rest_Spark简介,您的下一个REST Java框架

spark rest我希望您今年Java来了&#xff01; 今天&#xff0c;我们将研究一个清新&#xff0c;简单&#xff0c;美观且实用的框架&#xff0c;以Java编写REST应用程序。 它将非常简单&#xff0c;甚至根本不会看起来像Java。 我们将研究Spark Web框架。 不&#xff0c;它与Ap…

php求完数,php算法:求完全数 | 学步园

完全数&#xff1a;如果一个数的所有因数(不包括本身)的和刚好等于这个数自身&#xff0c;那么这个数就叫完全数求完全数function get_mul($num){for($i1;$i<$num;$i){for($j1;$j{//内层for循环求一个数的除自身外的所有因数if($i%$j0){$arr[]$j;}}if(isset($arr)){if(array…

oracle 授权 增删改查权限_Oracle增删改查与函数

SQL -- 结构化查询语言 关系型数据库分类&#xff1a; DDL DML DCL DQL TCL Oracle 的数据类型&#xff1a;字符 char() varchar2()数字 number(p,s)时间 date timestamp 文件 clob blob 二维表 table 创建表 CREATE create table 表名 ( 列名 数据类型 [约束], 列名 类型 ... …

LeetCode 1021 删除最外层的括号

原题链接 class Solution { public:string removeOuterParentheses(string S) {string str;int flag 0;for(char c: S){if(c( && flag>0){strc;}if(c ) && flag-->1){strc;}}return str;} };

javafx树视图加选框_JavaFX缺少的功能调查:表视图

javafx树视图加选框JavaFX的TableView&#xff08;和TreeTableView&#xff09;赢得了我最近的“ JavaFX缺失功能”调查以及许多后续讨论中&#xff08;尤其是我们苏黎世JavaFX Meetup小组的成员 &#xff09;中提到最多的控件的价格。 &#xff09;。 我想原因之一是一个简单的…

_用WSL,MobaXterm,Cmder配置linux开发环境

离不开Windows的理由很多,作为后端开发需要使用linux的情况也很多,双系统总归是不方便,而且linux下的GUI体验也没用Win 10好. 如果使用虚拟机,那么文件交换和网络等各种问题也需要解决,对系统的内存要求也更高一些.微软为了让更多的开发人员留在Win10上面,开发了WSL功能.目前的…

wamp测试php,php开发环境搭建/测试/LAMP/WAMP

常用的php开发环境由四部分构成:php预处理器&#xff0c;Apache服务器&#xff0c;mysql数据库&#xff0c;phpmyadmin(管理mysql的图形化页面界面)php语言是一种跨平台语言&#xff0c;常用php环境基于windows和Linux两种操作系统搭建&#xff0c;在Linux系统由Apache、mysql、…

LeetCode 933.最近的请求次数

原题链接 解题思路&#xff1a;主要保留PING中比3000大的 class RecentCounter { public:RecentCounter() {}int ping(int t) {time.push(t);while(time.front()<t-3000){ //查询T是否比3000大time.pop(); //T比3000小就出队}return time.size();}queue<int> time;…

对象容器设计模式_容器对象模式。 一种新的测试模式。

对象容器设计模式如果您搜索什么是页面对象的描述&#xff0c;您会发现页面对象模式为我们提供了一种以可重用和可维护的方式对内容建模的常识方法。 还要指出&#xff1a;在Web应用程序的UI中&#xff0c;您的测试与某些区域交互。 Page Object只是将它们建模为测试代码中的对…

php中上传图片怎么显示出来,PHP上传图片类显示缩略图功能

有缩略图功能 但是 感觉不全面&#xff0c;而且有点问题&#xff0c;继续学习&#xff0c;将来以后修改下/*** Created by PhpStorm.* User: Administrator* Date: 2016/6/28* Time: 21:04*/class upload{protected $fileMine;//文件上传类型protected $filepath;//文件上传路径…

LeetCode 1047. 删除字符串中的所有相邻重复项

原题链接 解题思路&#xff1a; 我们可以用栈来维护没有重复项的字母序列&#xff1a; 若当前的字母和栈顶的字母相同&#xff0c;则弹出栈顶的字母&#xff1b; 若当前的字母和栈顶的字母不同&#xff0c;则放入当前的字母。 class Solution { public:string removeDuplica…

javaparser_JavaParser入门:以编程方式分析Java代码

javaparser我最喜欢的事情之一是解析代码并对其执行自动操作。 因此&#xff0c;我开始为JavaParser做出贡献&#xff0c;并创建了两个相关项目&#xff1a; java-symbol-solver和Effectivejava 。 作为JavaParser的贡献者&#xff0c;我反复阅读了一些有关从Java源代码提取信…

prepare的用法 php,PHP中的操作mysqli的预处理prepare

这篇文章主要介绍了关于PHP中的操作mysqli的预处理prepare &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下PHP中的操作mysqli的预处理prepare1、【PHP错误】Cannot pass parameter 2 by reference这个错误的意思是不能按引用传…

wps xml转换表格_这功能WPS卖近百元?教你免费将PDF转成Word

[PConline 应用]PDF文件如何转换成为Word&#xff1f;很多朋友研究这个问题已经很久了&#xff0c;PDF更利于统一格式传播&#xff0c;Word更便于编辑&#xff0c;因此收到PDF文件后、想要修改时要如何将PDF转换成Word可谓是一个刚需。当然&#xff0c;不少办公软件提供了这样的…

junit 预期错误_谨慎使用JUnit的预期异常

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

LeetCode 231. 2的幂

原题链接 class Solution { public:bool isPowerOfTwo(int n) {if(n<0)return false;if((n&n-1) 0) return true;return false;} };

睡眠 应该用 a加权 c加权_在神经网络中提取知识:学习用较小的模型学得更好...

在传统的机器学习中&#xff0c;为了获得最先进的(SOTA)性能&#xff0c;我们经常训练一系列整合模型来克服单个模型的弱点。 但是&#xff0c;要获得SOTA性能&#xff0c;通常需要使用具有数百万个参数的大型模型进行大量计算。 SOTA模型(例如VGG16 / 19&#xff0c;ResNet50)…

matlab读txt文件不完整,求助Matlab批量读取TXT文件出错

我用dlmread函数批量读取txt文件中的一个数据&#xff0c;但运行结果1.txt文件中只有一个数据0&#xff0c;调试时报错&#xff1a;错误使用 dlmread (line 147)文件结尾不支持空的格式字符串&#xff0c;文件有128列&#xff0c;78行&#xff0c;下面没有列全文件格式是&#…