CodeGym /Kurslar /JAVA 25 SELF /Çoxmodullu layihələrin yığılması: Maven, Gradle, IDEA

Çoxmodullu layihələrin yığılması: Maven, Gradle, IDEA

JAVA 25 SELF
Səviyyə, Dərs
Mövcuddur

1. Modullu layihələrin yığılması: əsas prinsiplər

Kompilyator və modul yolu (module-path)

Modullar yaranmazdan əvvəl bütün tətbiq adlandırılan classpath vasitəsilə kompilyasiya və işə salınırdı — Java sinifləri axtardığı qovluq və JAR fayllarının sadə siyahısı. Modul sistemində isə yeni oyunçu peyda oldu — module-path. İndi kompilyator və JVM yalnız siniflərin harada yerləşdiyini deyil, həm də onların hansı modullara məxsus olduğunu, hansı asılılıqları olduğunu və hansı paketlərin ixrac edildiyini bilməlidir.

Əsas məqam:

  • Modullu layihələr üçün --module-path istifadə edin, -classpath yox.
  • Kompilyator və JVM tətbiqiniz üçün lazım olan bütün modulları (və onların asılılıqlarını) görməlidir.

Nümunə: modulların əl ilə kompilyasiyası

Tutaq ki, sizdə iki modul var: core və app, burada app, core-dan asılıdır.

Qovluq strukturu:

project-root/
  core/
    src/
      main/
        java/
          module-info.java
          com/example/core/...
  app/
    src/
      main/
        java/
          module-info.java
          com/example/app/...

Əl ilə kompilyasiya (demonstrasiya):

