Java Platform, Standard Edition 11 - (Besplatna?) Java 11 ili Duke’s Eleven
Što donosi razvojna platforma najpopularnijeg programskog jezika u verziji 11 te je li i dalje besplatna?
Dva dana nakon početka jeseni stigla nam je i najnovija verzija razvojne platforme Java SE 11 (Java Platform, Standard Edition 11), kao i prateći JDK (Java Development Kit), što je već druga verzija Jave izdana ove godine, točno prema planu. Podsjetimo se malo ne tako davne povijesti – na prošlogodišnju verziju Jave 9 čekalo se čak tri godine, a donijela je pregršt novih značajki, među kojima se najviše isticao sustav modularnosti JPMS (Java Platform Module System) i mogućnost jednostavnijeg skaliranja aplikacija. Tom prilikom predstavljena je i promjena dinamike izdanja novih verzija, popraćena parolom “Moving Java Forward Faster”, koju je objavio Marka Reinhold (Oracleov glavni arhitekt za Java Platform Group), a koju su svesrdno propagirali i svi važni sudionici u svijetu Jave, kao što su kompanije Oracle, Red Hat, IBM, SAP, Azul i drugi.
Tada je objavljeno da će se verzije Jave s novim značajkama (Feature Release) izdavati dvaput godišnje, u ožujku i rujnu, a u međuvremenu će stizati i osvježavanja (Update Release) četiri puta godišnje, u siječnju, travnju, srpnju i listopadu, što je sve zasad u potpunosti poštovano. Primjetno je da je posljednje proljetno izdanje Jave 10 sadržajno bilo dosta manje od prethodne Jave 9, a slično se sada ponovilo i s Javom 11. No, razvoj Jave, kao (još uvijek) najpopularnije programske razvojne platforme na kojoj aplikacije razvija desetak milijuna developera nije usporen, već se, naprotiv, nove verzije sada izdaju puno većom polugodišnjom dinamikom, ali su zbog toga manjeg obujma.
Nadopunite niz: 8, (9, 10,) 11, (12…)
Takav razvoj događaja oko izdanja Jave 10, i sada Jave 11, a pogotovo nakon niza kašnjenja Jave 9 i projekta Jigsaw te donedavno vrlo neizvjesne situacije s Javom EE (koja je konačno razriješena prijelazom u novi projekt otvorena kôda nazvan Jakarta EE, pod vodstvom fondacije Eclipse), globalna developerska zajednica ocijenila je vrlo pozitivnim, ali se, s druge strane, zbunilo mnoge često neupućene krajnje korisnike sustava zasnovanim na Javi. U posljednjih godinu dana pojavio se i niz pitanja oko buduće podrške i osvježavanja, a počele su kolati i glasine o tome da Java više neće biti besplatna.
Dodatno potaknuto pravnom trakavicom Oraclea i Googlea oko Androida, vrijednom milijarde dolara, ovo se na kraju tek djelomično pokazalo točnim što se tiče Oraclea, o čemu više pišemo u posebnom okviru. Trenutačno imamo nekoliko dostupnih besplatnih varijanti referentne implementacije Java SE otvorena kôda, pod nazivom OpenJDK i licencijom GPLv2cpe, ali i komercijalnu verziju JDK-a objavljenu pod Oracleovom licencijom BCL, te dodatno komercijalnu podršku za OpenJDK od niza kompanija. Staru verziju Jave 8 i dalje možete koristiti besplatno (praktički zauvijek), ali pripazite na sigurnosne zakrpe i ispravljanja pogrešaka. Prošlogodišnju verziju Jave 9 i ovogodišnju Javu 10 sada je zamijenila verzija 11 te one više nisu podržane, a “jedanaestica” će imati dugotrajnu podršku ili LTS (Long-Term Support), no svaka takva podrška se plaća. O detaljima što je točno besplatno, a što nije, te o dostupnosti prateće podrške, možete detaljnije pročitati i u zasebnom okviru.
“Jedanaestica” zvana čežnja
Nakon što smo u “desetki” vidjeli dosta značajki koje su namijenjene pojednostavljenju života developera, primjerice, automatsko zaključivanje podatkovnih tipova lokalnih varijabli varijable, unaprijeđeno sučelje korištenja različitih garbage collectora (GC) i dorađeni pretpostavljeni G1 (Garbage First) GC za paralelne obrade (Parallel Full), širu upotrebu eksperimentalnog JIT compilera Graal te čak 73 nova API-ja, niz drugih poboljšanja i proljetnih čišćenja kôda, postavlja se pitanje hoće li se ta tradicija nastaviti.
U kvantitativnom smislu JDK 11 donosi usporediv broj novosti te čak još veći broj JEP-ova (JDK Enhancement Proposal), njih čak 17, čiji cjelokupni popis donosimo u zasebnom okviru, no većina noviteta baš ih nije vidljiva developerima. Već spomenuto automatsko zaključivanje podatkovnih tipova, tzv. varovi, prošireni su i na deklariranje parametara implicitno zadanih izraza Lambda (JEP 323), što se dodatno može kombinirati i s anotacijama. Za potrebe jednostavnih testiranja, u maniri REPL alata jshell, omogućeno je pokretanje manjih programa unutar jedne datoteke bez prethodnog prevođenja, kao i podrška za skripte shebang (vidjeti zasebni okvir). Standardni HTTP klijent API, inicijalno uključen kao inkubatorski modul u JDK 9 te kasnije dorađen u JDK 10, sada je punopravni član novog modula i paketa java.net.http, a podržava sinkroni i asinkroni način rada, uporabom CompletableFutures and CompletionStages te koncepta RX Flow.
Još nešto bitno u “Dukeovih jedanaest"?
U kontekstu jesenskog čišćenja, nakon što je monolitski rt.jar razdijeljen u više modula, obrisani su moduli koji su proglašeni “deprecated” još u JDK 9, a vezani uz tehnologije Java EE i CORBA (corba, transaction, activation, xml.bind, xml.ws i xml.ws.annotation). U kontekstu jednostavnijeg rješavanja problema i ispravljanja pogrešaka, nekad komercijalni radni okvir za prikupljanje podataka Flight Recorder, Oracle je sada prepustio u otvoreni kôd, te je on objedinjen u novim modulima jdk.jfr i jdk.management.jfr. U sklopu kontrole pristupa, uveden je koncept gniježđenja unutarnjih klasa (nesting of inner classes) u JEP-u 181, koji omogućuje da se vanjska i unutarnja klasa proglase članovima istog “gnijezda” (nestmates), a zbog toga su dodane i nove metode u klasu java.lang.Class. Ovaj koncept “gnijezda” bit će koristan i drugim programskim jezicima za JVM koji podržavaju ugniježđene klase.
Tu je i nova klasa java.lang.invoke.ConstantBootstraps s 9 novih bootstrap metoda koje služe za (oksimoronske) dinamičke konstante, koje se postavljaju tijekom izvršavanja programa jednom, a ne pri prevođenju. U području upravljanja memorijom predstavljena su dva nova garbage collectora, eksperimentalni skalabilni ZGC (Z Garbage Collector), namijenjen za aplikacije koje koriste veliki višegigabajtni heap s niskom latencijom, te Epsilon, koji zapravo ne radi nikakvu alokaciju memorije i služi kao referentna točka za testiranje i usporedbu rada s i bez garbage collectora. Na kraju, tu je i 6 novih klasa u modulu java.security te skup novih metoda podršku Charsetu i null streamu u paketu java.io, za upravljanje znakovnim nizovima u paketu java.lang, te još niz drugih u paketima java.nio, java.util i drugima. Jedan od poznatih Java evangelista Simon Ritter pobrojao je čak 90 novih značajki u JDK 11, no pitanje je je li sve navedeno i dovoljno značajno da se prijeđe na novu verziju. S obzirom na to da je zbog kratkotrajne, odnosno sad već istekle podrške za Javu 9 i 10, jedina alternativa “jedanaestici” ostati na starijoj Javi 8 ili čak još starijim prethodnicima, ovo zapravo nije pitanje broja i važnosti značajki, već podrške.
A podrška za Javu 11 (i 8)?
Prilikom objave Jave 10 već smo pisali da se ova verzija, kao i prethodna verzija Java 9, za razliku od svih prethodnih verzija, smatra tek kratkoročnim izdanjem novih značajki (tzv. non-LTS feature release), čija su javna osvježavanja aktualna samo pola godine, odnosno do izdavanja sljedeće verzije. No, Java SE 11 i prateći JDK su drugačiji jer donose dugoročnu podršku ili LTS (Long-Term Support), što se u budućnosti može očekivati tek svake tri godine – sljedeća LTS verzija je Java 17 u 2021., a kasnije Java 23 u 2024. godini.
Naravno, svim se korisnicima preporučuje prijelaz na najnoviju verziju, no pitanje je je li to uvijek moguće te poželjno. Sa stranica OpenJDK-a trenutačno se može preuzeti izgradnja za najnoviju verziju 11, uskoro isteklu verziju 10.0.2 i stariju verziju 8, a slično je i za Oracleov komercijalni JDK. Podrška za Javu 11 postojat će od sada već uobičajenih pola godine za OpenJDK od Oraclea, odnosno do izdanja sljedeće verzije, preko 4 godine za AdoptOpenJDK, do 5 ili više godina za komercijalnu podršku od Azula ili Oraclea. Kao što je i najavljivano, Oracleova komercijalna podrška bit će puno duža, konkretno za Javu 7 do srpnja 2019., za Javu 8 do ožujka 2022., a za Javu 11 barem do srpnja 2023. godine.
Što nas čeka u budućnosti?
S obzirom na navedeno, zaključit ćemo kako za odabir trenutačno zapravo postoje tek dvije “pametne” opcije. Prva je prijeći na Javu 11, a druga je ostati na Javi 8 (ili nekoj ranijoj) do daljnjega – a tada vas čeka kvantni skok. No, kao što se i očekivalo, mnoge značajke i projekti nisu uspjeli ući u verziju 11 te su ostavljeni za neko od narednih izdanja. U inkubatorskom projektu Amber već su izdane mnoge značajke, poput spomenutih varova, pa za Javu 12 najvjerojatnije ostaju izrazi switch (JEP 325 Switch Expressions) i uporaba literala s jednostrukim navodnicima (JEP 326 Raw string literals), a Lambda Leftovers (JEP 302) i Pattern Matching (JEP 305) još su u izradi. U inkubatorskom projektu Valhalla razvijaju se vrijednosni tipovi nepromjenjivih i nereferentnih objekata za bolje korištenje neprimitivnih tipova (JEP 169 Value Objects) i proširenje generičkih tipova za specijalizaciju generičkih klasa i sučelja nad primitivnim tipovima (JEP 218: Generics over Primitive Types), primjerice List<int>.
Vrlo je zanimljiv projekt Loom koji će smanjiti kompleksnost pisanja konkurentnih aplikacija upotrebom jednostavnijih “vlakana”, koje se ponašaju poput dretvi, ali na razini JVM-a, te upravljanjem stogom poziva metoda. U projektu Panama JVM bi se trebao bolje povezati s nativnim kôdom drugih programskih jezika pozivima nativnih funkcija i korištenjem nativnog pristupa podacima pomoću novog sučelja FFI (Foreign function interface), kao zamjene za JNI. Postoji još niz drugih projekata koje nećemo uspjeti spomenuti, no zaključili bismo kako nas čeka vrlo zanimljiva daljnja evolucija Jave. Na kraju, već smo dobili mnogo brže izdavanje novih značajki i inkubaciju novih zanimljivih projekata, ali je pri tome potrebno i puno održavanja te redovitog čišćenja postojećeg kôda kako bi se sve to održalo ispravnim. Kompatibilnost s prethodnim verzijama načelno će biti poštivana, ali bez ikakvih jamstava, te se preporučuje pratiti zbivanja i informirati se barem svakih pola godine, kada izlazi nova verzija. Ako želite saznati još više, savjetujemo da posjetite neke od developerskih konferencija i druženja s temama razvoja u Javi ili se pridružite Hrvatskoj udruzi Java korisnika (HUJAK).
Stranica API dokumentacije JDK 10 dostupne na https://docs.Oracle.com/en/java/javase/11/docs/api/index.html
Verzija Java SE | Javna objava | Oznaka (pod)izdanja | Vrsta podrške | Kraj javnih osvježavanja* | Kraj komercijalne podrške** |
7 | srpanj 2011. | 1.7.0_191-b08 | dugoročna (LTS) | - | srpanj 2019. / srpanj 2022. |
8 | ožujak 2014. | 8u181 | dugoročna (LTS) | siječanj 2019. / prosinac 2020. |
ožujak 2022. / ožujak 2025. |
9 | rujan 2017. | 9.0.4+11 – siječanj 2018. | kratkoročna | ožujak 2018. | ožujak 2018. |
10 | ožujak 2018. | 10 (18.3) 10.0.1 – travanj 2018. 10.0.2 – srpanj 2018. |
kratkoročna | rujan 2018. | rujan 2018. |
11 | rujan 2018. | 11.0.0 (18.9) LTS 11.0.1 – listopad 2018. 11.0.2 – siječanj 2019. |
dugoročna (LTS) | nije više primjenjivo | rujan 2023. / rujan 2026. |
12 | ožujak 2019. | 12.0.0 | kratkoročna | - | - |
13 | rujan 2019. | 13.0.0 | kratkoročna | - | - |
14 | ožujak 2020. | 14.0.0 | kratkoročna | - | - |
15 | rujan 2020. | 15.0.0 | kratkoročna | - | - |
16 | ožujak 2021. | 16.0.0 | kratkoročna | - | - |
17 | rujan 2021. | 17.0.0 LTS | dugoročna (LTS) | - | - |
Verzije Jave i očekivano trajanje osvježavanja i podrške
* javne / komercijalne
** Premier Support / Extended Support
NAPOMENA: Ovaj tekst je izvorno objavljen u časopisu Mreža.