【问题标题】:How to use modularized jars in a not modularized application?如何在非模块化应用程序中使用模块化 jar?
【发布时间】:2020-03-07 23:10:26
【问题描述】:

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

在 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

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

【问题讨论】:

    标签: java java-module unnamed-module


    【解决方案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 模块。

    【讨论】:

      【解决方案2】:

      简答

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

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

      代替:

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

      为什么?

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 2017-06-06
        • 2010-10-24
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多