java模块化实践(基于jdk11)-1
出現一個新的東西必然是解決以前的問題, 要不然他就不需要出現了....今天來說下模塊化
模塊化之前出現的問題:
- Java運行環境的膨脹和臃腫。每次JVM啟動的時候,至少會有30~60MB的內存加載,主要原因是JVM需要加載rt.jar,不管其中的類是否被classloader加載,第一步整個jar都會被JVM加載到內存當中去(而模塊化可以根據模塊的需要加載程序運行需要的class)
- 當代碼庫越來越大,創建復雜,盤根錯節的“意大利面條式代碼”的幾率呈指數級的增長。不同版本的類庫交叉依賴導致讓人頭疼的問題,這些都阻礙了Java開發和運行效率的提升
- 很難真正地對代碼進行封裝, 而系統并沒有對不同部分(也就是JAR文件)之間的依賴關系有個明確的概念。每一個公共類都可以被類路徑之下任何其它的公共類所訪問到,這樣就會導致無意中使用了并不想被公開訪問的API。
- 類路徑本身也存在問題: 你怎么知曉所有需要的JAR都已經有了, 或者是不是會有重復的項呢?
請參考此鏈接對問題的描述,寫的很好:
https://blog.csdn.net/ricohzhanglong/article/details/50442343
上面這段話是從別的地方復制來的, 其實很簡單就是解決jar包的依賴問題,我認為主要是以下的問題,
1.因為我們的項目很小, 沒有那么多的依賴, 你把一些不需要的jar包弄進去了,增大了體積,良妃空間
2.不同的模塊可能需要的同一個jar包的版本不同
3.模塊化嚴格限定了不同模塊之間的不同包的訪問.
?
Java9標準模塊以java作為前綴。java se大概被分成了以下部分標準模塊,其名稱實:
如:java.base,java.naming,java.activation和java.logging等。而java.base是最基礎最核心的模塊,其中封裝了開發者最常用的包,如:java.io,java.lang,java.math,java.net,java.text,java.util等等。
Java9非標準模塊以jdk作為前綴。 以下是部分非標準模塊名稱:
jdk.accessibility,jdk.attach,jdk.charsets,jdk.compiler, jdk.httpserver等等。
所有建議,以后我們的model 名字,使用 xx.xx (業務.模塊) 這種命名的方式, 雖然非強制?,跟著大佬們學習下就自己慢慢變成大佬了.這次是示例是個不好的示例, 請驚醒.
?
模塊化從最開始說的是jdk1.7出來, 后來跳票到1.8 , 還沒出來, 最后1.9 才出來, 可惜1.9不是lts版本, 所以直接使用了11.
系統環境:
系統:win7
案例使用idea版本:IntelliJ IDEA 2017.3.5 x64
jdk: oracle jdk 11.02
?
整個項目的依賴圖如下所示:
?
非常簡單的一個示例項目, 沒有用到maven, 就是普通的java項目,
1.創建一個父項目moduleDemo
2.創建多個模塊,api,base,service,test,util
我一般都是這樣創建的,記不住這個的快捷鍵
2.1.在各個子模塊下面,創建module-info.java
?
module-info.java 在src下面
3.寫util模塊
都是非常簡單的示例方法.
/*** 貌似這個module 的名字和項目的名字沒有關系,這里叫 myUtil;* 這個的名字確實沒啥關系,只是require的時候寫一樣的就好了* 這個名字,就是普通java類名字,只能使用大小的英語和數字,不能出現-,可以使用. ,例如:com.onyx.util3*/ module util {/*** exports 標明對外提供的包名字* com.onyx.util2 暫時不對外提供*/exports com.onyx.util;/*** exports 只能對包進行報錯, 不能對類進行操作*///exports com.onyx.util2.ListUtil;/*** exports 的包不能為空, 也不能不存在*///exports com.onyx.util3;} package com.onyx.util;/*** @author zk* @date 2019-08-28 12:11*/ public class MyStringUtil {public static void size(String s){System.out.println("MyStringUtil spilt method");}} package com.onyx.util2;/*** @author zk* @date 2019-08-28 12:19*/ public class ListUtil {public static<T> 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");} }?
4.寫base模塊
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;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';} }5.寫service模塊
module service {/*** 這里需要base模塊了*/requires base;exports com.onyx.service;} 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();}?
6.寫api模塊
module api {exports com.onyx.api;requires base;requires service;/*** 如果事先寫了requires ,但是在代碼中沒有引用到這模塊的內容,這里會報錯的* 這里是用自定義的名字*///requires myUtil;requires util;} package com.onyx.api;import com.onyx.base.User; import com.onyx.service.UserService; import com.onyx.util.MyStringUtil;/*** @author zk* @date 2019-08-28 12:23*/ public class UserServiceImpl implements UserService {@Overridepublic void save(User user) {/*** 成功引用util的包內容*/MyStringUtil.size("123");/*** ListUtil此類 這個導包就導入不進來*///ListUtil.size();System.out.println(user);}@Overridepublic void login() {System.out.println("UserServiceImpl login method");}}7.寫test模塊
module myTest {/*** 需要api 和 base 模塊*/requires base;requires api;} 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);}}?
然后就可以運行了.
?
你們第一次搭建的時候可能遇到的問題:
?
運行如果一老提示說util使用的java-8的版本, 但是我檢查了,就是用的jdk11,使用下面的配置,我開始改了模塊名字,把myUtil改成了util, 以為是這個原因,后來發現不是,然后沒有改回去了
?
如果發生以下錯誤,請升級你的idea的版本
?
整個示例已經在github上了,地址如下:
https://github.com/changhe626/moduleDemo
?
順便說一句, 在web 中模塊化的需求并不是那么的迫切, 因為現在又微服務, 在不斷的拆分服務.?
一個項目中管理的jar并沒有一個超級大應用的多了,只需要加載當前此項目需要的jar包就夠了.
?
Java Framework,歡迎各位前來交流java相關
QQ群:965125360
總結
以上是生活随笔為你收集整理的java模块化实践(基于jdk11)-1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据分析方法(营销模型篇)--最全的9种
- 下一篇: cs七龙珠机器人_CS七龙珠机器人的命令