1

在不同的地方我看到了以下信息:未命名模块中的类被允许读取模块路径上的导出包。

在目录 src/calculators 我有 module-info.java 文件:

module calculators {
  exports calculators;
}

在目录 src/calculators/calculators 我有 InterestCalculator.java 文件:

package calculators;

public interface InterestCalculator {

  public double calculate(double principle, double rate, double time);
}

我已经使用以下命令编译了模块:

java --module-source-path src --module calculators -d out

然后我用以下命令打包了编译模块:

jar --create --file calculators.jar -C out/calculators/ .

现在我的非模块化应用程序有以下类(在同一个目录中):

import calculators.InterestCalculator;

class SimpleInterestCalculator implements InterestCalculator {

  public double calculate(double principle, double rate, double time){
    return principle * rate * time;
  }
}
import calculators.InterestCalculator;

class Main {
  public static void main(String[] args) {
    InterestCalculator interestCalculator = new SimpleInterestCalculator();

  }
}

当我尝试使用带有命令的模块编译我的应用程序时:

javac --module-path calculators.jar  *.java

我得到了错误:

Main.java:1: error: package calculators is not visible
import calculators.InterestCalculator;
       ^
  (package calculators is declared in module calculators, which is not in the module graph)
SimpleInterestCalculator.java:1: error: package calculators is not visible
import calculators.InterestCalculator;
       ^
  (package calculators is declared in module calculators, which is not in the module graph)
2 errors

为什么?应用程序类不应该能够读取导出的包吗?我在这里做错了什么?

4

2 回答 2

1

由于您的应用程序代码不是模块,因此环境中没有任何内容告诉 Java 解析calculators模块。尽管将 JAR 文件放在模块路径上,这会导致找不到类。如果要继续使用库的模块路径,则需要使用:

javac --module-path calculators.jar --add-modules calculators <rest-of-command>

注意--add-modules calculators论点。这使calculators模块成为根,强制它及其所有requires依赖项(传递地)进入模块图。如果您的应用程序要模块化:

module app {
  requires calculators;
}

然后您将不再需要--add-modules,因为该app模块将是根并且它需要该calculators模块。

于 2020-03-07T15:10:26.960 回答
0

简短的回答

您的最后一个命令行应该是:

javac --class-path calculators.jar  *.java

代替:

javac --module-path calculators.jar  *.java

为什么?

如果您正在编译非模块化应用程序,则不应使用--module-path选项,而是--class-path(或更短的版本:)-cp

请记住,模块化 JAR 仍然像常规 JAR 一样工作。它仅包含有关模块化应用程序的更多信息。

于 2020-03-07T14:36:56.657 回答