首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有模块化的应用程序中使用模块化的jars?

如何在没有模块化的应用程序中使用模块化的jars?
EN

Stack Overflow用户
提问于 2020-03-07 14:15:54
回答 2查看 249关注 0票数 2

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

在src/calculators目录中,我有一个模块-info.java文件:

代码语言:javascript
复制
module calculators {
  exports calculators;
}

在目录src/计算器/计算器中,我有一个InterestCalculator.java文件:

代码语言:javascript
复制
package calculators;

public interface InterestCalculator {

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

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

代码语言:javascript
复制
java --module-source-path src --module calculators -d out

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

代码语言:javascript
复制
jar --create --file calculators.jar -C out/calculators/ .

现在,我的非模块化应用程序有以下类(在相同的dir中):

代码语言:javascript
复制
import calculators.InterestCalculator;

class SimpleInterestCalculator implements InterestCalculator {

  public double calculate(double principle, double rate, double time){
    return principle * rate * time;
  }
}
代码语言:javascript
复制
import calculators.InterestCalculator;

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

  }
}

当我使用以下命令使用模块编译我的应用程序时:

代码语言:javascript
复制
javac --module-path calculators.jar  *.java

我发现了一个错误:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-07 15:10:26

由于您的应用程序代码不是一个模块,所以环境中没有任何东西要求Java解析calculators模块。这将导致尽管将JAR文件放置在模块路径上,但仍然找不到类。如果要继续为库使用模块路径,则需要使用:

代码语言:javascript
复制
javac --module-path calculators.jar --add-modules calculators <rest-of-command>

注意--add-modules calculators参数。这使得calculators模块成为根,迫使它和它的所有requires依赖关系(过渡)进入模块图。如果您的应用程序是模块化的:

代码语言:javascript
复制
module app {
  requires calculators;
}

然后您将不再需要--add-modules,因为app模块将是根用户,而它需要calculators模块。

票数 2
EN

Stack Overflow用户

发布于 2020-03-07 14:36:56

短答案

最后一个命令行应该是:

代码语言:javascript
复制
javac --class-path calculators.jar  *.java

而不是:

代码语言:javascript
复制
javac --module-path calculators.jar  *.java

为什么?

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

记住,模块化的JAR仍然像普通的JAR一样工作。它只包含一些模块应用程序的更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60578416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档