From 7329d2789f140e9cbb6713a0fbea5b9280ae05e2 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Sun, 23 Apr 2023 12:22:10 +0530 Subject: [PATCH 1/2] article added for review by Himanshu --- .../2023/2023-04-23-Java-9-module-system.md | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 content/blog/2023/2023-04-23-Java-9-module-system.md diff --git a/content/blog/2023/2023-04-23-Java-9-module-system.md b/content/blog/2023/2023-04-23-Java-9-module-system.md new file mode 100644 index 000000000..1a43a10c6 --- /dev/null +++ b/content/blog/2023/2023-04-23-Java-9-module-system.md @@ -0,0 +1,169 @@ +# Java 9 Module System + +Table of Contents + +1. [Introduction](#introduction) + +2. [Issues with Previous Java Versions](#issues-with-previous-java-versions) + +3. [Benefits of Java 9 Module System](#benefits-of-java-9-module-system) + +4. [What is a Module?](#what-is-a-module) + +5. [Creating the Modules](#creating-the-modules) + +6. [Structuring Our Project](#structuring-our-project) + +7. [Creating the First Module](#creating-the-first-module) +8. [Creating the second module](#creating-the-second-module) +9. [Compiling our modules](#compiling-our-modules) +10. [Running our Modules](#running-our-modules) +11. [Updated Module Descriptor](#updated-module-descriptor) +12. [Conclusion](#conclusion) + +Java 9 introduced one of the most important features called a module system that allows us to combine all of our code and packages into a single unit. In this tutorial, we’ll discuss what is this module system. why should we use it and how should we use it? We’ll be looking at the answers to all of these questions. Also, we’ll look at a practical example to add glitters to our understanding, so let’s begin. + +## Introduction + +The Java 9 module system, also known as Java Platform Module System (JPMS), is a major feature introduced in Java 9 to address the challenges of scaling and maintaining large Java applications. It is also known as the Jigsaw project during the development phase. + +Before Java 9, Java code was organized into packages and classes. However, there were limitations in how these packages and classes could be organized, leading to issues with encapsulation, modularity, and classpath collisions. The Java 9 module system introduces a new concept of modules that allows developers to organize code into logical units that can be managed and used more effectively. + +## Issues with Previous Java Versions + +Before we move to the usage of the module system, first we must know what are the flaws in previous versions of Java that make the Oracle team introduce this feature. + +- JDK Issue: In the previous versions, the Java Development Kit (JDK) is difficult to scale down to smaller devices and applications, as the JAR files it includes, such as rt.jar, are too large. Java SE 8 introduced compact profiles to try to address this issue, but they do not completely solve the problem of performance on smaller devices. +- Encapsulation Issue: In previous versions, the public access modifiers allow anyone to access several internal APIs thus creating a security threat. The weak encapsulation also makes it difficult to test and maintain the application. +- Modularity Issue: In previous versions, there was no clear way to define and manage modules. It makes the component of the application highly coupled which makes it difficult to organize and maintain large-scale Java applications. + +## Benefits of Java 9 Module System + +As we have already seen the issues in the previous versions of Java let’s look at how the module system overcomes these issues. + +- Improved Modularity: In Java 9, JDK, JRE, and Jars are divided into several modules which makes it easy to scale down the Java application and hence improve performance. +- Enhanced encapsulation: With modules, developers can have better control over which parts of the codebase are accessible to other modules, reducing the risks of unwanted dependencies and conflicts. +- Dependable configuration: Modules have a clearly defined dependency hierarchy, making it easier to manage dependencies and ensure that the application has all the necessary modules at runtime. +- Improved performance: The module system can optimize the loading and initialization of modules, resulting in reduced startup time and lower memory usage for the application. +- Strengthened security: The module system enables developers to define and enforce access controls on code, making the application more secure against potential vulnerabilities. + +>**NOTE:** In the module system instead of JAR, modular JAR is introduced having a format JMOD. It includes configuration files and native code. Also, Java, Jlink, and Javac now have additional options to specify module paths that can locate the module descriptor. + +## What is a Module? + +The module can be considered as the collection of software and Java programs that can be treated as a single unit of deployment, execution, and reuse. Each module contains a file named module-info.java that defines the module’s name, dependencies, and exported packages. You can think of this module-info.java file as an ID card of the module as it describes the module. + +The module system is different from the traditional package system. The packages group together the related classes but they don’t provide a way to control access to these classes. In simple words, you may have experienced that a package can be exported to any other package in a Java project without any control whereas in a module explicit control can be provided over what can be accessed from outside the module. This shows that modules provide a lot more encapsulation as compared to packages. + +## Creating the Modules + +Now we have all the theoretical knowledge about Java 9 module system let’s get our hands dirty by doing some hands-on. Here we’ll create a mini-project that contains two modules. Here we’ll learn how to import a module and how to export a module. We’ll also learn how we can control the access of the packages which is not possible in Java’s previous versions. + +## Structuring Our Project + +Below is what our project structure looks like + +![alt text](https://github.com/H11199/module-system-structure/blob/70c7d175c117e04d3e6e6a2b3bbbf9d1e9c5f019/Project-structure.JPG?raw=true) + +First, we’ll create the structure of the project. Here we’ll be creating a lot of directories, therefore, it may seem a little bit confusing but we’ll cover it in the easiest way possible. Let’s start by creating our root project folder. + +```shell +$ mkdir Java-9-modules +$ cd Java-9-modules +``` + +Now this Java-9-modules directory will be our root directory and contains all project-related directories. Inside this Java-9-modules directory, we’ll create one directory that contains all the modules associated with our project. + +```shell +$ mkdir project-modules +``` + +## Creating the First Module + +Inside the **project-modules** directory we'll create another directory named **first.modules**. This directory is nothing but our first module and contains packages. Create a package inside first.modules directory having a structure as + +`com.demo.helloWorld.` + +Create the Java class called HelloWorld.java inside this package. This class contains a static function perfromOperation that prints a hello message. + +```java +package com.demo.helloWorld; +public class HelloWorld { + public static void performOperation() { + System.out.println("Hello readers, I'm a Java Module!"); + } +} +``` +>NOTE: we can use any module name but we should also keep in mind that the name of the module should follow a reverse domain pattern i.e same naming convention as that of packages. + +Now to have control over this module we need to create a **module-info.java file** inside it. As we have discussed above, this file is a module descriptor. + +```java +module first.modules{ + exports com.demo.helloWorld; +} +``` + +## Creating the second module + +This module depends on our first module as this module will use the perfromOperation function inside the HelloWorld class. To use the first module we should import it inside our second module using **“requires”** directive in the module descriptor of the second module. + +```java +module second.modules{ + requires first.modules; +} +``` +Now we’ll create an application that uses the imported module. For that create a package within the **second.modules** named **com.demo.main.** + +Inside this package, we’ll create our **Main.java file** that contains the application code. + +```java +package com.demo.main; +import com.demo.helloWorld.HelloWorld; +public class Main { + public static void main(String[] args) { + HelloWorld.performOperation(); + } +} +``` +## Compiling our modules + +To store the compiled modules we’ll create another directory called **compiledDir** inside the root directory. First, we’ll compile the first module using the below command in the terminal. +```shell +javac -d compiledDir --module-source-path project-modules/ --module first.modules +``` +Now, similarly, we’ll compile our second module using the below command in terminal + +```shell +$ javac -d compiledDir --module-source-path project-modules/ --module second.modules +``` +Now, after running both of the above commands, we can see the compiled version of both of our modules inside our compiledDir directory. + +## Running our Modules + +Now that we have compiled modules with us, let’s run them using the command + +```shell +$ java --module-path compiledDir -m second.modules/com.demo.main.Main +``` +On executing the above command we’ll get the following output + +```shell +Hello readers, I'm a Java Module! +``` + +## Updated Module Descriptor + +If we can recall, the module descriptor of our second module only contains the first module. But now, if we execute the below command and have a look at the module descriptor of second module, we can see a change. +```text +Compiled from "module-info.java" +module second.modules { + requires java.base; + requires first.modules; +} +``` +Our second module now also contains one more module “java.base” that we didn’t add from our side. This java.base module is actually a default module and all modules are linked to it. + +## Conclusion + +In this tutorial, we had an extensive discussion on the Java 9 module system feature. At first, we saw what is Java 9 module system, then we saw what issues did Oracle team face which make them introduce this feature. Then, we saw the benefits of using the module system. There we learned how it provides better encapsulation, modularity, performance, and security. After that, we saw what is module and how it is different from traditional packages. Within this, we saw what is a module descriptor and its use. Then, we created a mini-project. In this mini-project, we created two modules and saw how we could export and import a module. In the end, we compiled our modules and ran them to get our desired output. Therefore we can say that in this tutorial we got both theoretical and practical knowledge of the Java 9 module system. \ No newline at end of file From ab12194bbf973cddb5c461a3fa96fd1cc58cd92a Mon Sep 17 00:00:00 2001 From: Himanshu Date: Mon, 1 May 2023 12:22:42 +0530 Subject: [PATCH 2/2] Java-9-module-system article added --- assets/images/authors/HimanshuAvatar.png | Bin 0 -> 43259 bytes .../Project-structure.JPG | Bin 0 -> 23374 bytes ...1-Introduction-to-Java-9-Module-system.md} | 112 ++++++++++++------ data/authors.yml | 7 ++ 4 files changed, 83 insertions(+), 36 deletions(-) create mode 100644 assets/images/authors/HimanshuAvatar.png create mode 100644 assets/images/posts/Java-9-module-system/Project-structure.JPG rename content/blog/2023/{2023-04-23-Java-9-module-system.md => 2023-05-01-Introduction-to-Java-9-Module-system.md} (60%) diff --git a/assets/images/authors/HimanshuAvatar.png b/assets/images/authors/HimanshuAvatar.png new file mode 100644 index 0000000000000000000000000000000000000000..86d88f37c321aca68ba7d03bccc6e37450dc8471 GIT binary patch literal 43259 zcmeFX^Ot1N?>5@DZFAc0X}f!-J#E{zZQHhOThq2}+qyNM_lvvkzi{6lYSpS!=j3E( zC(llvBuq|593BP-1_%fU{+EQvA0QwQB*2Fe3IcFtx$;jB;0xH{kGK#}^%UMI5D*d2 zFA+gSSM7@|NLRGQwUO_23wI$9>II}f(0K-Z{`xkU-0T2$NpbJ|rKRt|*nc}6L*;zVRxUV-xAiI7Z)Ac;lzE7tq80LmRApw&J zfQ14f6M@h|kE%A89Ete;&ov-uC>*f={cQn4Mx;twfbhRp0RMyj@2~&+|Nphm{}25` zKnN_{ei+`_Ez2#|EqJ_hi`bVz;pnjl_{z|=>(*BmB5eY8l;@@ov~6PlevF41n}=_7 zgE?&)G-u*4VQhmrX97NL`ZA%9E@4dFQ;t=L!X~y)d+@5{jwl zHyD|)FIb@AZ|N{GZa=;Kk&*KCDg`6$Z6>~)4%MUk;@)%VM7J)n7fp57jo-bP-f;Fs zkT6YSG%9QY#Vg=NokB-(H37r5mHGNk7B8SAF@VUm74!uI!$cc{K!zgqlYcF^(63*GjW*VFA`oVUE-HRCnfcyLn8wK^8=L#xR2l9jz|xr?WgE>Vw)D` z_~ugF!*3EeP{Hbl7sYlQswN$!3#uG+h?oO^D2Zgii^h_(QH~=7zH0m5cN}CA+Ae}_ zI9WYki95QGNaa9A^7~{Www}veS;&ZoNa0jxLtX0$Zf`y zlTPNIxE{?a7DSQEn!AklWv|{Sn3=3zlYgTF23TeX>Yrqs&|V#=10&3CYL~`oUvW zTE(Htm2PM|ZM-LOw@e|qQK0c5pRfSLdx=Rv49XBObnK|5%{yjHNRP-wbS3YGZ&yT@ z#aTRXSZ_8ThS=)3Vi@S`6+E}!%bf)Gp6Q<6kE|rV0A&Mw1}P} zDlU`=j;t#Vh-Yr?1+H)?z^$u9EiRGK`H56X5=b*x7I};tf|TlFAbhWpWB?7~3T3-V z#fW@PZeY^7SQzwyWA{%;dhw#FBEIwU+xPrWen-|5gZKdqmpe=R6XaF6{&^g)7;cPQ z2Krv6w<2s)t<3{ct8$pz%$^7g;242&;NiryVBx_SkN2(I&!Zd8UaENUsAec~=5z#I zw;$!@Rs6qEfsE+T0XG-^F$+6R%gMpKf>OF|)qfRTWc zy1gtWufRYA!Scg^phHc|DGu)dKIng2*8Sx5$ea^XiUh2OM1)Kn$t8!D34oeD?BC2} zWFX*bY4q(#k`m~7svlqyA~OP^B!IQ$m!>BEB?fs72zLCdxrDVR2nP1cS0s>VTu88v z5&)9CEN8^JAmGBmmmvdEAtKPNVrV#%A~RT_2>%`~h)x7&xo0FZX_%OmmtqX{rGlD~ z3Z(igA_zeNcvwta5owe#{XJ@8%h_0wO!${Xu&)YgOM(6K6W$n^RG1h#V3G1lGG-JB z{5;?2X+?+1X2!B=5m~;nISJ}qP2H7{C$W;#xC3+&(GfDEjOBM#&6+SHAhLo<^kPN2!TQ5cwpMqTU^*IP z9}DqMT&aViaT-7EwMJUi<3p)bbbLGkaL_REJSDzDx7EDZDY-0mL>vGDnUtgS#jIs! z`O%MxF@d?v;)8`BkZ#K1rP~Kz1aUd68^vUm6Mr@S+tjM0sJ%`xM8Ygfm*&gjf&Bc| zQ52cUlBiA1It%fzKxDZy5@G=mA+n%+#u%jBdjeBd5pLib;={7P_=nHp9@&XGtpNW; za`_~~^xCTZNI7gyPK%e!L`lW~E*d_XEjdF|8l=`>0_-YrvH35arOeDY${$u$ z{G&YdMT7EkZzx0pHOypkhH)hlAVLS=iGN=Hg~DIFVp{4$skYx4KwW=hoj-%Jd7+{5 zR6_UeQK_(!TcDbkV4)$AW6^-!lZeagBk0snkn}53!S*K!wRx0{ZM5KH5@a$Gbw7); znE}tgK_OXx0YXRvHyp0l|Hr-3y-nxIaR=G+v#5p}JjJJH+^xe0`2MdhBh6A=yFiAMQkCw`2jPomU`T{|$ zumoQuF?=%YAxQ3tA$aGZbMDJ@XnLLHJkyHJFglkUh@5$nU+jNm+~->LdEDlIZIZa^ zZZTJ?YW+~-`9&!`a+5YKM1HTAx>QG@bl&!Qw<~rE5_chiB(?`ItUTl|(Yo3-uDm`9 zAFB*$mLGC^Mu<`YMfOF7trEOyOE$Hzj!+mF}j=V(7ErzDEw3z>YF8^;ojhDxs>r)O@@Rj!!JIp)*xf*ROrH zm$MM1%J;CY0I4$3U5D+yShoCiMX?jSjJd`ui_^v66&kvamtO);Lu1_YMyHO0>vm7fI>1y=oWIkz!^cnu6XQ`j^*T%U`bHC!3^_!q z4FI-54Q@eEzLx&GQN9v)@;&WdnK zjz+udk@CZyRw2DCd8V>?P;xxGc)+;!PDoVBnHVjAWC%F$R5I0(>TEPq9Y+m^R+1?$vF<;a@JFPJdfOL4fI<}N>(3Htdj28!v-jvl&2QsX zR8LQGTX;H}_G&qb2M<%jp|SsRvn2G1PK=uu9Zv>;@pvOdy3<$mVq6QYHOh0mzkxHf zj@vXpj0p{yA0#CQpbJ9wmte(Qem#76VCFZeZS?FgX)rV}D=?WIAZfCb6GBvlj}!M+ zRGI2v=1E}r+SyoLunagxb1F-8?Vw=q``tlQrjqBNuh56a} zJa?q`ivV>S5xpq^P50l(!_g-`Xu%daFCg45R|x2`BJWHr)B()%wnAf!Qv7WE`E?JA zuN65qgU9^U0qc6_71V-Hgr4U<2?&_NGf%oCnXU`^ZMdJ$#F; zaUz^3J^-QQRsL9`sLL6pYhEidY#6AR*c#lL(&(pq>52&Rf9v-Vx4Qo3n@e!tu5v%h zvKiPQz7eiF_)SJmNn$bsgr~uSWFmw0SEUWyAZ4}acHbtWz(TO%PsFUlvM_$m1od&B zx`|c#+D|Vr>&Vtb#uBtqRU$xGnOfqB?i|{Wo1iOif)m_u^91s}BZZrC!X>=MzX|51 z@SYm%eVDLH;iLsQ#9$*x$6~6A&WjrzE~)eM+$@)Jx&An8JZHKH7XQhR0K#{0Zk4mG zZ2AIuJUo_L3VrhqPi)RQ2m5t-nSB4GrgU$f^~2gH>J;K|$_+8^w8PCmU;}gZX4$aX z)sg9G@gl;~+aBD}oirY0KQ<{jG}CX4^F8$i*H4i?CVn+G1vriz;QxLsSLIgT#YIoE9fvbSG`)$GJ_tM zV}d$Fv99ymP~d$gKjK3$c6F^>?-DB57;)evzJ#eFu`>OcewvNS$ih`)q1ZegUUM^E zHzYAae>y23IpKJJdr07T{6?Y^wqc&reRntZ`^uc5lbbdLWHuz~Kd|))t`*g%HqPa` zP@~mC28h`|?y#MEcvuEQ+s>2Y)5Cua4ft!%_YU88Y^UsIF(~(*9~`ZirwKt_dl>Kc_>0^80j%(>qS}L|uKs!bxmK zR#1cteg7>fi`t{n`pVJGPWN(({Kb=P7ia)71WXZ(dKCsl7lK_K7um>Au1-Gi z>8CyuCmn$>#NfOIWb=)%Wlv2W=(OhzceC=P|MWh>?C*p2F*xYd8*d|35Z!7xhJ{s( zN!kS+JdBV75!-)NQ8n2I(Q}AU5jzeiTzmTo1I~%gVoBOv9mecT>9I#tPoXnhr#pB$RZDB#i)7;T(lm7e54=d_5(D>} zPPQ3<+_pkmw1(Gu!b0Q!bW(j~8PPj7w_?~-)y+g#9yy@R2k0$==Hr^huVcJDIARuW zS+B}rfW~wAXxSdPz)oF6NS~?hFDd&Mwv6A21jGkW_ZYrT-u+RP#`lLD(5z)Un{1jP zdw}(*oS;s2K{u1^ze>du3k3LPs4im7yi1D)!7!Xt zB-9k&23fo?-08fY0atK3`F+{$9uyi5m4OBN3x#Zj=?;A1>P~(VrQZr2lLHUc=hc5_ zeNf_nM$J|L_JG1Y8|Boup4!k~l*a6*f1dN03bb0L&=z2PW|vA+^cex~JVu0k64qP(m&@};i@Mx-p?81Jc$}Vcut`kn zqc$B?!HX%r%0Y2cqp;{X)XR@*ryJm~nwfIK8ghE+&FgtyC4EJ#f#w0{-bxG`!B5+m z4ptbbBhiBj961whTFeq)D@dlNjk}NER=t1c%vHJ9RvizkE@Rhq1ka%3_`SH44x8a- zS8B532nRlOfI4SM2l@cjJ~A9Ra+6zC|DAi9nhWaovudqq{ncL~*NI8X4sgrq&idB3 zOamsb^46NPBRD8*6gWSZZkho^3zr>%OW>EzIBrQ2>yOpZ4x4JCR>o&DG;AxIjd+_@ zH6&npq)dSPK4>vLEVsOg=JvnESwxYh(IR!<<87s0E(j)ivox?%a`D6j&=)^f5ROFV zqR>5NR@eFqO0J}75||mCx87>sFURz%r@D=m#m3sS$sVtgMX1eIAtC>Mr1Ed!_>|o1~xIsE=jH7rM2g$26?&5b;vq$aY4Ni zbEM~~$_Yzw2+d^fhoM>4W19VXoeJjgHB31u8wxGpwDG5tw)LCbUUSoG68<)?(8xom z7Jt#G%F2eVX}Z1+5|11m&Ug;K?5?>9Ac>Ke?LEBJze>rd^E6m=swQ&o-tjN+_5Zg5Q^kIZ(MlI8wsRYlevC;0$8=@-zNzDybC%9L zVMv3%@2qVTZbM%vs33vUDY4E5LzcfkT<)3!24a2i!U;6U5)(TH`#fLKaH|^Wg<=<> z>8SwplpTs@Mao~R@n-cVN*Mau9&p9iiOCbyd(oW!37piR=VPh!1o$&4u)yEBd6VHO z7*&05bNIGgm6^fRF|tE1;6<5h2WzT+TVLb&LG1~x&5}3=34BrE-rc*MRYaBD&$^c|N#QG5{4ifE=!F)w+n4p8{7QXDLq3}vh0#uZ1m>xpvT5fRc1D3q^GRjy z=!|Sa)a>`sR~ZSACqOP=I6C2lfljgLVMS1+iz)eqe>l|!I9T7^h>?>k*j!JuBji|F z$qT<0!k|L4dKogF^{>8{b_A@na{e%3$O`TXUq6qDwQ^BXZA^V&Ehjm~h_!}3Pa;Bx zcHhEEUb`hFLrT)Mi)U)5m7X>29vSSIui&E;u*hWlzSHNR{n0rS`A5Pypq@}lDhKl5 z5)a-JxtGVNU)`hQS~^ruv+!U@J4Fs_iaZ9PMS-8tl`OZYA6eC(ymv?Cafsu6Z&;lU zzR}nV)vxiBf)et(%S(8bp(2Nhfn0yrqQmlOLDYnNjwSQ8fh1roha*Ua^>KY4febw6 z!)giv0}4>vI-OPXPxA;-%D(}KPu_PZ2%dLn7VQsb{%p)=M93i0m&%%~?^do^7Yvs; z_Q$vqyjPmDaX4nRUc3zgKG7#2DH6Q^{82x_{98#=VaYW+wQKWnTxNSkVGFS5!%O4G@ zHL!eETNES^nhS-Zr_Bz$^ga;S2qjL)WctA^j%&Te5Hrt1ewqFz6O4u{ar{u<1t`x3 zbIR1Tt@kAUcRYg=s4`Oz_a=VK(tx9~7!IeTBRA?w*rLWsRBYs^7PCmdvXn&~I zwL3wrXjbrZBpVQk^NM9qC>Y-#bL!kblXIaDcyHnN#3B*eyO3}Z7B~_4^7Xf!p7lr9M zlO6QS(a_F1q*W>o3UC+_lrx5qwbbCt^N;-S-{oso1m!JJT@;kg8j9o;@rHmiGgr?0 zR(ICQ)Rr0^*><`@viVsj)4rdR$M&$Ub68{;&|st^OY8>IuI6CwxZmE;dxq@6|Nz{p}-6aHh&4fQ|Lmv}z#x7V>Wb(qdcZy48TXxkwdjXD7U#Vtuxw2z#6JOU`|am(UXu;*^ouWT#e2t?}}1duO=L z9Rlh|%>{p5XA?MoH%6;lIN30OoDdd*)eFn;WCsEeVv8E}nDTGftF4U01w~r#yF12N zN)8dCH)x*cF)q)p#^e3+$AJ-p0|gxsHn^kA(4Peh)bd${0`a84$iYG)_#RH9p$J!Y*i(HrT!Od7ZQ7zQL~i|x#KF@VQl#+BH6|D*0UEoL8fdd7sbF9uY+ha!Mq3mSUtH0XFk6|+ z`+aM$EbdYFskcL}d&3FtR^tCLS5)r-HUr2F_(i7EWKW#;Q{+r!M61ew<2Q+nplx1) z?@le*{SP|CYL-*N!SA#u`tb$yZ*5rcoJw zMin~CSlr2#>1r5#*B5I-)zgxL;5z`$2A4kdeaFEpmQuYvj&)9Ajb_UVrS_Q*i;$!iTK>3LY5$9-?d_Z67D1q8riQxtoR~Z7!V{ssg44j9&xzB$LtawP_4}b`bNA z%jkns$6M}>8f3tI_1)KrEr?b2I5ZlYFk@G(CkU(QlEHn)jbMdt=Sd~|`Kb14bH)E= zYyyRLUMzG1Czd~JIGK|WQ2FA9gVg)#B^BK>+sqxd7K3g({4a$sfl!cW#rq62@F1U8 z7tLrpL;(Re&kR&UshfRI(1tU>Lf$1$el`L`PK5`OP~(LRMMRXVXt0;x)eo&q6!$Ml zM~q&0z?9(3hYA1#i(u}OGuF^DnwQa?6=jxI(P1RoxozW1!|UmKlpU+h6$uk4gwC}6 z^x3^{?LZXH8yu8<7UvQXe4AceU7q+cCyi!k3j!AoCK4-}Cz`+;pzftdfwaRwn>6K{ zqus?MF}Dy20Hbb{6L|rF;IJIRlZuGaOWBAY0sl@NB2~IlMrjQbcF(gs4nAPBsy0I? zPZ^CCe%Z5S#2kJ$UZ}Z+KtRiz9txnr_>G$;uvDDyNmv~SUnGkS8Ie0S&~)M|O@$TC8s7|TNs|gjzlHTx^I{og^uV{4UF9IZ zc_JS&6ro>&jXVAo5Q~3fD03^9;W?htGlto{zXjc-GC)Y_d&S|>vt$)lx(DK3L*3OH z(@mq352$XV&93ETV}9La;9IhcswD#FCPC{40jJiL@b}eS@8zv?p6N_k9G;1Ye&*J< z$)C)=Z$#cMRMV^4+@=BlVrP~$t}0V=jz05iF0C5H(Y!y@xynCsm8tXezZ8GyE?C4S zqeXb%GD(CkK3_={(iLyqL1;Q#w9L-4PwhmgSGLe~Hp$6S?tlx3fsg=U9l2j6UAD)Z z)|T$@S>jsrK~x7{JtvFLV@#z7(5+}KM}kh`d(Y0ynBPT!R}+YdJV=HLDw~5azmeVD8ViqPl4Pq-4Bcb67gQ|rT!@2_Yc)^8~2D<8w zmTcMf=NY!E?Iz?U0fqhqKPE5_m~NXTPu{Mt;^KUv7!wILE|?d&lO7OgM`PB8xr=+- zdOG&)j8waKriiMbYF4vB=~mR%12-Yl>nfVDtr1=HiB~KgAd7Z4_9H&}g*Rl!dA_K|I-&Nd+I;gh>iqtSpB{tv}~gwj&^@_;x+$RX58N z^iROb3Vau?FnS==bgT_KcfPIKb7uDMYO~Vf8`wj>i3X`=&s+PzvO7FSq@Oa=Jt^Vk zIaqdANNDtTn>aq_Vu$uDK2KI1VX~{j?Y#}7_F~cb+@Pe=BopF?X@(u%+h7U=@`lvb zRp*_Cewi#`vS!yk-dvW8W ziiorARqoytYbxH(iXVX9K+jZ%bgf&G^0NMF@TIQzJ^I^#rynotzGGg%E2Q zly1a?`HuC2)C=mY?K&k194qLXRhh&m9!q+C!t1GcIWl7 z??w;C6XrM3bo^Q2DoBg0rf;0GF}NZd)+b`%TX7{F>K5<%q4EwYoCv(=Ogw4G+SB1# z@wPwZPA{)f83V{da(qiFmqRWUG@_5>PMmdP1@)g1)CI4v+jn%T^6d(a)Wu|jI~NA9 za*Tm(s1$e80ZyAX6;rQ0h;f{6gQJktb5LSuRuRS+XABr-FPXv8ARxWmNy#iK z8IRkpX4A$w5X)!d^}ro%5%5XMF*({DWwOozrxUd87R^8Pm{w=Zo$}`oL@E};of~i| zD$wDroD~Tz0~gPNVYR>8;Iwl9>(r+w^p^X>@Wp0^0nz7t6A39Y9-I>hM%geU@j zQ-_Gr1;`f#E0+lP%Y+yPK!n|@KSaz570KhjVLM=VPQ!N02OY7q;H*h~S%pvdxI8nO zU~YKtLeH2hb_G$K<*eh$bUuvL0GkA-exz+uP4JK1LSQxGU^$teG~uXTYNuYXFR(l1 zch3j2H-OS*AvmsFezj|8(tqcxwunQ-EJFsxlr_O=f9G^zeom*4BUJIZ2tynhm1rLM zeQ!XI>amu`WhMK2L#tysaSh@oNi3Wr;}(eJYr_jiB8+jdv6_?DIJMu+PS>^+zvFU@ z_;ljhH$|&_&su8IgHqsBnP>r6X_QGfhy+|{D4-ZiXZA%dr9Cx$d?_Q+8RLB`%6_$$ zstA*&tx!UpwmjKc$5g8oEt}!1Vs_R>wV63H(Tv4IOlT{18g;Hr+t8gZHy0$hVBvm} zJ_bg(88gG!SI?VPt(!NV(MS#=ZWeF@`-WUas<%OT+N`vJmL-*|N1Gg@DSwGyjBhSE zrj0l&T6_zvPWf#E;prHtIO$cUO`LiyKcl%SB}ZS)8_mgv%Hndl$>>oYegJy4ap}6f zv58=CzgS47u-;NWoMgSi&hR^;g@_bz8FvkCCvTvtlCjNI?la}j(DH`RuUyF(h_wF? z7vbXE+9zJnQ+{kM`d&WWQCQ3}y!ZaCjj7m9P=ncl(3n@e6{sbBxzb$&-;p6@YJLh= z?!(GHXO=j6h8Z$}c0|Zaacn|F$;boBiwDcn%RwLcuEU(a-~0cT_WJ} zJPrKKq5nwEH=2x&Xlu**r;Sp_mk&r~1eNgG_o3!OH+PBT#oLOj=W`DB=8;3~Vr2d1 zq-swCf`)~9T}$4(*Li+mpTSHRv^ri+il2PITr4;35WghxQAvI=dXkeg)%Lu96ZiS- zDsi@GV%!cNBO3yE01A_{Dpzi1tLLZuE;g*J$Sx_N7|BKH!%ylh z_b;}e!3_D#ZA9_$jlQ`mn1Yc=7}66RG;-e0iS)c^zu}WV>tGFZ3?P4)ugS@;hdQmF z*Y(J^v%u2UKCL-^ggW9WFanK4N{slD?Gk4Hg&LYfX;YcD9B6e*e~-4LJxvx zejn1;l)<@Uc_a3b1F(K)0faP+&jm%|Mj7r`R#^6nJ^8UhhJWJUD&WRoLQ}@+a+1^@ zF-445L~E9N7z!OL7Eq@j=Oz1+pm?Kj;y$vCXqw%1Q`swp{inufCI_(*L zyRhl4cVF39q5rPbk1?=S=c)f=P^<6sGqJkb#QcEg1{pcoHmL>Mi&K%4bIVu^&&2*$h#LV|O;1 z$7yjvR7fd)gymx_JwBcBwA&%=QCnR8P8Xzk@SEM8i0EEm*S`PQQDFC0cWzI;e~1Yf z+!G7a;-{XNwG@Z=t^I|R?h)B5{BKAxJAN4aNvG1!OG&(!TYT3`ge&~mp;#zWw%=0t zyif`w2t%cUyK1c7xkHiH9G62exX-!8e#TisKkx{%5(S1&IY{H&7_3@I=z=gukp(Jjj8M_Nz{%)`Qt(WJ$fhh@Fh&yx|Hu<-C5vz!&k{Y!886^?6 z_}qRoXXsSWU4?4ok#VbGMAxjy(Ys3qjGYE!zps=OAMID76ZU}0usfU^SS4|}W-~S+ zFj2#}*}7!uDcoYb==IT;!HXEOet`XIy8KuT!p6`4f+l9chw)EeLKPJ@hnv35LkquzdkMg8>bKs zANBL(0if2dnbw?{zLUqn39l}gGkSHo#aluVFm8B^Qt&K)^qCkJk#5~v(k50q8=xsN zIG6oPFCl?Wb!)Glh4KvgAb~$0yL!0WjmFGqTjuxk zPMA6va%RP)TUy81QZMZxNp~=`k8lUR-I7u0k-mHjz>r0P92NIyQadoIF6$i@r#F}- z{g4iU4;_kah}g8sn= zNayInTAq6BRU==Dt<_>90cv@sS$(o+IK#nGETHv1xey3{-VOO1Fj27)?2A1NwCa^H znj_%2HWxEk z_Vt(z>$yJm9j^P>TQ#lW#w3PcJ_LQjHS(6Zt?pP4G(UAyO+{lekh$K2JHj0e3MdN- zSi;PK>vH>9t(sO}%vdpFYc`hnZxB__1061HrgB9xe;PvtKf`+KrASc($Q1a?6a@dK ze%{s}{qUJsgKCq42ogfTj{a!5i244$nfA~>e|+6}eCz!Ph={9zW%m3 zGPkb5q;J7w4?$Hc#E|KFJRM+sx}7d${oovT%AfVzjr_pc z{iGO{50}+N{VGR)pPzSeS zfF&kPB4Wv!r0q8Z3mQ6l_+DLacocx#(opuBn%Y`_GL{_WFL5UeZ8a;B4GEA zvWi`^+xZqVD|lL&E=5OjprMVa7G2Ze!&(2Aa3R?<6M3J{W^ELMDuOd)rp0%A3k&Q`M1+MR zw;1pg|DJS~My#T&S=Z-J8eZ1FTrox-uAkk`)>|QCV|sEHxx@Bs0mvP~*D^qjcCsx7M4>w z5(|n+i%bN5loiGI#h^}3Qj)Z4Yv)|gu+RkJVu!_Jpt=o!*LqKkVqV+oA=mLS+OCAE zaZ!W`?O<=!$|4A=W&eh)dEymAqXxEn9c$yHKOSxSz-fX}D}&ZGCMf(!t#rPyFb!Du zI#@YjSX$nBe`L!a7J9tu_7tk%0CcvzCiKw>p6?A3%e&Q(wXaK2k-q6#Jaw!WWzh-D z?L^U_f#n%#!C7Q^>$iExi6K4{^gp>NPyBp1#I+P4*SP3>_FO%0DHhnn?=ck1U8W1v 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 literal 0 HcmV?d00001 diff --git a/assets/images/posts/Java-9-module-system/Project-structure.JPG b/assets/images/posts/Java-9-module-system/Project-structure.JPG new file mode 100644 index 0000000000000000000000000000000000000000..a78ed8c06e3aa57b9fc71623298d7c120a5a1190 GIT binary patch literal 23374 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 lA!~%x=UdSR*z86B#W~quPv;c +## Introduction The Java 9 module system, also known as Java Platform Module System (JPMS), is a major feature introduced in Java 9 to address the challenges of scaling and maintaining large Java applications. It is also known as the Jigsaw project during the development phase. Before Java 9, Java code was organized into packages and classes. However, there were limitations in how these packages and classes could be organized, leading to issues with encapsulation, modularity, and classpath collisions. The Java 9 module system introduces a new concept of modules that allows developers to organize code into logical units that can be managed and used more effectively. -## Issues with Previous Java Versions +## Issues with Previous Java Versions -Before we move to the usage of the module system, first we must know what are the flaws in previous versions of Java that make the Oracle team introduce this feature. +Before we move to the usage of the module system, first we must know what are the flaws in previous versions of Java due to which the module system is introduced in Java. - JDK Issue: In the previous versions, the Java Development Kit (JDK) is difficult to scale down to smaller devices and applications, as the JAR files it includes, such as rt.jar, are too large. Java SE 8 introduced compact profiles to try to address this issue, but they do not completely solve the problem of performance on smaller devices. - Encapsulation Issue: In previous versions, the public access modifiers allow anyone to access several internal APIs thus creating a security threat. The weak encapsulation also makes it difficult to test and maintain the application. - Modularity Issue: In previous versions, there was no clear way to define and manage modules. It makes the component of the application highly coupled which makes it difficult to organize and maintain large-scale Java applications. -## Benefits of Java 9 Module System +## Benefits of Java 9 Module System As we have already seen the issues in the previous versions of Java let’s look at how the module system overcomes these issues. @@ -49,17 +28,17 @@ As we have already seen the issues in the previous versions of Java let’s look >**NOTE:** In the module system instead of JAR, modular JAR is introduced having a format JMOD. It includes configuration files and native code. Also, Java, Jlink, and Javac now have additional options to specify module paths that can locate the module descriptor. -## What is a Module? +## What is a Module? The module can be considered as the collection of software and Java programs that can be treated as a single unit of deployment, execution, and reuse. Each module contains a file named module-info.java that defines the module’s name, dependencies, and exported packages. You can think of this module-info.java file as an ID card of the module as it describes the module. The module system is different from the traditional package system. The packages group together the related classes but they don’t provide a way to control access to these classes. In simple words, you may have experienced that a package can be exported to any other package in a Java project without any control whereas in a module explicit control can be provided over what can be accessed from outside the module. This shows that modules provide a lot more encapsulation as compared to packages. -## Creating the Modules +## Implementing the Module System Now we have all the theoretical knowledge about Java 9 module system let’s get our hands dirty by doing some hands-on. Here we’ll create a mini-project that contains two modules. Here we’ll learn how to import a module and how to export a module. We’ll also learn how we can control the access of the packages which is not possible in Java’s previous versions. -## Structuring Our Project +### Structuring Our Project Below is what our project structure looks like @@ -78,7 +57,7 @@ Now this Java-9-modules directory will be our root directory and contains all pr $ mkdir project-modules ``` -## Creating the First Module +### Creating the First Module Inside the **project-modules** directory we'll create another directory named **first.modules**. This directory is nothing but our first module and contains packages. Create a package inside first.modules directory having a structure as @@ -104,7 +83,7 @@ module first.modules{ } ``` -## Creating the second module +### Creating the second module This module depends on our first module as this module will use the perfromOperation function inside the HelloWorld class. To use the first module we should import it inside our second module using **“requires”** directive in the module descriptor of the second module. @@ -126,7 +105,7 @@ public class Main { } } ``` -## Compiling our modules +### Compiling our modules To store the compiled modules we’ll create another directory called **compiledDir** inside the root directory. First, we’ll compile the first module using the below command in the terminal. ```shell @@ -139,7 +118,7 @@ $ javac -d compiledDir --module-source-path project-modules/ --module second.mod ``` Now, after running both of the above commands, we can see the compiled version of both of our modules inside our compiledDir directory. -## Running our Modules +### Running our Modules Now that we have compiled modules with us, let’s run them using the command @@ -152,7 +131,7 @@ On executing the above command we’ll get the following output Hello readers, I'm a Java Module! ``` -## Updated Module Descriptor +### Updated Module Descriptor If we can recall, the module descriptor of our second module only contains the first module. But now, if we execute the below command and have a look at the module descriptor of second module, we can see a change. ```text @@ -164,6 +143,67 @@ module second.modules { ``` Our second module now also contains one more module “java.base” that we didn’t add from our side. This java.base module is actually a default module and all modules are linked to it. -## Conclusion +### Packaging Our Modules +We know that to make a Java application deployment ready we package it to a JAR file. Similarly, a Java module is packaged as a modular JAR. This modular JAR is the same as normal JAR except it has module-info.class at its root directory. Each module should have separate JAR files for them. Here we have two modules in our project, therefore we’ll create two JARs. At first we’ll create a directory to store our JAR files. +```shell +mkdir myJAR +``` +Now to create JAR file for module “first.modules” we’ll use the below command. +```shell +jar --create --file=myJAR/first.jar --module-version=1.0 -C compiledDir/first.modules . +``` +Now, since our second.modules module contains the Main class, therefore the command to create a JAR for it changes a little. +```shell +jar --create --file=myJAR/second.jar --main-class=com.demo.main.Main -C compiledDir/second.modules +``` +To get any help regarding the JAR creation we can use the below command. +```shell +jar --help +``` +Suppose we need to get details of any JAR then the below command will do it for us. +```shell +jar --describe-module --file=myJAR/second.jar +``` +The above command will return the following details of module “second.modules”. +```text +second.modules jar:file:///F:/Java-9-modules/myJAR/second.jar/!module-info.class +requires first.modules +requires java.base mandated +contains com.demo.main +main-class com.demo.main.Main +``` +Once both of the above commands are successfully executed, then we’ll have two JARs inside our myJAR directory “first.jar” and “second.jar”. +Since the module “second.modules” contains our Main class, therefore, we can use the below command to run our application. +```shell +java -p myJAR -m second.modules +``` + +### Creating Custom JDK +It is one of the most important features of the Java 9 module system. As we have discussed above, in Java 9 we don’t need the monolithic JDK anymore. Instead here we can create a custom JDK that only has modules that we require in our application. This provides scalability to our application and hence improves application performance. + +To achieve this, Java 9 provides us jlink tool. Using this we can link a set of modules along with their transitive dependencies to create a custom run-time image. Currently, jlink requires of modules to be packaged in modular JAR or JMOD format. Since we have already packaged our modules in modular JAR let’s start creating or custom JDK. +```shell +jlink --module-path myJAR --add-modules second.modules --output modulesAPP +``` +In the above command the value of the “--module-path” is the path of the directory that contains our modular JARs. The “--add-modules” is used to add all the modules we need. The value of “--output” is the path of the directory inside which our custom run-time image will be created. + +To run our application using the custom JDK, first, we need to move to the director that contains our custom JDK and run the following command. +```shell +cd modulesAPP/ +bin/java --module-path ./modulesAPP --module second.modules/com.demo.main.Main +``` +On executing the above command successfully, we’ll have the following output. +```text +Hello readers, I'm a Java Module! +``` +## Why Module System is not Popular? +Although Java 9 module system provides some significant advantages still it is not widely used for application development. Some of the reasons could be: +* Firstly, the module system requires applications to be modular, which means that existing applications need to be restructured to work with the new system. This can be a significant effort, especially for large and complex applications. +* Secondly, developers need to learn new concepts, such as module-info.java files, modular jars, and modular class-loading. This learning curve can be a problem for some developers, especially those who are not familiar with the existing Java class-loading mechanisms. +* Thirdly, while many development tools have added support for the module system, some tools still lack support or have limited support. This can make it harder for developers to use the module system in their development workflow. + +Since it’s a new feature and therefore it is obvious for it to take some time to get popular among developers. But now, many developers are using the module system for application development and we’ll see wider adoption of the module system in coming years. + +## Conclusion -In this tutorial, we had an extensive discussion on the Java 9 module system feature. At first, we saw what is Java 9 module system, then we saw what issues did Oracle team face which make them introduce this feature. Then, we saw the benefits of using the module system. There we learned how it provides better encapsulation, modularity, performance, and security. After that, we saw what is module and how it is different from traditional packages. Within this, we saw what is a module descriptor and its use. Then, we created a mini-project. In this mini-project, we created two modules and saw how we could export and import a module. In the end, we compiled our modules and ran them to get our desired output. Therefore we can say that in this tutorial we got both theoretical and practical knowledge of the Java 9 module system. \ No newline at end of file +In this tutorial, we had an extensive discussion on the Java 9 module system feature. At first, we saw what is Java 9 module system, then we saw flaws in previous versions of Java due to which the module system is introduced. Then, we saw the benefits of using the module system. There we learned how it provides better encapsulation, modularity, performance, and security. After that, we saw what a module is and how it is different from traditional packages. Within this, we saw what is a module descriptor and its use. Then, we created a mini-project. In this mini-project, we created two modules and saw how we could export and import a module. Then, we compiled our modules and ran them to get our desired output. Then, we packaged our modules as modular JARs, and using jlink tool we created our custom JDK. In the end, we saw the reasons why the module system is not popular. Therefore, we can say that in this tutorial we got both theoretical and practical knowledge of the Java 9 module system. \ No newline at end of file diff --git a/data/authors.yml b/data/authors.yml index 80abdad8d..aff03d345 100644 --- a/data/authors.yml +++ b/data/authors.yml @@ -331,3 +331,10 @@ pralhad: avatar: "/images/authors/pralhad.jpg" linkedin: "pralhadhadimani" bio: "As a professional software engineer, I have always loved to code. Here is my attempt to share knowledge, contribute to the greater community and engage with extraordinary people around the world. I strongly believe in one of the famous quotes by Stan Lee - \"With great power comes great responsibility\"." + +Himanshu: + name: "Himanshu Sharma" + email: "himanshu.sharma11199@gmail.com" + avatar: "/images/authors/HimanshuAvatar.png" + linkedin: "himanshu-sharma-237973198" + bio: "I am professional software engineer who loves programming and software development. I'm skilled in Java, Spring Boot, Angular, AWS and several other full-stack technologies". Technical writing is something I love to do as a side hustle.