# Əvvəlcə core-u kompilyasiya edirik
javac -d out/core core/src/main/java/module-info.java core/src/main/java/com/example/core/*.java

# Daha sonra app, core-a module-path göstərərək
javac --module-path out/core -d out/app app/src/main/java/module-info.java app/src/main/java/com/example/app/*.java

İşə salma:

java --module-path out/core:out/app -m app/com.example.app.Main

Real layihələrdə bunu əl ilə etmək lazım deyil — Maven/Gradle və ya IDE istifadə edin.

2. Maven: çoxmodullu layihələrin yığılması

Maven-də çoxmodullu layihə strukturu

Maven çoxdan bir neçə moduldan (submodules) ibarət quruluşu dəstəkləyir. İndi, Java modul sistemi ilə birlikdə, bu Maven «modulları» çox vaxt Java modulları ilə üst-üstə düşür, amma həmişə deyil: Maven-modul sadəcə alt layihədir, Java-modul isə module-info.java-da təsvir olunandır. Adətən bir Maven-modul = bir Java-modul.

Tipik quruluş:

myproject/
  pom.xml                # Valideyn POM
  core/
    pom.xml              # core modulu
    src/main/java/
      module-info.java
      com/example/core/...
  app/
    pom.xml              # app modulu
    src/main/java/
      module-info.java
      com/example/app/...

Valideyn POM nümunəsi (myproject/pom.xml):

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>myproject</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
    <module>core</module>
    <module>app</module>
  </modules>
</project>

core modulu üçün POM nümunəsi (core/pom.xml):

<project>
  <parent>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>core</artifactId>
  <dependencies>
    <!-- Burada asılılıqlar ola bilər, məsələn, digər modullara və ya üçüncü tərəf kitabxanalarına -->
  </dependencies>
</project>

app modulu üçün POM nümunəsi (app/pom.xml):

<project>
  <parent>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>app</artifactId>
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>core</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

Vacibdir:

  • Əgər app moduluna core lazımdırsa, app modulunun module-info.java faylında requires core; olmalıdır
  • Əgər <dependency> və <module> düzgün yazılıbsa, Maven asılılıqları özü yığacaq.

Maven module-info.java-nı necə nəzərə alır

  • Maven module-info.java-nı avtomatik olaraq digər siniflərlə birlikdə kompilyasiya edir.
  • Əgər sizdə modullu asılılıqlar varsa, Maven kompilyasiya və işə salma zamanı onları module-path-a əlavə edəcək.
  • Əgər köhnə plaginlərdən və ya 9-dan aşağı Java versiyasından istifadə edirsinizsə — modul sistemi işləməyəcək.

Maven vasitəsilə modullu tətbiqin işə salınması

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.10.1</version>
      <configuration>
        <release>21</release> <!-- və ya sizin Java versiyanız -->
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <mainClass>com.example.app.Main</mainClass>
        <commandlineArgs></commandlineArgs>
      </configuration>
    </plugin>
  </plugins>
</build>
mvn clean install
mvn -pl app exec:java

Maven və modullarla işləyərkən tipik xətalar

Xəta: "module not found". Düzgün module-path göstərilməyib və ya asılı artifakt üçün <dependency> qeyd olunmayıb.

Modul adlarının təkrarlanması. Layihədə eyni adda iki modul olmamalıdır (məsələn, iki module core).

exports/requires olmaması. Əgər paketi (exports) ixrac etməyi və ya asılılığı (requires) elan etməyi unutmusunuzsa, kompilyasiya xətası olacaq.

classpath və module-path qarışdırılması. Modulları dəstəkləməyən köhnəlmiş plaginlər/parametrlərdən istifadə etməyin: bu, gözlənilməz xətalara səbəb olur.

3. Gradle: çoxmodullu layihələrin yığılması

Gradle layihə strukturu

myproject/
  settings.gradle
  build.gradle
  core/
    build.gradle
    src/main/java/module-info.java
    src/main/java/com/example/core/...
  app/
    build.gradle
    src/main/java/module-info.java
    src/main/java/com/example/app/...

settings.gradle

rootProject.name = 'myproject'
include 'core', 'app'

build.gradle (kök)

subprojects {
    apply plugin: 'java'

    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(21) // və ya sizin Java versiyanız
        }
    }

    repositories {
        mavenCentral()
    }
}

core üçün build.gradle

plugins {
    id 'java'
}

group = 'com.example'
version = '1.0-SNAPSHOT'

app üçün build.gradle

plugins {
    id 'java'
    id 'application'
}

group = 'com.example'
version = '1.0-SNAPSHOT'

dependencies {
    implementation project(':core')
}

application {
    mainModule = 'app' // Java modulunuzun adı
    mainClass = 'com.example.app.Main'
}

Yığma və işə salma

./gradlew build
./gradlew :app:run

Gradle module-info.java taparsa, module-path-ı özü müəyyənləşdirir. Nəsə işləmirsə — istifadə etdiyiniz Gradle və plaginlərin yenilənmiş versiyada olduğunu yoxlayın.

4. IntelliJ IDEA: modullu layihənin yaradılması və tənzimlənməsi

Modullu layihənin yaradılması

  • File → New → Project → Java → «Create module-info.java» seçimini aktiv edin.
  • Çoxmodullu layihə üçün: File → New → Module — layihəyə yeni modullar əlavə edin.
  • Əgər Maven/Gradle istifadə edirsinizsə — layihəni sadəcə pom.xml və ya build.gradle üzrə import edin.

IDEA-də quruluş

  • Project View-da hər modul ayrıca budaq kimi göstərilir.
  • Hər modulda öz module-info.java faylı və öz mənbələri var.
  • IDEA hansı modulların hansı paketləri ixrac etdiyini/tələb etdiyini (exports/requires) göstərir.
  • Əgər paketi ixrac etməyi və ya asılılığı elan etməyi unutmusunuzsa — IDEA xətanı vurğulayacaq.

module-path yoxlanması, main sinfinin işə salınması

  • Run/Debug Configurations bölməsində göstərin:
    • Main class (məsələn, com.example.app.Main)
    • Module (məsələn, app)
  • IDEA module-path ilə özü məşğul olacaq.
  • Əgər Maven/Gradle vasitəsilə işə salırsınızsa — müvafiq konfiqurasiyalardan istifadə edin (məsələn, app [run]).

Kənar modulların və kitabxanaların importu

  • Xarici kitabxanalarla işləmək üçün (məsələn, requires java.sql; və ya üçüncü tərəf JAR-ları) — asılılığı Maven/Gradle vasitəsilə əlavə edin.
  • Əgər kitabxana modullu deyil ( module-info.java yoxdur), o, avtomatik olaraq «unnamed module»-a əlavə olunacaq (bu, kitabxanaların əksəriyyəti üçün normaldır).

5. Təcrübə: sadə çoxmodullu layihənin yaradılması

Addım 1. Layihə strukturunu yaradırıq

myproject/
  core/
    src/main/java/module-info.java
    src/main/java/com/example/core/HelloService.java
  app/
    src/main/java/module-info.java
    src/main/java/com/example/app/Main.java

HelloService.java (core):

package com.example.core;

public class HelloService {
    public String getHello() {
        return "core modulundan salam!";
    }
}

module-info.java (core):

module core {
    exports com.example.core;
}

Main.java (app):

package com.example.app;

import com.example.core.HelloService;

public class Main {
    public static void main(String[] args) {
        HelloService service = new HelloService();
        System.out.println(service.getHello());
    }
}

module-info.java (app):

module app {
    requires core;
}

Addım 2. Maven ilə yığma və işə salma

Layihənin kökündə valideyn pom.xml və iki alt layihə (core/pom.xml, app/pom.xml) yaradırıq, yuxarıdakı kimi. app/pom.xml-də core-a asılılıq əlavə edirik.

mvn clean install
mvn -pl app exec:java

Addım 3. Gradle ilə yığma və işə salma

settings.gradle, kök build.gradle və hər modul üçün ayrıca fayl yaradırıq. app/build.gradle-də core-a asılılığı və mainClass-ı qeyd edirik.

./gradlew build
./gradlew :app:run

Addım 4. IntelliJ IDEA-da import və işə salma

  • Layihənin kökünü File → Open vasitəsilə açırıq.
  • IDEA Maven/Gradle quruluşunu tanıyacaq, modullar yaradacaq.
  • Hər modulda module-info.java faylını aça bilərsiniz, IDEA modullar arasındakı əlaqələri göstərəcək.
  • Main.java-nı kontekst menyusundan işə salırıq («Run Main.main()») — IDEA module-path-ı özü tənzimləyəcək.

6. Modullu layihələri yığarkən tipik xətalar

Xəta № 1: Səhv module-path. Əgər işə salma və ya kompilyasiya zamanı «module not found» və ya «package is not visible» kimi mesaj görünürsə, yəqin ki, düzgün module-path göstərməmisiniz və ya pom.xml/build.gradle-də asılılığı əlavə etməmisiniz.

Xəta № 2: Modul adlarının təkrarlanması. Layihədə eyni adda iki modul olmamalıdır (məsələn, iki module core). Bu, kompilyasiya xətasına gətirir.

Xəta № 3: İxrac olunmayan paket. Əgər sinif module-info.java-da exports vasitəsilə ixrac edilməyən paketdədirsə, o, public olsa belə digər modullar üçün əlçatan olmayacaq. Belə sinifdən istifadə etməyə cəhd edərkən kompilyasiya xətası yaranacaq.

Xəta № 4: Elan olunmamış requires. Əgər modul başqa moduldan siniflər istifadə edirsə, lakin requires-i module-info.java-da göstərməyibsə, kompilyator xəta verəcək.

Xəta № 5: Xarici kitabxanalarla uyğunsuzluq. Modullar və module-info.java olmayan kitabxanalar («unnamed module»-a düşürlər) adətən problem yaratmır, lakin bəzi konfiqurasiyalarda əlavə tənzimləmə tələb oluna bilər.

Xəta № 6: Yanlış moduldan işə salma. IDEA və ya Maven/Gradle işə salma konfiqurasiyasında səhv main-sinif və ya modul göstərilibsə — tətbiq start götürməyəcək. Main, mainModule/module və istifadə olunan profilə baxın.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Çoxmodullu layihənin qalasının tikintisi 🏰
Çoxmodullu layihənin qalasının tikintisi 🏰
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Tətbiqin ürəyinin Maven ilə işə salınması ✨
Tətbiqin ürəyinin Maven ilə işə salınması ✨
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Modullar və layihə strukturu
Modullar və layihə strukturu
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION