我试图从模块类中调用非模块类。我创建了一个文件夹结构
from math import pi,exp
a = pi
b = exp(1)
c = float('+inf')
d = float('-inf')
e = float('NaN')
print('Test #{}: minVal = {:.40f}, maxVal = {:.40f}'.format(1,a,b))
print('Test #{}: minVal = {:.40f}, maxVal = {:.40f}'.format(2,a,c))
print('Test #{}: minVal = {:.40f}, maxVal = {:.40f}'.format(3,a,d))
print('Test #{}: minVal = {:.40f}, maxVal = {:.40f}'.format(4,a,e))
print('Test #{}: minVal = {:.40f}, maxVal = {:.40f}'.format(5,b,a))
print('Test #{}: minVal = {:.40f}, maxVal = {:.40f}'.format(6,c,a))
print('Test #{}: minVal = {:.40f}, maxVal = {:.40f}'.format(7,d,a))
print('Test #{}: minVal = {:.40f}, maxVal = {:.40f}'.format(8,e,a))
是我的模块类文件的路径
moduledemo > allclasses > moduleC > packageC > MyMethods.class
和
moduledemo > moduleC > packageC > MyMethods.java
是我从moduledemo > nomodule > packageD > DemoNoModule.class
我能够编译DemoNoModule文件。我能够将MyMethods.java编译到allclasses文件夹MyMethods.java
中。
当我运行MyMethods时,我收到错误 找不到moduleC 。有谁可以更新?我使用以下命令运行
moduleC
两个文件代码 - >非模块类
java --module-path allclasses -m moduleC/packageC.MyMethods
模块类调用类
package packageD;
public class DemoNoModule {
public void showD() {
System.out.println("this is show of D in No Module");
}
}
模块C中的模块信息
package packageC;
import packageD.*;
public class MyMethods {
public static void main(String s[]) {
DemoNoModule d=new DemoNoModule();
d.showD();
}
}
答案 0 :(得分:1)
一方面,moduleC
(提高头脑的命名?)是一个命名模块。
在另一个时,"没有模块类"你所谓的只是stated by Alan类路径上的一个类。执行期间类路径上的类是unnamed module in JPMS的一部分。
进一步引用文件: -
未命名的模块导出其所有软件包。这样就可以了 灵活的移民......但这并不意味着 命名模块中的代码可以访问未命名模块中的类型。一个 命名模块实际上甚至不能声明依赖于 未命名的模块。
这是为了保持模块系统中的可靠配置。如上所述:
如果在命名模块和未命名模块中都定义了包 然后忽略未命名模块中的包。这保留了 即使在班级混乱的情况下,也可靠配置 路径,确保每个模块最多仍然读取一个模块 定义给定的包。
尽管如此,要使用命名模块moduleC
中未命名模块的类,您可以遵循使用该标志将ALL-UNNAMED模块添加到read by modules的建议。模块路径使用
以下命令:
--add-reads <source-module>=<target-module> // moduleC=ALL-UNNAMED
作为一种特殊情况,如果
<target-module>
是ALL-UNNAMED
那么 可读性边缘将从源模块添加到所有存在 和未来的未命名模块,包括与该类相对应的模块 路径。
PS :在您这样做时,请考虑文档的突出显示部分(上图)。
另请注意,长期解决方案是在此处修改您的设计,您可以计划将类DemoNoModule
中的代码移动到显式模块或单独打包转换为自动模块。
答案 1 :(得分:0)
Java 9程序应该是模块化的。这就是我在JDK-9中理解拼图的方式。所以,恕我直言,你必须将你的packageD'包装'在另一个模块中,并在moduleC中为moduleC写requires moduleD
。另外moduleD
应该导出packageD。
添加ALL-UNNAMED
是为了向后兼容,我想它将在Java演化的某些方面被删除。