Java Module(即 Java 9 引入的 JPMS,Java Platform Module System)打包,通常有几种常见方式,取决于你是只打包模块、打包可运行程序,还是生成可分发镜像。下面按常见场景系统说明 ✅
demo.module
│
├── module-info.java
└── com
└── example
└── Main.java
// module-info.java
module demo.module {
exports com.example;
}
package com.example;
public class Main {
public static void main(String[] args) {
System.out.println("Hello Module");
}
}
javac -d out \
src/demo.module/module-info.java \
src/demo.module/com/example/Main.java
jar --create \
--file demo.module.jar \
-C out .
✅ 生成的 demo.module.jar 是一个 modular JAR
Main-Classjar --create \
--file demo.module.jar \
--main-class com.example.Main \
-C out .
运行:
java --module-path demo.module.jar --module demo.module
或者直接(如果是可执行 JAR):
java -jar demo.module.jar
⚠️ 注意:
-jar 不会使用 module path--module-path 下生效src
└── main
├── java
│ ├── module-info.java
│ └── com/example/Main.java
└── resources
<properties>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
打包:
mvn package
生成:
target/demo-module-1.0.jar
project
├── app
│ ├── module-info.java
│ └── com/example/app/Main.java
├── lib
│ ├── module-info.java
│ └── com/example/lib/Util.java
javac -d out/lib \
lib/module-info.java lib/com/example/lib/Util.java
javac --module-path out/lib -d out/app \
app/module-info.java app/com/example/app/Main.java
jar --create --file lib.jar -C out/lib .
jar --create --file app.jar --main-class com.example.app.Main -C out/app .
这是 Java Module 的杀手级用法
jlink \
--module-path $JAVA_HOME/jmods:out \
--add-modules demo.module \
--output myapp-runtime \
--launcher myapp=demo.module/com.example.Main
运行:
myapp-runtime/bin/myapp
✅ 优点:
| 方式 | 适用场景 |
|---|---|
jar |
普通模块 JAR |
maven-jar-plugin |
工程化构建 |
jlink |
最终交付程序 |
--module-path |
模块依赖管理 |
module-info.java 不在 src/main/java 根目录requires 的模块不在 module-path 上如果你愿意,我可以:
你现在用的是 Maven / Gradle / 纯 javac?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。