Java模块化JAR类找不到但javap可识别,运行及jlink失败求助
模块化JAR运行与jlink问题排查方案
1. 先解决jlink命令的明显拼写错误
你提到jlink报错“demoapp不存在主类com.dhl.raf.demoapp.App”,这是命令中包名拼写错误导致的——实际主类包名是com.foo.bar.demoapp.App,请立即修正命令中的主类路径,避免使用错误的com.dhl.raf前缀。
如果你的module-info.java已经声明了主类,jlink可以省略主类参数,直接依赖模块的声明配置,示例命令:
jlink --module-path "jars;%JAVA_HOME%/jmods" --add-modules demoapp --output demoapp-image --launcher run=demoapp
生成的镜像中会包含run.bat脚本,直接执行即可启动应用。
2. 修复模块化JAR的运行命令
你当前执行的java --module-path jars com.foo.bar.demoapp.App格式错误,模块化应用的运行必须指定模块名+主类的组合,正确格式有两种:
- 显式指定模块和主类:
java --module-path ./jars -m demoapp/com.foo.bar.demoapp.App - 如果
module-info.java已声明主类,可简化为仅指定模块名:java --module-path ./jars -m demoapp
3. 验证Maven配置细节
确保你的pom.xml中maven-jar-plugin配置正确生成模块化JAR:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.foo.bar.demoapp.App</mainClass> </manifest> </archive> <!-- 必须开启此选项以生成模块化JAR --> <modularJar>true</modularJar> </configuration> </plugin>
4. 确认module-info.java的正确性
检查你的模块声明文件是否正确声明主类,示例:
module demoapp { exports com.foo.bar.demoapp; // 明确声明模块主类 mainClass com.foo.bar.demoapp.App; }
可通过javap -p module-info.class验证主类声明是否生效。
5. 校验JAR文件结构
使用jar tf your-jar-file.jar查看JAR内部结构,确保:
module-info.class位于JAR根目录App.class位于com/foo/bar/demoapp/子目录下- 所有class文件的路径与包名完全匹配
内容的提问来源于stack exchange,提问作者BillRobertson42
相关产品推荐
相关产品推荐

