我有一个名为myModule的文件夹。在它里面,还有一个名为myPackage的文件夹,我的Main.class就在这个文件夹中。
在myPackage旁边,我有我想要编译的module-info.java。首先看一下文件夹的层次结构:
-- myModule
-- myPackage
-- Main.class
-- module-info.java问题是当我想用下面的命令编译我的module-info.java时:
javac module-info.java我得到以下错误:
package is empty or does not exist: myPackage但是,当我将Main.java放入myPackage中,然后使用相同的命令编译这两个文件时:
javac module-info.java myPackage/Main.java错误消失。我不明白为什么会发生这种事?
发布于 2020-10-07 05:54:13
TL;DR -A模块信息.java文件不是设计为独立的文件。它被设计成多源文件编译单元的一部分。一个单元,它包括模块描述符、加上至少一个其它源文件。
长篇大论的版本
“…还有另一个名为
myPackage的文件夹,其中包含我的Main.class…“
我假设您是想输入Main.java,而Main.class是…之后的疏忽
我还将假定--尽管您在问题中根本没有提到这一点--您是有意遵循…中推荐的约定
“…按照约定,模块的源代码位于一个目录中,该目录是模块…的名称“
因此,我还假设您的模块-info.java,就像我的实验模块一样,包含…
module myModule {
exports myPackage;
}请记住,javac tool …
描述
javac命令读取源文件,其中包含用Java语言…编写的模块、包和类型声明
还要考虑JPMS…的。
可靠配置,用程序组件声明彼此
显式依赖的方式取代脆弱的、容易出错的类路径机制
如果我每周六签合同帮你修剪草坪,却再也没有出现,那我有多可靠?想象一下,如果javac为声称要导出包的模块编译module-info.java文件是合法的,但该包中没有类。这样的模块有多可靠?
如果我的构建从Maven Central下载了您假设的myModule工件,那么我的类中可能有一个import myPackage.*,结果却什么都没有。
“问题是当我想用下面的命令编译我的module-info.java时:”
javac模块-info.java
这个谜团的线索是,当myPackage目录包含合法源代码时,上面的命令会导致相同的错误。
错误消息没有告诉您文件系统目录为空。它告诉您,您声称模块导出的包是空的。编译器不知道任何你永远不会作为编译单元的一部分传递给它的源代码。
“…错误消失。“
通过执行:javac module-info.java myPackage/Main.java,您将组成一个编译单元,该单元由模块声明其导出的内容组成。哪个值为指定系统应使用…
$ javac -d mods/com.greetings \
src/com.greetings/module-info.java \
src/com.greetings/com/greetings/Main.java因此,尽管有拼写错误,但您报告的错误原因非常简单:编译一个不包含任何源文件的模块不仅毫无意义,就编译器而言,它是一个格式错误的模块。因此,这是非法的。
https://stackoverflow.com/questions/62360613
复制相似问题