Programmēšana

Kas ir JPMS? Iepazīšanās ar Java platformas moduļu sistēmu

Līdz Java 9 pakotne bija Java augstākā līmeņa kodu organizēšanas elements. Sākot ar Java 9, kas mainījās: virs paketes tagad ir modulis. Modulis kopā apkopo saistītās paketes.

Java platformas moduļu sistēma (JPMS) ir koda līmeņa struktūra, tāpēc tas nemaina faktu, ka mēs Java iesaiņojam JAR failos. Galu galā viss joprojām ir apvienots JAR failos. Moduļu sistēma pievieno jaunu, augstāka līmeņa deskriptoru, kuru JAR var izmantot, iekļaujot module-info.java failu.

Liela mēroga lietotnes un organizācijas izmantos moduļu priekšrocības, lai labāk organizētu kodu. Bet visi patērēs moduļus, jo JDK un tā klases tagad ir modulētas.

Kāpēc Java ir nepieciešami moduļi

JPMS ir rezultāts finierzāģim, kas tika īstenots ar šādiem izvirzītiem mērķiem:

  • Atvieglojiet izstrādātājiem lielu lietotņu un bibliotēku organizēšanu
  • Uzlabot platformas un paša JDK struktūru un drošību
  • Uzlabojiet lietotņu veiktspēju
  • Labāk rīkoties ar platformas sadalīšanos mazākām ierīcēm

Ir vērts atzīmēt, ka JPMS ir SE (Standard Edition) funkcija, un tāpēc tas iedarbojas uz visiem Java aspektiem jau no paša sākuma. To sakot, izmaiņas ir paredzētas lielākā daļa kods, lai darbotos bez izmaiņām, pārejot no Java 8 uz Java 9. Tam ir daži izņēmumi, un mēs tos vēlāk atzīmēsim šajā kopsavilkumā.

Galvenā moduļa ideja ir ļaut apkopot saistītās paketes, kas ir redzamas modulim, vienlaikus slēpjot elementus no ārējiem moduļa patērētājiem. Citiem vārdiem sakot, modulis ļauj veikt citu iekapsulēšanas līmeni.

Klases ceļš pret moduļa ceļu

Java līdz šim klases ceļš ir bijis pēdējais, kas ir pieejams darbojošai lietojumprogrammai. Lai gan klases ceļš kalpo šim mērķim un ir labi saprotams, tas galu galā ir liels, nediferencēts spainis, kurā tiek ievietotas visas atkarības.

Moduļa ceļš pievieno līmeni virs klases ceļa. Tas kalpo kā iepakojumu konteiners un nosaka, kādas paketes ir pieejamas lietojumprogrammai.

Moduļi JDK

Pašreiz JDK sastāv no moduļiem. Sāksim apskatīt JPMS uzgriežņus un skrūves tur.

Ja jūsu sistēmā ir JDK, jums ir arī avots. Ja jums nav zināms JDK un kā to iegūt, ieskatieties šajā rakstā.

JDK instalēšanas direktorijā ir / lib direktorijā. Tajā direktorijā atrodas a src.zip failu. Ritiniet to a / src direktorijā.

Paskaties iekšā / src direktoriju un dodieties uz /java.base direktorijā. Tur jūs atradīsit module-info.java failu. Atveriet to.

Pēc Javadoc komentāriem jūs atradīsit sadaļu ar nosaukumumodulis java.base seko virkne eksports līnijas. Šeit mēs nestrādāsim pie formāta, jo tas kļūst diezgan ezotērisks. Sīkāka informācija atrodama šeit.

Var redzēt, ka daudziem pazīstamiem Java pakotnēm patīk java.io, tiek eksportēti no java.base modulis. Tā ir moduļa būtība, kas apkopo paketes.

Apskatāmā puseeksports ir prasa instrukcija. Tas ļauj moduli pieprasīt definējamam modulim.

Palaižot Java kompilatoru pret moduļiem, jūs moduļa ceļu norādāt līdzīgi kā klases ceļš. Tas ļauj atrisināt atkarības.

