Java模块系统新特性快速上手指南( 二 )
清单 3: com.inewday.mod2/module-info.java
module com.inewday.mod2 {requires com.javaworld.mod1;}清单3不言而喻 , 它定义了com.inewday.mod2模块 , 并引入/需要com.inewday.mod1 。
在/com.inewday.mod2目录下 , 创建类路径如下:/com.inewday.mod2/com/inewday/package2 。
现在在里面添加一个名为Hello.java的文件 。 使用清单4中提供的代码 。
清单 4 Hello.java
package com.inewday.package2; import com.inewday.package1.Name; public class Hello {public static void main(String[] args) {Name name = new Name();System.out.println("Hello " + name.getIt());}}在清单4中 , 我们从定义包开始 , 然后导入com.inewday.package1.Name类 。 请注意 , 这些元素一如既往地发挥作用 。 这些模块已经改变了包在文件结构层(而不是代码层)可用的方式 。
类似地 , 您应该对代码本身很熟悉 。 它只是简单地创建一个类并对其调用一个方法来创建一个经典的“hello world”雷同示例 。
5.运行模块化Java示例
文章插图
第1步:创建接收编译器输出的目录 。 在项目的根目录中创建一个名为/target的目录 。 在其内部 , 分别为每个模块创建一个目录:/target/com.inewday.mod1和/target/com.inewday.mod2 。
第2步:编译依赖项模块 , 并将其输出到/target目录 。 在项目的根目录中 , 输入清单5中的命令 。 (假设已经安装了JDK 。 )
清单5:构建模块1
javac -d target/com.inewday.mod1 com.inewday.mod1/module-info.java com.inewday.mod1/com/inewday/package1/Name.java
这将导致源代码随其模块信息一起被构建 。
第3步:生成依赖模块 。 输入清单6中所示的命令 。
清单6:构建模块2
javac --module-path target -d target/com.inewday.mod2 com.inewday.mod2/module-info.java com.inewday.mod2/com/inewday/package2/Hello.java
请详细看看清单6 。 它将module-path参数引入到javac 。 这允许我们以类似于--class-path开关的方式定义模块路径 。 在本例中 , 我将传入target目录 , 因为清单5在该目录中输出模块1 。
接下来 , 清单6(通过-d开关)定义了模块2的输出目录 。 最后给出了编译的实际主题 , 即模块2中包含的module-info.java文件和类 。
为了运行程序 , 使用清单7中所示的命令 。
清单7:执行模块主类
java --module-path target -m com.inewday.mod2/com.inewday.package2.Hello
--module-path开关告诉Java使用/target目录作为模块根目录 , 也就是说 , 在哪里搜索模块 。 -m开关是告诉Java主类在什么地方 。 注意 , 我们在完全限定类名的前面加上它的模块 。
您将看到输出Hello Java Module World 。
6.向后兼容性您可能很想知道如何在后Java 9世界中运行用模块化前编写的Java程序 , 因为以前的代码库对模块路径一无所知 。 答案是Java 9被设计为向后兼容 , 即以前代码依然可以运行在9及以后的版本中 。 但是 , 新的模块系统是一个巨大的变化 , 您可能会遇到问题 , 特别是在大型代码库中 。
在Java 9上运行9以前的代码库时 , 您可能会遇到两种错误:一种源自您的代码库 , 另一种源自您的依赖 。
对于源于代码库的错误 , 这个命令可能会有所帮助:jdeps 。 当指向一个类或目录时 , 该命令将扫描存在哪些依赖项 , 以及这些依赖项依赖的模块 。
对于源于依赖关系的错误 , 您可寄希望您所依赖的包将会有更新的Java 9兼容构建版本 。 如果没有 , 你可能不得不寻找其他选择 。
一个常见的错误是这样的:
How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
这是Java抱怨找不到某个类 , 因为它已经迁移到一个模块 , 而对使用方(消费代码)不可见 。 这里() 描述了几种具有不同复杂性和持久性的解决方案 。
同样 , 如果在依赖项中发现此类错误 , 请进行项目检查 。 它们可能有Java 9构建版本供您使用 。
JPMS是一个相当彻底的改变 , 需要时间来适应 。 幸运的是 , 并不着急 , 因为Java 8是一个长期支持版本 。
也就是说 , 从长远来看 , 旧的项目将需要迁移 , 而新的项目将需要明智地使用模块 , 以期能够利用一些模块应允的好处 。
7.小结本文简要介绍了Java中的模块系统的相关技术知识 , 并做了实例性演示实战操作 , 动手练一把 , 基本就能窥得JPMS的总体特性了 , 后续有机会再深入讲解相关技术细节 。
本篇就到这里了 , 关注一下 , 分享出去吧 , 谢谢.
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 缩小|调整电脑屏幕文本文字显示大小,系统设置放大缩小DPI图文教程
- Win10系统桌面|手机桌面秒变Win10电脑系统,这波操作太给力了!
- 系统|电子邮箱系统哪家好?邮箱登陆入口是?
- 车轮旋转|牵引力控制系统是如何工作的?它有什么作用?
- 计算机学科|机器视觉系统是什么
- 系统|vivo系统迎来“大换血”,OriginOS体验报告来了
- 贵阳|捷顺科技(002609.SZ)中标贵阳智慧停车公共信息服务平台系统建设项目
- 输送|新时达:“用于机器人码垛的输送系统”获发明专利
- 系统|新零售系统要怎么做?
