Maven - dzielenie na moduły i konfiguracja poma

0

Chciałbym napisać program typu komunikator internetowy w Javie działający jako klient-server z wykorzystaniem mavena, którego uczę się dopiero od niedawna. Myślę żeby zrobić 3 moduły:

  • **Client **– w którym będzie program kliencki z GUI.
  • **Server **– w którym będzie program serwera.
  • **Shared **– w którym znajdą się klasy wykorzystywane zarówno przez programy Client i Server.

Chciałbym mieć możliwość oddzielnej kompilacji z tym że kompilując moduł Client, dołączone zostaną także klasy z moduły Shared i zostanie stworzony plik client.jar. I analogicznie kompilując moduł Server, także zostaną dołączone klasy z modułu Shared i zostanie stworzony plik server.jar. Samego modułu Shared nie będzie trzeba kompilować z racji że znajdą się tam tylko klasy współdzielone i potrzebne przez oba pozostałe moduły.

Używam IDE IntelliJ IDEA. Moduły potrafię sam dodać tylko nie wiem jak później skonfigurować pom.xml.

No to teraz pytanie. Jak to zrobić?

1

Z każdego z modułów zrób oddzielny artefakt i w client i server daj shared jako zależność.

0

Jak już napisałem jedyne co wiem jak zrobić z mavena to jak utworzyć moduł w IntelliJ IDEA. Czyli jak ten pom powinien wyglądać?

0

No właśnie ja bym nie szedł w parent-child tylko w zależności. Moduły implikują konieczność wspólnego budowania. Tutaj bylo zapotrzebowanie na zależność.

0
ccu napisał(a):

No właśnie ja bym nie szedł w parent-child tylko w zależności. Moduły implikują konieczność wspólnego budowania. Tutaj bylo zapotrzebowanie na zależność.

"konieczność wspólnego budowania" - to jest zaleta. Nie ma co sobie komplikować życia.
Trzeba mieć naprawdę dobry powód żeby odejść od takie rozwiązania.

0
ccu napisał(a):

Z każdego z modułów zrób oddzielny artefakt i w client i server daj shared jako zależność.

Krok po kroku proszę. Jaki artefakt, co wpisać, gdzie, w którym miejscu?

0

Zapomniałem się zalogować w poprzednim poście. Czyli co dodać? Tworzę projekt w sposób: File > Edit > Project > Maven. a teraz jak ten pom.xml powinien wyglądać? I ile ich w ogóle powinno być? Do każdego modułu oddzielny pom i jeszcze jeden główny? Czy jak?

1

Tu masz przykład wielomodułowego projektu maven'a:
https://github.com/DanielMichalski/java-8-codes

0

Ok zrobiłem i działa tak jak chciałem. Układ modułów:
user image

Zerknijcie czy dobrze, czy czegoś nie napisałem "nadmiarowo" w tych pomach albo czegoś zapomniałem:

pom.xml główny w module kchat-app:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <name>KChat Network</name>
    <groupId>pl.cba.reallygrid.kchat</groupId>
    <artifactId>kchat-app</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>kchat-server</module>
        <module>kchat-client</module>
        <module>kchat-shared</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>pl.cba.reallygrid.kchat</groupId>
                <artifactId>kchat-server</artifactId>
                <version>1.0-SNAPSHOT</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>pl.cba.reallygrid.kchat</groupId>
                <artifactId>kchat-client</artifactId>
                <version>1.0-SNAPSHOT</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>pl.cba.reallygrid.kchat</groupId>
                <artifactId>kchat-shared</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

pom.xml w module kchat-server (pom w moduje kchat-client jest analogiczny):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>kchat-app</artifactId>
        <groupId>pl.cba.reallygrid.kchat</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <name>KChat Network Server</name>
    <artifactId>kchat-server</artifactId>

    <dependencies>
        <dependency>
            <groupId>pl.cba.reallygrid.kchat</groupId>
            <artifactId>kchat-shared</artifactId>
        </dependency>
    </dependencies>
</project>

pom.xml w module kchat-shared:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>kchat-app</artifactId>
        <groupId>pl.cba.reallygrid.kchat</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>kchat-shared</artifactId>
</project>

== Edit: ==
Jedno pytanie mi się nasunęło po zauważeniu, że moduły kchat-shared, kchat-server i kchat-client mają to samo groupId mianowicie: pl.cba.reallygrid.kchat. Czy jest to zalecany sposób programowania modułowego czy też każdy moduł oprócz unikalnego artifactId powinien mieć także unikalny groupId?

1 użytkowników online, w tym zalogowanych: 0, gości: 1