模块目录:

oop-module
├── bin
├── build.sh
└── src
    ├── com
    │   └── itranswarp
    │       └── sample
    │           ├── Greeting.java
    │           └── Main.java
    └── module-info.java

module-info.java:

hello.world是模块名,编译时生成的module-info.class会记录模块名,运行时,java --module hello.world 就是通过这个名字找到模块。

requires记录当前这个模块hello.world需要引用的其他模块名,java.base可以被自动引入。只有模块被依赖,才能被使用。

Main.java:

package com.itranswarp.sample;

// 必须引入java.xml模块后才能使用其中的类:
import javax.xml.XMLConstants;

public class Main {
	public static void main(String[] args) {
		Greeting g = new Greeting();
		System.out.println(g.hello(XMLConstants.XML_NS_PREFIX));
	}
}

main.java中需要用到javax.xml.XMLConstants(java.xml模块的包),就必须在module-info.java中requires java.xml,如果没有则编译报错。

一、编译

含义:将module-info.java和src\com\itranswarp\sample下的所有java文件编译,将生成的class文件按包结构输出到bin目录下。

编译后的文件:

编译成功后的文件目录:

oop-module
├── bin
│   ├── com
│   │   └── itranswarp
│   │       └── sample
│   │           ├── Greeting.class
│   │           └── Main.class
│   └── module-info.class
└── src
    ├── com
    │   └── itranswarp
    │       └── sample
    │           ├── Greeting.java
    │           └── Main.java
    └── module-info.java

二、打包成jar

含义:创建hello.jar文件,main-class指向main文件。

main-class参数:jar包包含一个特殊的/META-INF/MANIFEST.MF文件,MANIFEST.MF是纯文本,可以指定Main-Class和其它信息。JVM会自动读取这个MANIFEST.MF文件,如果存在Main-Class,就不必在命令行指定启动的类名,而是用更方便的命令java -jar hello.jar。

运行看看:

三、创建模块

将jar转化为模块文件:

运行模块试试(看似没有是用到hello.jmod,但是要用它打包jre):

注意:--module-path后面不能写模块名,否则会报错。

四、打包成jre

含义:把java.base,java.xml,hello.world这些模块打包进最终的运行环境(不会写入到hello.jmodmodule-info.java),输出目录是jre/,可直接运行,不需要完整JDK,体积更小。

运行jre试试。

这里注意:jre\bin\java不能使用/,否则会报错。可能是因为cmd对普通文件路径和可执行命令的解析逻辑不同,对可执行命令,必须使用\,但是文件路径可以使用/。(这里我不确定原因,欢迎讨论。)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