编程语言
首页 > 编程语言> > java模块化实战-2

java模块化实战-2

作者:互联网

续接上文,上文中简单的使用了模块化, 没有使用maven, 我们也知道maven也是构建项目用的,

而且现在的项目不适用maven/gradle 来构建项目, 进行jar包的管理,那才真是灾难.

所以我们需要一个maven的例子来说明怎么使用模块化 ,maven和模块化并没有什么冲突.

此文章的例子是基于上一篇的代码,基本上就是复制过来了....你问为啥, 真是个好问题, 因为懒(本文的重点不在于代码功能)

系统环境:

系统:win7

案例使用idea版本:IntelliJ IDEA 2017.3.5 x64

jdk: oracle jdk 11.02

总的项目结构是:

 

一个典型的子项目结构如下:

module-info.java是在java下面的.

 

1.新建一个moduleDemo3的父项目

2.新建util模块

填完了artifacId就可以了...

新建module-info.java

/**
 * @author zk
 * @date 2019-08-28 15:59
 */
module module.util {

    /**
     * 在导出模块exports的时候,可以使用to关键字指明导出
     * 的模块只能供哪个模块使用。当然可以指定多个模块,使用逗号
     *
     * requires static 语句
     requires 进来的模块可以同时在编译期和运行期访问。如果只想在编译器使用,
     可以在requires 后面增加 static 关键字。比如模块a依赖了模块b但是并不使用b其中
     的类,另一个模块c依赖了a模块也使用了b模块的类。这样模块a的图中并不包含模块b。
     */
    exports com.onyx.util2 to module.api;

}
package com.onyx.util;

/**
 * @author zk
 * @Description:
 * @date 2019-08-28 12:11
 */
public class MyStringUtil {

    public static void size(){
        System.out.println("MyStringUtil spilt method");
    }
}


package com.onyx.util2;


/**
 * @author zk
 * @date 2019-08-28 12:19
 */
public class ListUtil {

    public static void size(){
        System.out.println("ListUtil size method");
    }
}

package com.onyx.util2;

/**
 * @author zk
 * @date 2019-08-28 12:13
 */
public class MapUtil {

    public static void size() {
        System.out.println("mapUtil  size method");
    }
}

 

3.新建base模块

新建module-info.java

/**
 * @author zk
 * @date 2019-08-28 15:59
 */
module module.base {
    exports com.onyx.base;
}
package com.onyx.base;

/**
 * @author zk
 * @Description: 实体类
 * @date 2019-08-28 12:17
 */
public class User {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User() {
    }

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

 

4.新建service模块

新建module-info.java

/**
 * @author zk
 * @date 2019-08-28 16:00
 */
module module.service {
    exports com.onyx.service;
    requires module.base;

}
package com.onyx.service;

import com.onyx.base.User;

/**
 * @author zk
 * @Description:  服务接口
 * @date 2019-08-28 12:16
 */
public interface UserService {

    void save(User user);

    void login();

}

 

5.新建api模块

新建module-info.java

/**
 * @author zk
 * @date 2019-08-28 16:03
 */
module module.api {
    requires module.util;
    requires module.service;
    requires module.base;
    exports com.onyx.api;
}
package com.onyx.api;

import com.onyx.base.User;
import com.onyx.service.UserService;
import com.onyx.util2.ListUtil;


/**
 * @author zk
 * @date 2019-08-28 12:23
 */
public class UserServiceImpl implements UserService {


    @Override
    public void save(User user) {
        /**
         * 成功引用util的包内容
         */
        ListUtil.size();

        /**
         * MyStringUtil  这个导包就导入不进来, public 的都导入不进来了.
         */
        //MyStringUtil.size();

        System.out.println(user);
    }


    @Override
    public void login() {
        System.out.println("UserServiceImpl login method");
    }

}

 

6.新建test模块

新建module-info.java

/**
 * @author zk
 * @date 2019-08-28 16:05
 */
module module.test {
    requires module.api;
    requires module.base;
}
package com.onyx.test;

import com.onyx.api.UserServiceImpl;
import com.onyx.base.User;


/**
 * @author zk
 * @Description:测试
 * @date 2019-08-28 12:29
 */
public class Test {

    public static void main(String[] args) {
        UserServiceImpl service = new UserServiceImpl();
        service.login();
        User user = new User(1, "zhangke");
        service.save(user);
    }
}

 

然后就可以运行了了....


说下模块化的命令, 打印可观察模块的列表,其中仅包括系统模块:

c:\Java9Revealed> java --list-modules

 

 

编译代码:

javac -d mods --module-source-path . $(find . -name "*.java")

--module-source-path 命令是  javac新的命令行选项,用于指定模块源代码的位置。

将当前目录中的代码编译到mods目录中

 

执行前面的代码:

java --module-path mods -m test/com.onyx.test.Test

--module-path 命令类似于--classpath,是新java的命令行选项   ,指定已编译模块的位置。

 

代码在同性交友平台上的地址:

https://github.com/changhe626/module-demo2

 

这里补上三个链接,模块化写的比我好

https://www.cnblogs.com/IcanFixIt/p/6947763.html

https://www.cnblogs.com/xiang--liu/p/9710339.html

https://www.cnblogs.com/lujiango/p/7852120.html

标签:实战,java,模块化,onyx,module,2019,模块,com,public
来源: https://blog.csdn.net/u010398771/article/details/100123023