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.
GO TO FULL VERSION