#Java 9 – moduły


#Java 9 – moduły

Java Platform Module System wcześniej pod szyldem Project Jigsaw to największa zmiana w organizacji kodu źródłowego jaka do tej pory miała miejsce. Moduł to logiczna jednostka która pozwala zgrupować pakiety w jednym miejscu:

A module is essentially a set of packages that make sense being grouped together and is designed for reuse.

[źródło] https://blogs.oracle.com/java/modular-development

Tworzenie i użycie prostego modułu

Przykładowa struktura projektu wygląda następująco:

Klasa Demo:

package pl.javaleader.controller;

import pl.javaleader.utils.MsgHelper;

public class Demo {
    public static void main(String[] args) {
        MsgHelper.printMsg("sample msg");
    }
}

Klasa MsgHelper:

package pl.javaleader.utils;

public class MsgHelper {
    public static void printMsg(String msg) {
        System.out.println("[javaleader.pl] " + msg);
    }
}

Plik module-info.java:

module pl.javaleader.module {
    requires java.base;
    exports pl.javaleader.utils;
}

Plik module-info.java to deskryptor wdrożenia dla danego modułu. W powyższym przykładzie eksportujemy pakiet pl.javaleader.utils aby był on dostępny dla innych modułów.

Jeśli nie mamy zainstalowanej Javy 9 proponuję użyć do tego celu Dockerahttps://javaleader.pl/2019/10/23/instalacja-dockera-dla-systemu-linux-z-przypisaniem-wolumenu/. Aby skompilować projekt wydajemy polecenie:

root@0f29aeb1004c:/modules-java9# javac -d mods/pl.javaleader.module src/pl.javaleader.module/module-info.java src/pl.javaleader.module/main/java/pl/javaleader/utils/MsgHelper.java src/pl.javaleader.module/main/java/pl/javaleader/controller/Demo.java

następnie możemy projekt uruchomić:

root@0f29aeb1004c:/modules-java9# java --module-path mods -m pl.javaleader.module/pl.javaleader.controller.Demo

wynik:

[javaleader.pl] sample msg

Zależności do innych modułów

Każdy moduł może zależeć od innych modułów. Tworzymy zatem następującą strukturę dodając nowy moduł:

Klasa Start:

package pl.javaleader.controllers;

import pl.javaleader.utils.MsgHelper;

public class Start {
    public static void main(String[] args) {
        MsgHelper.printMsg("sample msg");
    }
}

Plik module-info.java:

module pl.javaleader.module.with.requires {
    requires pl.javaleader.module;
    requires java.base;
}

Aby skompilować zależny moduł należy wydać polecenie:

javac --module-path mods -d mods/pl.javaleader.module.with.requires src/pl.javaleader.module.with.requires/module-info.java src/pl.javaleader.module.with.requires/main/java/pl/javaleader/controllers/Start.java

uruchomienie:

root@f70e1bfe4f94:/modules-java9# java --module-path mods -m pl.javaleader.module/pl.javaleader.controller.Demo

wynik:

[javaleader.pl] sample msg

Aby skompilować projekt z wieloma zależnościami w jednej komendzie należy wydać polecenie:

root@0b2fbec6b216:/modules-java#  javac -d mods --module-source-path src $(find src -name "*.java")

Tworzenie archiwów JAR

Utworzymy teraz archiwa *.jar dla projektu wielomodułowego:

  • pl.javaleader.module
  • pl.javaleader.module.with.requires

tworzymy katalog ./mlib w katalogu projektu i wydajemy komendy:

archiwum jar dla modułu pl.javaleader.module:

jar --create --file=mlib/pl.javaleader.module.jar --module-version=1.0 -C mods/pl.javaleader.module .

archiwum jar dla modułu pl.javaleader.module.with.requires:

jar --create --file=mlib/pl.javaleader.module.with.requires.jar --module-version=1.0 -C mods/pl.javaleader.module.with.requires .

warto wskazać podczas tworzenia archiwum klasę zawierającą metodę main celem łatwego uruchomienia pliku jar:

archiwum jar dla modułu pl.javaleader.module wraz ze wskazaniem klasy uruchomieniowej :

jar --create --file=mlib/pl.javaleader.module.jar --main-class=pl.javaleader.controller.Demo --module-version=1.0 -C mods/pl.javaleader.module .

archiwum jar dla modułu pl.javaleader.module.with.requires wraz ze wskazaniem klasy uruchomieniowej :

jar --create --file=mlib/pl.javaleader.module.with.requires.jar --main-class=pl.javaleader.controllers.Start --module-version=1.0 -C mods/pl.javaleader.module.with.requires .

uruchomienie archiwum dla modułu pl.javaleader.module:

java --module-path mlib -m pl.javaleader.module

wynik:

[javaleader.pl] sample msg

uruchomienie archiwum dla modułu pl.javaleader.module.with.requires:

java --module-path mlib -m pl.javaleader.module.with.requires

wynik:

[javaleader.pl] sample msg

Narzędzie linkujące – jlink

jlink to narzędzie które daje możliwość połączenia ze sobą modułów wraz z ich zależnościami:

jlink --module-path $JAVA_HOME/jmods:mlib --add-modules pl.javaleader.module --output javaleader.app

uruchomienie:

javaleader.app/bin/java -m pl.javaleader.module/pl.javaleader.controller.Demo

wynik:

[javaleader.pl] sample msg

jlink wraz z launcherem:

jlink --module-path $JAVA_HOME/jmods:mlib --add-modules pl.javaleader.module --output javaleader.app --launcher launch=pl.javaleader.module/pl.javaleader.controller.Demo

uruchomienie

javaleader.app/bin/launch

wynik:

[javaleader.pl] sample msg


Leave a comment

Your email address will not be published.


*