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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

gpu编程如何一步步学习_如何学习贴片机编程

学习贴片机编程首选要对贴片机有所熟悉了解,另外对常用的电脑编辑软件要会使用。目前通常学习贴片机编程有专门的培训学校,或者跟着生产线上现有的贴片机编程师傅学习熟练后再进行编程操作。下面深圳智驰科技就来分享一下如何学习贴片机编程。对贴片机编…

plotcylinder matlab,Matlab在任意两点之间绘制三维圆柱

Matlab在任意两点之间绘制三维圆柱Matlab在任意两点之间绘制三维圆柱此函数可能存在一些不足,请多多指教!function plotcylinder(u1,u2,color_a,r)Lnorm(u1-u2);RODu2-u1;[X,Y,Z]cylinder(r,100);x1X*0;y1Y*0;z1Z*0;ZL*Z-L/2;ROD_midpoint(u1u2)/2;xROD_…

jdk8和hotspot_HotSpot的-XshowSettings标志的简单性和价值

jdk8和hotspot一个方便的HotSpot JVM标志 ( 选项为Java启动 java )是-XshowSettings选项。 Oracle Java启动器描述页面中对此选项进行了如下描述 : -XshowSettings : category显示设置并继续。 该选项的可能类别参数包括&#xf…

matlab信号分割与比对,matlab测量计算信号的相似度

本示例说明如何测量信号相似度。将回答以下问题:如何比较具有不同长度或不同采样率的信号?如何确定测量中是否存在信号或仅有噪声?有两个信号相关吗?如何测量两个信号之间的延迟?比较具有不同采样率的信号考虑一个音频…

Spring Bootstrap中具有配置元数据的高级配置

在简要介绍了配置元数据并涵盖了我之前的文章《 在Spring Boot中使用配置元数据Pimp您的配置》中的基础知识之后,现在该看看如何进一步执行此步骤并进一步自定义配置。 在这篇文章中,我计划提出对配置属性的弃用,并讨论各种值提供程序&#x…

ssh 与 telnet 有何不同?_采用创新面料Nike Infinalon的全新瑜珈系列究竟有何不同?...

采用创新面料Nike Infinalon的全新瑜珈系列究竟有何不同?无拘无束自由运动——这是耐克瑜伽系列新品的核心设计理念。全新系列为你提供垫上瑜伽时毫无束缚的舒适感,采用了耐克创新型面料:Nike Infinalon。Nike Infinalon应用于耐克最新瑜伽系…

matlab中的导函数驻点,Matlab用导数作定性分析

Matlab用导数作定性分析5.1知识要点:函数作图 —用导数定性描述函数【 clf,xlinspace(-8,8,30);f(x-3).^2./(4*(x-1)); plot(x,f) 】【 fplot((x-3)^2/(4*(x-1)),[-8,8])) 】【 clf,xsym(x); f(x-3)^2/(4*(x-1)); ezplot(f,[-8,8]) ,ti…

原生态基于OpenCV图像处理软件开发

部分功能效果图 GitHub:https://github.com/CnYiXiaoNaiHe/OpenCV- 持续更新

git.exe 启动 慢_四川成都surface电脑启动到一半黑屏维修服务地址电话

联系人:刘工 欢迎来电 地址:成都市一环路南二段1号(磨子桥口)数码科技大厦(新世纪电脑城对面)4楼413专业surface全系列维修因为专注,所以专注,所以surface配件都有现货。微软电脑,微软平板电脑专业维修服务点surface R…

【FFMPEG应用篇】基于C++使用ffmpeg和QT开发播放器

音视频基础知识 1.MPEG-4是一套用于音频,视频信息的亚索编码标准。 2.常见的封装格式 MP4 MOV AVI:压缩标准可以任意选择 FLV :FLV封装格式详细参考 TS:直播流媒体使用; 3.常用视频编码格式 H264&#xff0…

java代码自动生成的插件_如何使用插件生成自定义Java 8代码

java代码自动生成的插件大多数程序员讨厌的一件事就是编写样板代码。 无休止的时间花费在设置实体类和配置数据库连接上。 为了避免这种情况,您可以让Speedment Open Source之类的程序为您生成所有这些代码。 这样可以很容易地以最少的人工就可以启动和运行数据库项…

PHP在Tomcat中CSS出错,tomcat找不到css怎么办

tomcat找不到css怎么办Tomcat找不到WEB下的Css文件,一般可以通过以下方式解决:将路径相对位置修改为域相对位置,如下:备注:WEB-INF不是公共访问目录,只有在Servlets的RequestDispatcher或JSPS的可以访问&am…