如何在非模块化应用程序中使用模块化 jar?
How to use modularized jars in a not modularized application?
在不同的地方我看到了以下信息:未命名的模块中的类允许读取模块路径上的导出包.
在目录 src/calculators 中,我有模块-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
为什么?应用程序 类 不应该能够读取导出的包吗?我在这里做错了什么?
简答
你的最后一个命令行应该是:
javac --class-path calculators.jar *.java
而不是:
javac --module-path calculators.jar *.java
为什么?
如果您正在编译 非模块化 应用程序,则不应使用 --module-path
选项,而应使用 --class-path
(或更短的版本:-cp
).
请记住,模块化 JAR 仍然像常规 JAR 一样工作。它只包含一些有关模块化应用程序的更多信息。
由于您的应用程序代码不是模块,因此环境中没有任何内容告诉 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
模块。
在不同的地方我看到了以下信息:未命名的模块中的类允许读取模块路径上的导出包.
在目录 src/calculators 中,我有模块-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
为什么?应用程序 类 不应该能够读取导出的包吗?我在这里做错了什么?
简答
你的最后一个命令行应该是:
javac --class-path calculators.jar *.java
而不是:
javac --module-path calculators.jar *.java
为什么?
如果您正在编译 非模块化 应用程序,则不应使用 --module-path
选项,而应使用 --class-path
(或更短的版本:-cp
).
请记住,模块化 JAR 仍然像常规 JAR 一样工作。它只包含一些有关模块化应用程序的更多信息。
由于您的应用程序代码不是模块,因此环境中没有任何内容告诉 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
模块。