Modulāra Java projekta izveide

Apskatīsim, kā tiek strukturēts modulēts Java projekts.

Mēs gatavosim nelielu programmu, kurai ir divi moduļi, no kuriem viens nodrošina atkarību, bet otrs - izmanto šo atkarību un eksportē izpildāmo galveno klasi.

Izveidojiet jaunu direktoriju kaut kur ērti savā failu sistēmā. Sauc to /com.javaworld.mod1. Pēc vienošanās Java moduļi dzīvo direktorijā, kuram ir tāds pats nosaukums kā modulim.

Tagad šajā direktorijā izveidojiet a module-info.java failu. Iekšpusē pievienojiet 1. saraksta saturu.

1. saraksts: com.javaworld.mod1 / module-info.java

modulis com.javaworld.mod1 {eksportē com.javaworld.package1; }

Ievērojiet, ka modulim un tā eksportētajai pakotnei ir atšķirīgi nosaukumi. Mēs definējam moduli, kas eksportē paketi.

Tagad izveidojiet failu šajā ceļā direktorijā, kurā atrodas module-info.java fails: /com.javaworld.mod1/com/javaworld/package1. Nosauciet failuVārds.java. Ievietojiet tajā 2. saraksta saturu.

2. saraksts: Vārds.java

 pakete com.javaworld.package1; public class Nosaukums {public String getIt () {return "Java World"; }} 

2. saraksts kļūs par klasi, paketi un moduli, no kura mēs esam atkarīgi.

Tagad izveidosim citu direktoriju paralēli /com.javaworld.mod1 un piezvaniet /com.javaworld.mod2. Šajā direktorijā izveidosim a module-info.java moduļa definīcija, kas importē jau izveidoto moduli, kā 3. sarakstā.

3. saraksts: com.javaworld.mod2 / module-info.java

 modulis com.javaworld.mod2 {nepieciešams com.javaworld.mod1; } 

3. saraksts ir diezgan pašsaprotams. Tas nosaka com.javaworld.mod2 modulis un prasa com.javaworld.mod1.

Iekšpusē /com.javaworld.mod2 direktorijā, izveidojiet klases ceļu līdzīgi: /com.javaworld.mod2/com/javaworld/package2.

Tagad pievienojiet failu iekšpusē ar nosaukumu Labdien.java, ar kodu, kas norādīts 4. sarakstā.

4. saraksts: Hello.java

 pakete com.javaworld.package2; importēt com.javaworld.package1.Name; public class Sveiki {public static void main (String [] args) {Name name = new Name (); System.out.println ("Labdien" + vārds.getIt ()); }} 

4. sarakstā mēs vispirms definējam paketi un pēc tam importējam com.javawolrd.package1.Name klasē. Ņem vērā, ka šie elementi darbojas tāpat kā vienmēr. Moduļi ir mainījuši to, kā paketes tiek padarītas pieejamas failu struktūras līmenī, nevis kodu līmenī.

Tāpat pašam kodam vajadzētu būt jums pazīstamam. Tas vienkārši izveido klasi un izsauc metodi, lai izveidotu klasisku piemēru “sveika pasaule”.

Darbojas modulārais Java piemērs

Pirmais solis ir direktoriju izveide, lai saņemtu kompilatora izvadi. Izveidojiet direktoriju ar nosaukumu / mērķis projekta pamatā. Iekšpusē izveidojiet direktoriju katram modulim: /target/com.javaworld.mod1 un /target/com.javaworld.mod2.

2. solis ir apkopot atkarības moduli, izvadot to uz / mērķis direktorijā. Projekta saknē ievadiet komandu sarakstā 5. (Tas pieņem, ka JDK ir instalēts.)

5. saraksts: 1. modulis

 javac -d target / com.javaworld.mod1 com.javaworld.mod1 / module-info.java com.javaworld.mod1 / com / javaworld / package1 / Name.java 

Tas izraisīs avota izveidi kopā ar tā moduļa informāciju.

