模块描述符的主类属性仅可用于JAR文件吗?

问题描述

在JPMS中,已编译的模块描述符可以包含比其来源更多的信息。 这意味着module-info.java没有有效的语法来定义主类,但是module-info.class 可以附加此信息。

在创建时可以为模块化jar设置主类,如下所示: jar --create --file out.jar --main-class simple.module.Runner $(find . -name "*.class")

使用反射API,可以检查已编译模块描述符的属性

Path mdpath = FileSystems.newFileSystem(Path.of("out.jar")).getPath("module-info.class");
ModuleDescriptor md = ModuleDescriptor.read(Files.newInputStream(mdpath));
System.out.println(md.mainClass()); // Optional[simple.module.Runner]

还有一个用于创建模块描述符的生成器,可以在其中设置主类属性。 但是我看不到将这个对象序列化为module-info.class文件方法

ModuleDescriptor md = ModuleDescriptor.newModule("simple.module")
                .mainClass("simple.module.Runner")
                .build();

据我所知,java编译器无法创建具有'module main class'属性集的模块描述符。

可以将jar修改后的module-info.class复制回分解后的模块,然后执行该操作,并使添加的main-class属性起作用: java -p . -m simple.module 代替: java -p . -m simple.module/simple.module.Runner

有人为什么不能在module-info.java中声明一个主类吗? 为什么没有javac选项可用于在模块描述符中设置主类?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)