You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Java模块,实现`java -m mymodule`直接运行无需指定主类

用java -m直接运行Java模块的配置逻辑

核心实现方式

要让模块能通过java -m mymodule直接启动,分两种场景处理:

1. 自定义模块的显式配置

对于你自己编写的模块,编译时必须给javac指定主类,把入口信息嵌入模块描述符,这样JVM运行时才能自动找到启动类。命令示例如下:

javac -d mods/mymodule --module-source-path src --module-main-class mymodule/com.yourpackage.Main src/mymodule/module-info.java src/mymodule/com/yourpackage/Main.java

完成编译后,直接执行java -m mymodule就会启动指定的Main类。如果不指定--module-main-class参数,运行时必须显式写出主类的完整路径:java -m mymodule/com.yourpackage.Main,否则会报错找不到主类。

2. JDK系统模块的特殊处理

你提到的jdk.httpserver能直接运行,是因为它的模块描述符在JDK构建阶段被注入了主类信息——这个信息并非写在源码的module-info.java里,而是通过JDK的构建脚本添加的。

你可以用以下命令查看它的模块详情,验证这一点:

java --describe-module jdk.httpserver

输出内容里会明确包含main-class字段,比如:

jdk.httpserver@17.0.6
exports com.sun.net.httpserver
exports jdk.httpserver
requires java.base mandated
requires java.logging
provides com.sun.net.httpserver.spi.HttpServerProvider with jdk.internal.net.http.HttpServerProviderImpl
main-class jdk.internal.net.http.HttpServer

这就是java -m jdk.httpserver能直接启动的核心原因。

关于“隐式约定”的澄清

官方不存在所谓“某个包的Main.java自动成为入口”的约定:

  • 如果模块里有多个带main方法的类,JVM不会自动挑选,必须显式指定主类(要么编译时加参数,要么运行时指定完整类名)。
  • 模块中可以存在多个带main方法的类,没有数量限制,只是启动时必须明确告诉JVM要使用哪一个。

内容的提问来源于stack exchange,提问作者Tasos Papastylianou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:12:37