3. solis ir ģenerēt atkarīgo moduli. Ievadiet komandu, kas parādīta 6. sarakstā.

6. saraksts: 2. ēkas modulis

 javac - module-path target -d target / com.javaworld.mod2 com.javaworld.mod2 / module-info.java com.javaworld.mod2 / com / javaworld / package2 / Hello.java 

Apskatīsim 6. sarakstu detalizēti. Tas ievieš modulis-ceļš arguments javacam. Tas ļauj mums noteikt moduļa ceļu līdzīgi kā --class-path slēdzī. Šajā piemērā mēs ejam garām mērķis direktoriju, jo tieši tur 5. saraksta izeja 1. modulis.

Tālāk 6. saraksts definē (izmantojot -d slēdzis) 2. moduļa izejas direktoriju. Visbeidzot, faktiskie kompilācijas priekšmeti ir norādīti kā module-info.java fails un klase, kas ietverti 2. modulī.

Lai palaistu, izmantojiet komandu, kas parādīta 7. sarakstā.

7. saraksts: moduļa pamatklases izpilde

 java - moduļa ceļa mērķis -m com.javaworld.mod2 / com.javaworld.package2.Sveiki 

The --moduļa ceļš slēdzis liek Java izmantot / mērķis direktoriju kā moduļa sakni, t.i., kur meklēt moduļus. The -m slēdzis ir tas, kur mēs pastāstām Java, kāda ir mūsu galvenā klase. Ievērojiet, ka mēs ievadām pilnībā kvalificētu klases nosaukumu ar tā moduli.

Jūs sagaidīs ar rezultātu Sveiki Java World.

Atpakaļ savietojamība

Jums var būt jautājums, kā jūs varat palaist Java programmas, kas rakstītas moduļu versijās pēc Java 9 pasaules, ņemot vērā, ka iepriekšējā koda bāze neko nezina par moduļa ceļu. Atbilde ir tāda, ka Java 9 ir izstrādāts tā, lai tas būtu savietojams atpakaļ. Tomēr jaunā moduļu sistēma ir tik lielas izmaiņas, ka jums var rasties problēmas, it īpaši lielās koda bāzēs.

Palaižot pirms 9 koda bāzi pret Java 9, var rasties divu veidu kļūdas: kļūdas, kas rodas no jūsu koda bāzes, un kļūdas, kas izriet no atkarībām.

Kļūdām, kas rodas no jūsu koda bāzes, var būt noderīga šāda komanda: jdeps. Šī komanda, norādot uz klasi vai direktoriju, meklēs, kādas ir atkarības un uz kuriem moduļiem šīs atkarības paļaujas.

Par kļūdām, kas izriet no jūsu atkarībām, varat cerēt, ka pakotnei, no kuras esat atkarīgs, būs atjaunināts Java 9 saderīgs būvējums. Ja nē, jums, iespējams, būs jāmeklē alternatīvas.

Viena izplatīta kļūda ir šī:

Kā atrisināt java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException

Šī ir Java, kas sūdzas, ka klase nav atrasta, jo tā ir migrējusi uz moduli bez redzamības uz patērējošo kodu. Šeit ir pāris dažādas sarežģītības un pastāvīguma risinājumu.

Atkal, ja atklājat šādas kļūdas ar atkarību, sazinieties ar projektu. Viņiem var būt Java 9 būvējums, lai jūs tos varētu izmantot.

JPMS ir diezgan plašas izmaiņas, un tās pieņemšana prasīs laiku. Par laimi nav steidzamas skriešanās, jo Java 8 ir ilgtermiņa atbalsta izlaidums.

Tas nozīmē, ka ilgtermiņā vecākiem projektiem būs jāpārceļas, un jauniem būs saprātīgi jāizmanto moduļi, cerams, ka izmantosiet dažus solītos ieguvumus.

Šo stāstu "Kas ir JPMS? Iepazīstinām ar Java platformas moduļu sistēmu" sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found