从java 9中的模块类调用非模块类

时间:2018-01-21 09:12:58

标签: java java-9 java-module

我试图从模块类中调用非模块类。我创建了一个文件夹结构

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();
    }
}

enter image description here

2 个答案:

答案 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演化的某些方面被删除。