Java9新特性Module模块化编程示例演绎

  

Java9新特性Module模块化编程示例演绎攻略

什么是模块化编程

在Java9之前,我们编写的Java应用程序都是基于jar包的。当我们开发大型应用时,常常面临着依赖管理不可控、类冲突等问题。而Java9引入了一种新的编程方式——模块化编程。在模块化编程中,我们可以将应用程序拆分成多个独立的模块,并对每个模块进行依赖管理。这种方式能够让应用程序更加灵活、易于管理,也更能体现应用程序的逻辑结构。

如何编写模块化代码

  1. 创建模块

我们可以通过在模块根目录下创建module-info.java文件来创建一个模块。在这个文件中,我们需要声明该模块的名称、依赖关系和导出的包。下面是一个示例:

module mymodule {
    requires some.other.module;
    exports com.mypackage;
}
  1. 编写模块化代码

在模块中,我们需要将所有的代码组织到一个或多个包中,并且将这些包导出(exports)给其它模块使用。下面是一个简单的示例:

// MyModule.java
package com.mypackage;

public class MyModule {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}
  1. 编译、打包模块

在编译和打包模块时,我们需要使用新的命令行选项来指定模块路径、模块信息和输出路径等。下面是一个打包模块的示例:

javac --module-source-path src -d out $(find src -name "*.java")
jar --create --file=myapp.jar --main-class=com.mypackage.MyModule -C out .

示例一:创建一个简单的模块

下面,我们来创建一个简单的模块并编译它。首先,在项目的根目录下创建一个名为myfirstmodule的目录作为我们的模块根目录。然后,在myfirstmodule目录下创建一个名为module-info.java的文件,并在文件中添加以下代码:

module myfirstmodule {
}

代码中我们定义了一个名为myfirstmodule的模块。现在,我们可以在模块根目录下创建一个名为Greeting.java的文件,并在文件中添加以下代码:

package com.example;

public class Greeting {
    public static void hello() {
        System.out.println("Hello, world!");
    }
}

在这段代码中,我们定义了一个包名为com.example中的类Greeting,并在类中定义了一个名为hello的静态方法。

接下来,我们在myfirstmodule的根目录下创建一个名为org.example.app的目录作为我们应用程序的根目录。在该目录下创建一个名为Main.java的文件,并在文件中添加以下代码:

package org.example.app;

import com.example.Greeting;

public class Main {
    public static void main(String[] args) {
        Greeting.hello();
    }
}

在这段代码中,我们导入了com.example包中的Greeting类,并在Main类的main方法中调用了Greeting类中的hello方法。

现在,我们需要编译并打包这个模块。在myfirstmodule目录下打开终端,然后运行以下命令:

javac -d out -sourcepath src src/com/example/Greeting.java src/org/example/app/Main.java module-info.java
jar -cfe myfirstmodule.jar org.example.app.Main -C out .

命令中-src参数指定源代码目录,-d参数指定编译输出目录,-cfe参数指定主类。到此为止,我们成功创建了一个模块myfirstmodule,并打包成一个名为myfirstmodule.jar的可执行文件。

现在,我们就可以在命令行下运行该模块,如下所示:

java -p myfirstmodule.jar -m org.example.app

这里,-p参数指定模块路径,-m参数指定模块名。在执行该命令后,我们会看到控制台输出Hello,world!。

示例二:依赖管理

模块化编程中的另一个重要概念是依赖项。每个模块都可以声明其对其它模块的依赖,以确保该模块可以安全地使用那些依赖项。下面是一个示例:

假设我们有两个模块myfirstmodule和mysecondmodule。myfirstmodule依赖于mysecondmodule,我们需要在myfirstmodule的module-info.java文件中声明对mysecondmodule的依赖关系。我们需要粘贴以下声明语句:

module myfirstmodule {
    requires mysecondmodule;
}

接下来,我们需要在myfirstmodule中使用mysecondmodule。首先,我们需要在mysecondmodule中定义类MyClass,并在类中添加以下代码:

package com.example;

public class MyClass {
    public static void println() {
        System.out.println("Hello from MyClass!");
    }
}

现在,我们需要在myfirstmodule中导入com.example包中的MyClass类。我们可以在Main.java文件中添加以下代码:

package org.example.app;

import com.example.MyClass;

public class Main {
    public static void main(String[] args) {
        MyClass.println();
    }
}

到此为止,我们的模块之间的依赖关系和代码结构已经完成。我们现在需要分别编译和打包这两个模块。在各自模块的目录下打开终端,依次运行以下命令:

在mysecondmodule目录下:

javac -d out -sourcepath src src/com/example/MyClass.java module-info.java
jar -cfe mysecondmodule.jar com.example.MyClass -C out .

在myfirstmodule目录下:

javac -d out -sourcepath src --module-path mysecondmodule.jar src/org/example/app/Main.java module-info.java
jar -cfe myfirstmodule.jar org.example.app.Main -C out .

命令中,--module-path参数指定模块路径,指定了mysecondmodule.jar这个模块。现在,我们可以在命令行下运行myfirstmodule,并查看程序的输出。

java -p myfirstmodule.jar:mysecondmodule.jar -m org.example.app

通过-m参数命名运行的模块。我们可以看到,在运行myfirstmodule之后,控制台输出Hello from MyClass!。

这就是一个基本的模块化Java程序,你可以尝试着自己构建一个更复杂的应用。

相关文章