html5响应式布局网站,1688网站入口,望京做网站公司,项目策划书模板Java 9即将来临#xff0c;NetBeans 9也即将来临。在本文中#xff0c;我们将看到NetBeans 9 Early Access为开发人员提供的支持#xff0c;以帮助他们构建Java 9兼容的应用程序。 Java 9提供了许多#xff08;大约90种#xff09; 新功能#xff0c;包括Modules和JShel… Java 9即将来临NetBeans 9也即将来临。在本文中我们将看到NetBeans 9 Early Access为开发人员提供的支持以帮助他们构建Java 9兼容的应用程序。 Java 9提供了许多大约90种 新功能包括Modules和JShellRead-Eval-Print-LoopREPL等。 您可以在本文末尾的参考资料中找到更多信息尤其是有关NetBeans 9支持JDK 9的链接 。 在本文中我们将学习如何 从源代码下载并构建Java 9 EA 从源代码下载并构建NetBeans 9 EA 使用NetBeans 9 EA中的JShell REPL 使用NetBeans 9 EA创建和构建模块以及它们之间的依赖关系使我们的生活更轻松 1.构建OpenJDK 9 EA OpenJDK是任何JDK增强建议 JEP甚至Java规范请求 JSR的参考实现。 您可能有很多原因为什么要从源代码构建它而不下载预构建的二进制文件之一 例如 强制您从源代码构建开源项目的公司政策 您希望获得最新的早期访问OpenJDK 您想要为您的特殊平台构建 当然您可以通过下载预构建的二进制文件来继续本文。 但是如果您想学习如何构建JDK 9请继续阅读。 构建自己的JDK映像具有许多优势例如您不需要安装任何东西或进行修改例如Windows注册表或MacOS上的Java Preferences面板都可以破坏当前的默认JDK请参见例如本文 。 可执行文件将始终在同一位置创建并且通过更新存储库并重新构建源代码您始终可以拥有最新版本。 您可以下载最新的OpenJDK 9二进制文件此页面。 资料可以在Mercurial资料库中找到。 例如OpenJDK 9仓库在这里 ; 如果希望参与项目那么Jigsaw回购项目将包含模块化实现的主要内容。 在下面您将获得有关如何构建OpenJDK 9的一些技巧。 克隆JDK 9 Master mercurial存储库。 阅读README或README-builds.html文件以获取更多说明。 开始构建之前的下一步是执行 bash get_source.sh或./get_source.sh如果您的shell已经是bash。 在每次更新后调用此命令非常重要。 原因是hg update仅更新主存储库。 OpenJDK包含许多需要更新的Mercurial存储库。 这可以通过get_source.sh命令来完成。 ./configure --disable-warnings-as-errors sudo make all 上面的命令构建了OpenJDK的最新版本。 如果您希望构建OpenJDK的早期版本则需要遵循以下提示 hg up [tag]例如jdk-9147 cd corba hg up [tag]例如jdk-9147 对目录重复步骤2和3 hotspot, jaxp, jaxws, jdk, langtools, nashorn ./configure --disable-warnings-as-errors sudo make clean sudo make all 二进制文件是在build/platform_dir/jdk中创建的例如如果您在build/macosx-x86_64-normal-server-release/jdk使用Mac。 2.构建和配置NetBeans 9 EA 您可以从http://wiki.netbeans.org/ JDK9Support下载具有JDK 9支持的最新NetBeans或从以下来源进行构建 hg clone http://hg.netbeans.org/main cd main hg clone http://hg.netbeans.org/main/contrib cd .. ant 二进制文件在nbbuild/netbeans创建。 将其配置为与JDK 8或JDK 9 EA etc/netbeans.conf 一起运行。 jshell 要启用jshell 您需要使用JDK 9 EA设置NetBeans 9。 因此编辑etc/netbeans.conf指向您在步骤1中构建的JDK 9 EA netbeans_jdkhomepath to OpenJDK 9 EA/build/platform_dir/jdk 请备份此文件因为下次构建NetBeans时它将被覆盖因此您必须再次进行此修改。 通过发出以下命令来启动netbeans bin/netbeans或bin\netbeans.exe具体取决于您的平台。 通过工具 | NetBeans将最新的JDK 9 EA构建注册为Java平台 。 Java 平台| 添加平台 参见图1然后选择在步骤1中构建的OpenJDK 9 EA。 图1 –将JDK 9 EA平台添加到NetBeans 9 EA 3. NetBeans 9 EA中的JShell支持 如果使用JDK 9实现启动NetBeans 9则可以从菜单|工具|菜单中访问JShell 。 打开Java Platform Shell 。 JShell的工作原理与命令行相同此外NetBeans快捷方式也可以使用它例如sout -- (tab) 。 您可以在参考资料中阅读有关JShell的更多信息。 图2 – NetBeans 9 EA中的JShell。 4. NetBeans 9 EA中的模块支持 NetBeans 9 EA提供了许多好处可以帮助您进行模块化项目。 在继续之前必须在“ 工具” |“设置”中设置JDK 9 EA平台。 Java 平台| 添加平台并选择您在步骤1中构建的OpenJDK 9 EA二进制文件的路径。 要将现有项目转换为模块您需要执行两项任务 在项目属性中将项目设置为与JDK 9兼容 在Libraries中将Java Platform设置为JDK 9 EA Java平台图3。 在Sources中将Source / Binary Format设置为JDK 9 图4。 在您的项目中添加一个Java模块信息即模块描述符 module-info.java 见图5 档案| 新档案…| Java类别| Java模块信息文件类型 图3 –将Java平台设置为JDK 9 EA 图4 –将Java Sources设置为JDK 9 图5 –添加Java模块信息 module-info.java必须始终位于NetBeans 9中Java项目的根目录中。这是NetBeans 9中的一项限制而不是JDK 9中的一项限制。唯一的例外是我们可以在一个目录中包含多个module-info.java文件。一个Java项目就是我们进行单元测试的时候。 您可以在Test Packages添加module-info.java文件。 但是让我们通过在NetBeans 9 EA中实现项目Jigsaw的快速入门指南来了解NetBeans 9 EA模块的支持。 我的第一个使用NetBeans 9的模块化应用程序 第一个示例是名为com.greetings的模块该模块仅显示“ Greetings”。 该模块包含两个源文件模块声明 module-info.java 和主类。 按照约定模块名称可以是Java限定的标识符模块的源代码位于模块名称的目录中在本例中为com.greetings 即使这不是必需的。 通过执行以下步骤在NetBeans中创建一个新的Java项目 档案| 新项目… 选择Java 类别和Java应用程序 项目然后单击Next。 在下一页中选择一个“项目位置”并输入“ com.greetings”作为项目名称这是因为遵循本教程的约定但是也可以使用常规的Java项目名称例如“ Greetings”。 将主类重命名为com.greetings.Main 。 点击完成 。 您应该看到一个名为com.greetings的Java项目并且在其中包含com.greetings.Main类其中包含main()方法。 像这样修改它 com.greetings.Main package com.greetings;/** author javacodegeeks */
public class Main {/** param args the command line arguments */public static void main(String[] args) {System.out.println(Greetings!);}
} 要将Java Project转换为模块 module-info.java按照前面所述添加module-info.java 即右键单击项目名称然后选择File | 新档案…| Java类别| Java模块信息文件类型 。 在项目的根包中创建一个空的module-info.java 。 按照Jigsaw教程重命名如下所示 com.greetings.module-info.java module com.greetings {
} 您必须清理并构建项目才能使模块重命名生效并成功运行。 您应该看到消息“问候” 在输出窗口中。 使用NetBeans您无需关心命令行语法以及javac和java命令的参数。 这些由NetBeans IDE负责。 添加依赖项 第二个示例更新模块声明以声明对模块org.astro的依赖。 模块org.astro导出API包org.astro 。 按照上一org.astro的步骤创建一个名为org.astro的新Java项目。 这次不要创建Main Class。 创建项目后右键单击它然后选择“ 新建” |“新建”。 Java类…输入World作为类名输入org.astro作为包名然后单击Finish 。 像这样更新新创建的类 org.astro.World.java package org.astro;/** author javacodegeeks */
public class World {public static String name() {return world;}
} 添加module-info.java就像我们对以前那样com.greetings 。 org.astro.module-info.java module org.astro {
} 不要忘记清理和构建模块重命名才能生效。 现在我们需要从com.greetings模块到org.astro模块添加一个依赖关系以便使用其方法World.name() 。 但是在此之前 org.astro必须导出包含此方法的软件包。 这两个动作都需要在两个模块的module-info.java文件中进行。 NetBeans 9为您提供了有关如何执行操作的有用提示。 打开org.astro的module-info.java并在方括号内键入Ctrl-Space 。 如示于图6.选择一个弹出菜单将出现显示可用的命令exports并通过键入继续org.astro它是包名到出口。 NetBeans在键入时为您提供提示。 保存module-info.java您会注意到“ 项目”选项卡中软件包的锁定图标变为打开的锁定。 打开com.greetings的module-info.java并在括号内按照上述步骤输入requires org.astro的命令这一次引用的是模块名称而不是程序包名称另一个原因是为什么Jigsaw项目的快速入门指南并不是那么成功因为它难以区分包和模块名。 但是NetBeans抱怨module not found错误消息module not found 。 为了使NetBeans能够找到该模块还需要执行一步。 右键单击com.greetings Java项目的Libraries文件夹 com.greetings从弹出菜单中选择“ 添加项目 ”。 选择org.astro Java项目然后单击添加项目JAR文件 。 错误消失了。 另一种执行相同操作的方法是右键单击项目com.greetings然后从弹出菜单中选择“ 属性 ”。 在“项目属性”对话框中单击“ 库 ”类别然后单击“ 模块路径”旁边的号。 选择“ 添加项目”然后选择“ org.astro Java项目”然后单击“ 添加项目JAR文件” 。 请记住如果您尝试添加循环依赖关系例如从org.astro到com.greetings 则NetBeans将显示一个对话框显示以下消息 无法添加循环引用 请参见图7。 像这样修改Main.main()方法然后清理并构建两个模块。 图6 –模块信息命令 图7 –循环依赖性错误 com.greetings.Main.java package com.greetings;
import org.astro.World;
/** author javacodegeeks */
public class Main {/** param args the command line arguments */public static void main(String[] args) {System.out.format(Greetings %s!%n, World.name());}
} 当您粘贴新的System.out.format(...)语句时NetBeans会识别World类并建议添加import语句。 这是唯一可能的因为您已经更新了两个模块的module-info.java文件如下所示 com.greetings.module-info.java module org.astro {exports org.astro;
} org.astro.module-info.java module com.greetings {requires org.astro;
} NetBeans 9 EA为您提供了依赖性的可视化表示模块图。 只需在org.greetings module-info.java编辑器中单击Graph按钮即可看到模块依赖关系的漂亮图表如下图所示。 图8 –模块图 运行com.greetings模块以查看输出 Greetings world! 如预期的那样。 与项目Jigsaw的原始快速入门指南进行比较以了解使用NetBeans IDE节省了多少键入内容。 包装模块 使用NetBeans打包模块非常容易。 右键单击项目com.greetings然后从弹出菜单中选择“ 属性 ”。 在Project Properties对话框图9中单击Build下的Packaging类并选择Create JLink distribution和Create Launcher 然后单击OK 。 下次清洁和构建NetBeans时将在com.greetings Java项目的dist文件夹内生成Java运行时映像其中仅包含运行com.greetings所需的JDK模块即仅java.base模块。 无需记住jlink命令的语法。 图9 –包装模块 Java模块化项目 正如我们一开始提到的NetBeans 9每个Java项目仅允许一个模块。 但是使用Java模块化项目可以在这个特殊的Java项目中定义许多模块。 我们将使用Java模块化项目重新实现先前的模块。 这是一个基于ant的项目其中包含多个模块并立即进行编译。 档案| 新项目… 选择Java 类别和Java Modular Project 项目图10然后单击Next。 输入ModularGreetings作为项目名称然后单击完成。 右键单击新创建的项目然后从弹出菜单中选择“ 新建模块 ”。 输入com.greetings作为模块名称然后单击Finish 。 NetBeans会为此模块打开module-info.java文件。 重复上一步以创建org.astro模块。 如4.2中所述在两个模块之间创建依赖关系 在每个模块的classes中创建或从4.2中创建的先前模块中复制软件包。 清洁并建造。 无需添加org.astro到的模块路径com.greetings ; 它是自动完成的。 运行项目以查看正确的输出 Greetings world! 图10 –新的Java模块化项目 图11 – Java模块化项目 您会看到Java Modular Project具有许多优点例如您不需要将其他项目显式添加到Module路径。 当您更新module-info.java时将自动完成此操作。 服务 松散耦合是指每个组件对其他独立组件的定义了解很少或不了解的系统。 这使得各个组件可以独立更改而不会影响其他组件。 但是让我们描述一个示例以深入了解《 快速入门指南》的详细信息。 假设您有一个提供服务的提供者。 例如这可以是AlertService 提供各种系统或应用程序警报 CoordinatesProvider 提供各种坐标系统例如纬度/经度GEOREFUTM等 AlgorithmProvider 提供针对问题的各种算法解决方案等为了实现松散耦合您可以为调用程序类提供一个接口以隐藏其背后的实际实现。 调用者或服务使用者类不需要知道任何实际的实现。 他们只需要知道如何访问相关方法即可。 然后在运行时以某种方式将实现提供给调用方类。 这样只要Provider接口不更改实际的实现就可以在任何时候更改而无需调用方类知道。 有多种方法可以实现松散耦合。 这通常是由服务提供商完成的。 服务定位器设计模式提供了对服务的全局访问点而无需将调用者服务使用者耦合到实现该服务的具体类上。 例如 Spring使用依赖注入 控制反转的一种形式NetBeans的RCP 模块化API使用Lookups和ServiceProviders等。Jigsaw使用Java 6中的ServiceLoader 。服务使用者和服务提供者类可以驻留在不同的模块中。 从拼图快速入门指南 模块com.socket提供服务NetworkSocketProvider为NetworkSocket秒。 在两个不同的模块中提供了此服务的两种实现 org.fastsocket和org.smartsocket 。 我们的服务使用者模块com.greetings仅需要依赖com.socket服务提供者模块 com.greetings需要依赖服务实现模块。 图12 –服务提供商 让我们看看如何实现这一目标。 在NetBeans 9 EA中如我们之前com.socket 创建一个新的Java Project com.socket 而不提供Main类。 如《 快速入门指南》中所述创建两个类com.socket.NetworkSocket和com.socket.spi.NetworkSocketProvider 添加新的module-info.java以将项目转换为Java 9模块并将这两个包导出到使用者类 com.socket.module-info.java module com.socket {exports com.socket;exports com.socket.spi;uses com.socket.spi.NetworkSocketProvider;
} 最后一条语句声明此模块向使用者提供com.socket.spi.NetworkSocketProvider服务。 不要忘记清理并构建此模块以使更改生效。 接下来让我们创建org.fastsocket模块。 与以前一样按照快速入门指南中的描述创建两个类org.fastsocket.FastNetworkSocket和org.fastsocket.FastNetworkSocketProvider 添加一个新的module-info.java以将项目转换为Java 9模块并为com.socket添加依赖项com.socket模块 org.fastsocket.module-info.java module org.fastsocket {requires com.socket;provides com.socket.spi.NetworkSocketProviderwith org.fastsocket.FastNetworkSocketProvider;
} 最后一条语句提供com.socket.spi.NetworkSocketProvider服务提供程序的实现。 请注意这个模块不出口任何包 但是该项目包含编译错误。 你能说出为什么吗 我们需要将com.socket添加到modulepath中如果您不记得该怎么做请参考本文前面的内容。 清理并构建以确保没有错误。 您可以重复上述步骤以类似的方式创建org.smartsocket 但是快速入门指南并没有这样做因此您可以根据需要创建自己的实现。 最后创建消费者com.greetings Java项目使用另一个目录不乱用的com.greetings模块我们在第一章4.1和4.2创建与com.greetings.Main类从的内容复制快速入门指南 添加一个新的module-info.java 将项目转换为Java 9模块并向com.socket添加一个依赖com.socket com.greetings.module-info.java module com.greetings {requires com.socket;
} 确保您添加了模块com.socket并完成。 清理并构建然后运行com.greetings 您将看到一个错误 运行时异常 Exception in thread main java.lang.RuntimeException: No service providers found!at com.socket/com.socket.NetworkSocket.open(NetworkSocket.java:19)at com.greetings/com.greetings.Main.main(Main.java:8) 为什么 我们确实做了《 快速入门指南》中提到的内容。 NetBeans Java项目要求您在模块路径中添加org.fastsocket 然后将其自动添加到module-info.java 然后该异常消失 org.fastsocket.FastNetworkSocket class org.fastsocket.FastNetworkSocket 作为练习您可以使用Java模块化项目重复上述操作。 在这里你不需要添加服务提供者实现模块如org.fastsocket 到模块路径com.greetings 。 但是它是如何工作的呢 拼图使用ServiceLoader定位各种服务提供者实现 服务加载器 ServiceLoaderNetworkSocketProvider sl ServiceLoader.load(NetworkSocketProvider.class);
IteratorNetworkSocketProvider iter sl.iterator(); sl.iterator()将遍历org.fastsocket.FastNetworkSocketProvider和com.smartsocket.SmartNetworkSocketProvider 如果已实现。 在后台 ServiceLoader创建一个提供程序配置文件该文件存储在服务提供程序的JAR文件的META-INF/services目录中。 配置文件的名称是服务提供者的完全限定的类名称其中名称的每个组成部分均以句点 . 分隔而嵌套的类则以美元符号 $ 分隔。 换句话说 ServiceLoader在模块的build/classes/META-INF/services/文件夹或dist/provider.jar 内创建一个文本文件package.Provider 其中包含实现类的标准名称例如package.ProviderImpl 。 在我们的示例中 com.socket/build/classes/META-INF/services/包含文本文件com.socket.spi.NetworkSocketProvider 其中包含实现类org.fastsocket.FastNetworkSocketProvider 和com.smartsocket.SmartNetworkSocketProvider标准名称com.smartsocket.SmartNetworkSocketProvider如果已实现。 至少如果使用Java 6 ServiceLoader 这应该是“幕后”实现 不幸的是Java 9修改了ServiceLoader的实现。 Java 6 ServiceLoader具有许多限制 它不是动态的您无法在运行时安装/卸载插件/服务 它会在启动时加载所有服务因此需要更长的启动时间和更多的内存使用量 无法配置 有一个标准的构造函数它不支持工厂方法 它不允许进行排名/排序即我们无法选择要首先加载的服务服务的排序是在发现时进行的 此外Java 9对Java 6 ServiceLoader进行了如下修改 没有相关服务 新的基于模块的服务定位器没有相对行为 服务的订购如发现丢失 模块路径上的所有服务接口和实现均被展平为单个全局名称空间 服务加载没有可扩展性/可定制性 服务层提供者必须预先提供可用服务的固定映射 多站点声明 每个使用服务的模块还必须在模块描述符中声明正在使用该服务 没有全局的全层服务注册表 换句话说如果您搜索com.socket/build/classes/META-INF/services/或com.socket/dist/com.socket.jar/META-INF/services/您将一无所获。 NetBeans RCP改为提供ServiceProvider 它没有上面提到的ServiceLoader的缺点。 它是动态的因此您可以在应用程序运行时插入/拔出模块它不会在启动时加载所有服务并允许您设置优先级使用ServiceProvider批注的position属性。 不幸的是它不适用于拼图。 5. NetBeans的进一步改进 要使程序包可用于其他模块必须编辑module-info.java并添加一个将程序包名称作为参数传递的exports语句。 这将导致包图标更改为具有打开锁的图标而不是已锁定的图标。 一个不错的捷径是能够右键单击一个包然后选择一个动作Export Package 如下图所示该操作将相应地自动修改module-info.java 而无需键入export命令。 图13 – NetBeans的改进 添加导出包菜单项 NetBeans RCP 模块API NetBeans胖客户端平台随附的API中已经存在此功能。 在由许多模块组成的项目中通常很难找到依赖项存在于哪个模块中。 一个很好的补充就是能够在整个模块和/或库模块中搜索我们要查找的类。 NetBeans RCP 模块API NetBeans胖客户端平台随附的API中已经存在类似的功能。 当由于NetBeans找不到依赖项而遇到错误时单击提示blob将打开一个对话框开发人员可以在其中键入所需的类如下图所示然后选择适当的模块。 当开发人员请求将模块依赖项添加到模块路径时例如通过右键单击Libraries 可以访问相同的对话框。 图14 – NetBeans的改进 搜索模块的依赖关系 最后可以将一个新模块添加到Java Modular Project中但是无法删除模块尽管至少要编写这些行。 这是一个固定的EA错误。 NetBeans 9 EA仍在大量开发中并且尚未通过官方测试也称为NetCat因此在此阶段会遇到一些错误或奇怪的行为是正常的。 六结论 在本文中我们了解了NetBeans 9 EA如何支持JDK 9 EA并简化了开发人员的工作。 作为开发人员您无需记住如何使用模块路径来构建和执行Java模块的细节或者如何jlink命令的细节。 NetBeans 9隐藏细节。 JShell也很好地集成了。 当然某些改进可以使开发人员的生活更加轻松但是这些改进将在将来的NetBeans版本中或作为插件出现。 我们看到了可以用来创建模块化Java应用程序的两种项目。 我们看到了可以在module-info.java内部使用的五个可用命令中的四个命令的使用 exports, requires, uses和provides 。 opens允许其他模块使用反射来访问您打开的包中的类型。 普通模块中的特定程序包可以被“打开”因此只有该程序包可在运行时进行深度反射 com.greetings.module-info.java module com.greetings {opens com.greetings;
} 一些Java框架和工具在运行时严重依赖反射来访问未导出模块的代码。 它们提供诸如依赖项注入序列化Java Persistence API的实现代码自动化调试等功能。示例包括Spring和Hibernate。 这些框架和库不了解您的应用程序模块但是它们需要访问模块的类型和私有成员这打破了JDK 9中强封装的前提。还可以打开整个模块以进行反射例如 com.greetings.module-info.java open module com.greetings {requires com.socket;
} 与opens与exports进行比较 exports语句可让您在编译时和运行时仅访问指定包的公共API而opens语句可让您在运行时使用反射来访问指定包中所有类型的公共和私有成员。 与拼图游戏配合使用时玫瑰花还不是全部。 专家社区还没有接受拼图游戏并且对他们遇到的许多严重缺陷有很多担忧。 7.参考 NetBeans 9 EA NetBeans 9 EA JDK 9支持 Sitepoint Java 9终极指南 JDK 9功能完整 JavaCodeGeeks Java杂志 2017年7月至8月 Java 9系列 JShell Voxxed Java 9 系列 HTTP / 2 客户端 Voxxed Java 9系列 JVM Voxxed Java 9系列HTML5和 Javadoc Voxxed Java 9 系列 并发 更新 Voxxed Java 9系列变量 句柄 Voxxed Java 9系列封装大多数内部 API Voxxed Java 9系列多发行JAR 文件 Voxxed Java 9 系列 分段 代码 缓存 Voxxed Java 9系列 集合的 便利工厂方法 Voxxed 拼图中的严重缺陷 Bateman A.2016“为JDK 9做准备” JavaOne 。 Bateman A.2016年“模块化开发简介” JavaOne 。 Bateman A.和Buckley A.2016“高级模块化开发” JavaOne 。 Buckley A.2016“模块和服务” JavaOne 。 Buckley A.2016年“ Project JigsawThe Hood” JavaOne 。 Bateman A.Chung M.Reinhold M.2016年“ Project Jigsaw Hack Session” JavaOne 。 Deitel P.和Deitel H.2017年《 Java 9 for Programmers》第四版Deitel。 EvansB.2016“ Java 9模块的早期观察” 《 Java Magazine》 第26期1-2月第59-64页。 Gupta A.2015年《 JDK 9 REPL入门》 JavaCodeGeeks 慢跑TM。 2016 学习模块化Java编程 Packt。 Mak S.和Bakker P.2016年 Java 9 Modularity OReilly早期发行 Reinhold M.2016 问题模块反射访问 Voxxed Sharan K.2017年《 Java 9公开供早期采用和迁移》 Apress。 Verhas P.2017年《 Java 9示例编程》 Packt。 Zhitnitsky A.2015 Java 9抢先体验与JShell进行动手实践– Java REPL JavaCodeGeeks。 翻译自: https://www.javacodegeeks.com/2017/07/netbeans-9-early-access.html