Jump to content

Java

From MukeWiki

Java je objektovo orientovany programovaci jazyk vychadzajuci z C a C++. Zdrojove programy sa nekompiluju do strojoveho kodu, ale do medzistupna, tzv. Java bytecode, ktory je nezavisly od konkretnej platformy. Tento bytecode moze bezat na akejkolvek Java virtual machine (JVM) bez ohladu na zakladnu pocitacovu architekturu. Inymi slovami, skompilovany Java bytecode moze bezat na vsetkych platformach, ktore podporuju Java, bez potreby re-kompilacie. Vdaka tejto prenositelnosti sa programy pouzivaju na roznych Java software platforms.

  • Java Card pre aplikacia v roznych smart cards (platobne karty), resp. small memory devices.
  • Java ME (Micro Edition) pre rozne mobilne zariadenia (mobilne telefony, TV STB). Formerly known as Java 2 Platform, Micro Edition (J2ME).
  • Java SE (Standard Edition) na vseobecne pouzitie pre PC, servery a podobne. Formerly known as Java 2 Platform, Standard Edition (J2SE).
  • Jakarta EE (Enterprise Edition) rozsirenie Java SE pre enterprise sektor (rozsiahle podnikove systemy). Formerly known as Java Platform, Enterprise Edition (Java EE) and Java 2 Platform, Enterprise Edition (J2EE).

Dalej budeme uvazovat vylucne uz len Java SE. Firma Oracle je aktualnym vlastnikom implementacie Java SE platform (odkupena v roku 2010 od Sun Microsystems). Tato implementacia od Oracle bola rozdelena do dvoch distribucii (platne pre Java SE 8 a starsie):

  • Java Runtime Environment (JRE) obsahuje casti platformy Java SE potrebne pre spustenie programov Java (Java Virtual Machine, Java standard library a pod.) a je urcena pre koncovych uzivatelov.
  • Java Development Kit (JDK) urcena pre vyvojarov softveru a obsahuje rozne vyvojove nastroje ako Java kompilator, Jar, Javadoc a debugger.

Java kompilator (sucast JDK) kompiluje zdrojovy kod Javy do Java bytecode (prechodny medzistupen pre JVM, nezavisly od platformy). JRE (runtime prostredie Javy) doplnuje Java bytecode o JIT (Just In Time) kompilator, ktory preklada prechodny Java bytecode do nativnych instrukcii procesora (konkretna platforma) priamo za behu programu, t.j. spusta Java bytecode ako nativnu aplikaciu.

Dnes v modernom OpenJDK (vid nizsie) sa uz samostatne JRE prakticky nedistribuuje. Od Java SE 9 (released 2017-09) sa odstranili samostatne distribucie JRE a balik sa zjednotil do JDK, ktory obsahuje uz vsetko potrebne od vyvoja az po spustanie. Stale vsak existuje moznost vytvorit si vlastne custom runtime image pomocou nastroja jlink(1). Aktualne, po natlaku uzivatelov, niektore Java builds (vid nizsie), okrem zjednoteneho JDK, distribuuju aj oddelene JRE. Pre rozne minimalne distribucie (kontajnery) ma samostatny JRE stale vyznam.

OpenJDK je open source implementacia Java Platform, Standard Edition (Java SE), ktora vznikla v case, ked Sun Microsystems uvolnil velku cast zdrojoveho kodu Javy pod GPL licenciou (2006 – 2007, este pred odkupenim Oracle). Dnes je OpenJDK oficialna open source implementacia Java SE. Vacsinu vyvoja zdrojoveho kodu zastresuje Oracle, ale prispievaju aj ini (RedHat, Amzaon, Microsoft a dalsi). Prakticky vsetky Java builds vychadzaju prave z OpenJDK, vratane samotneho Oracle OpenJDK. Rozdiely medzi jednotlivymi OpenJDK builds su len v licenciach, certifikaciach, dlzke podpory a podobne, ale funkcne su prakticky rovnake. Inymi slovami, OpenJDK je upstream pre vsetky Java builds.

Oracle na Jave "demonstruje krasu" komercneho licencovania. Z tych istych zdrojovych kodov OpenJDK (open source) vytvara dva builds:

  • Oracle OpenJDK - open source (upstream) build sice mozno pouzivat aj na komercne ucely, ale s umyselne vyrazne kratsim casom podpory (zvycajne 6 mesiacov). Nie je moznost stiahnut samostatne JRE, len spolocny JDK build.
  • Oracle Java SE - commercial build (non open source license) s LTS podporou (zvycajne 5 rokov) a moznostou pouzitia na komercne ucely. Distribuuje len spolocny JDK.
    NOTE Pre starsiu Java 8 (komercna licencia s podporou do 2030-12, nemoznost bezplatneho pouzitia na komercne ucely) ponuka samostatny JDK aj samostatny JRE build (pre vysie verzie uz len spolocny JDK build).

Priklad dalsich (non Oracle) OpenJDK builds:

  • Red Hat build of OpenJDK ponuka builds pre Linux, MacOS a Windows, ponuka zjednoteny JDK aj samostatny JRE.
  • Microsoft Build of OpenJDK ponuka builds pre Linux, MacOS a Windows, ponuka len spolocny JDK.
  • Eclipse Adoptium Temurin dnes vseobecne odporucany vendor neutral build of OpenJDK. Eclipse Temurin je relativne nova distribucia OpenJDK od komunity Eclipse Adoptium (nastupca AdoptOpenJDK). Tato working group sa sformovala v 2021-03 a medzi zakladajucimi clenmi boli, okrem ineho, aj vyssie spomenute spolocnosti Red Hat a Microsoft. Odporuca sa pre bezneho uzivatela aj pre komercne pouzitie. Ponuka zjednoteny JDK aj samostatny JRE. The name for the project, Temurin, is an anagram of the word runtime.

Java version history (see also Eclipse Temurin release roadmap):

  • Java SE 7 (1.7) (released 2011-07) OpenJDK is the official reference implementation of Java SE.
  • Java SE 8 (1.8) LTS (released 2014-03) bola svojho casu najpouzivanejsia verzia Javy na svete. Velmi popularna a rozsirena. Tato verzia (Oracle build) bola udrziavana do 2019-04. Oracle deklaruje komercnu podporu az do 2030 roku (open source Temurin takisto az do 2030-12). Open source verzia OpenJDK 8 bola technicky velmi podobna, ale neobsahovala niektore proprietarne casti Oracle JDK a zaroven mala kratsiu oficialnu podporu.
  • Java SE 9 (1.9) (released 2017-09) zjednotenie JRE a JDK do jedneho JDK balika (modularization of the JDK under Project Jigsaw). Moznost vytvorenia vlastneho JRE z JDK.
  • Java SE 11 LTS (released 2018-09) a obdobie vyraznych zmien. Oracle JDK uz nie je zadarmo pre produkcne pouzitie. Firmy si museli kupit komercnu podporu, co neskor sposobilo masivny prechod a vznik roznych alternativnych builds (Adoptium, Amazon, IBM, Microsoft, RedHat). Okrem toho, Oracle vyrazne skratil podporu len na 6 mesiacov. Po Java SE 11 LTS prakticky identicky zdrojovy kod pre vsetky rozne OpenJDK builds, rozdiel je hlavne v podpore a distribucii. Oracle dalej "provokuje" roznymi zmenami, co prehlbuje odklon uzivatelov od Oracle JDK builds. Eclipse Temurin support until 2027-10.
  • Java SE 17 LTS (released 2021-09) Eclipse Temurin support until 2027-10
  • Java SE 21 LTS (released 2023-09) Eclipse Temurin support until 2029-12
  • Java SE 25 LTS (released 2025-09) Eclipse Temurin support until 2031-09
  • Java SE 26 (released 2026-03) latest release, non LTS support s kratkodobou (6 mesiacov) podporov

Summarum: Pre cloveka, ktory v Jave nevyvija, a len sem tam potrebuje spustit (pripadne prekompilovat) nejaky Java program, je to znacny chaos.

Fedora

Fedora/RHEL ponuka OpenJDK (an open source implementation of the Java Platform, Standard Edition) vo viacerych verziach.

Verzie OpenJDK (2026-03):
LTS versions      Fedora 43: 21, 25   RHEL 9: 1.8.0, 11, 17, 21, 25
Latest versions   Fedora 43: 24, 26   RHEL 9: 21, 26
Main subpackages of java-<ver>-openjdk package in Fedora
java-<ver>-openjdk-headless java-<ver>-openjdk java-<ver>-openjdk-devel java-<ver>-openjdk-jmods
Headless runtime environment (without audio and video support)
Minimum core of JVM, java
Runtime environment (GUI runtime)
Contains only graphics lib, depend on core headless subpackage
Development environment (tools)
jar, javac, jlink, jmod etc.
Depend of previous 2 subpackages
JMods for OpenJDK
jmods/*.jmod files
Depend of previous 3 subpackages
Other subpackages, like java-<ver>-openjdk-javadoc or java-<ver>-openjdk-portable are not important for normal work.
# Installing of Java OpenJDK (development and runtime environment) on Fedora 43 (2026-03)

$ sudo dnf install java-devel   # or java for runtime environment only
Package                           Arch     Version                        Repository          Size
Installing:
 java-25-openjdk-devel            x86_64   1:25.0.2.0.10-3.fc43           updates         11.6 MiB
Installing dependencies:
 java-25-openjdk                  x86_64   1:25.0.2.0.10-3.fc43           updates        960.2 KiB   # only GUI runtime
 java-25-openjdk-crypto-adapter   x86_64   1:25.0.2.0.10-3.fc43           updates        504.5 KiB
 java-25-openjdk-headless         x86_64   1:25.0.2.0.10-3.fc43           updates        236.5 MiB   # core runtime

NOTE Instead of package name java-devel can be used name java-25-openjdk-devel or 6 other names of the same package,
see # dnf repoquery --provides java-25-openjdk-devel $ java --version openjdk 25.0.2 2026-01-20 OpenJDK Runtime Environment (Red_Hat-25.0.2.0.10-2) (build 25.0.2+10) OpenJDK 64-Bit Server VM (Red_Hat-25.0.2.0.10-2) (build 25.0.2+10, mixed mode, sharing)

V pripade instalacie viacerych verzii je prepinanie medzi jednotlivymi verziami standardne cez alternatives(8)rpm.

$ sudo alternatives --config java   # and javac for development
There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/lib/jvm/java-21-openjdk/bin/java
*+ 2           /usr/lib/jvm/java-25-openjdk/bin/java
   3           /usr/lib/jvm/java-8-temurin-jdk/bin/java

POZOR V pripade instalacie viacerych verzii aj pre development environment (javac) je prepinanie medzi verziami nezavisle od prepinania verzii samotneho runtime environment(java).

Mnoho Java aplikacii podporuje pouzivanie environment variable JAVA_HOME ako sposob urcenie, ktore JDK (ktora verzia) sa ma pouzivat na spustenie aplikacie. Samotny prikaz java nepouziva JAVA_HOME.

Od Fedora 42 (released 2025-04) boli baliky java-1.8.0-openjdk, java-11-openjdk a java-17-openjdk vyhlasene ako zastarale a prestali sa dalej distribuovat. V pripade potreby instalacie starsich verzii Java sa oficialne odporuca instalacia z Eclipse Adoptium repositories, see also rpm or rpm/fedora (or over Web GUI).

$ dnf repoquery --repo adoptium-temurin-java --qf "%{name}   %{installsize}\n" --latest-limit=1 | sort -V | paste - -
temurin-8-jdk    205391100      temurin-8-jre    109599606
temurin-11-jdk   325365547      temurin-11-jre   130322596
temurin-17-jdk   331476026      temurin-17-jre   141112445
temurin-21-jdk   360380297      temurin-21-jre   164663173
temurin-25-jdk   315199133      temurin-25-jre   198577056

NOTE Nezabudat, ze sucasne JDK ponuka zjednotene JDK vratane JRE (JRE je uz sucastou JDK). Zmysel ma teda instalovat len samotne JRE alebo len JDK, ale nie obidva packages sucasne. Nepliest s distribuciou Java packages priamo vo Fedora, kde package java-<ver>-openjdk-devel priamo zavisi od package java-<ver>-openjdk.

JavaWS

JavaWS (Java Web Start), resp. javaws(1)rpm je zastarany framework, ktory umoznoval spustat Java aplikaciu priamo z internetu cez web browser. Stiahnutie, instalaciu a samotne spustanie Java aplikacie cez Java Web Start sa realizuje cez .jnlp (Java Network Launching Protocol) subor napisany v XML formate. V Jave SE 9 (released 2017-09) bol oznaceny ako deprecated a v Jave SE 11 (released 2018-09) uz bol uplne odstraneny. Kedze komercna podpora Oracle pre Java SE 8 (resp. Java SE 9) konci az v 2030 roku, mozeme sa stretnut s jeho pouzivanim este aj dnes.

Java Web Start obsahoval casti, ktore neboli open source a Oracle ho distribuoval (do verzie 8, resp. 9) iba v Oracle Java, ale nie v OpenJDK (a nikdy ani uplne nemigroval do OpenJDK). Vznikli open source riesenia, najskor IcedTea-Web (aktualne ako AdoptOpenJDK/IcedTea-Web) a neskor aj OpenWebStart (neexistuje Fedora package).

$ sudo dnf install icedtea-web
Package                            Arch       Version                       Repository               Size
Installing:
 icedtea-web                       x86_64     1.8.8-10.fc43                 fedora                3.5 MiB

$ dnf repoquery --requires icedtea-web | grep openjdk
java-21-openjdk

NOTE Napriek tomu, ze default verzia Javy je 25, instaluje sa ako zavislost aj verzia 21 (najnizsia verzia Javy, distribuovana v Fedora). Tato verzia IcedTea-Web nefunguje pod aktualne najnovsou verziou Java 25 (vid nizsie).

IcedTea-Web bolo historicky vyvijane pre OpenJDK 8 a nie pre moderne OpenJDK 11/17/21, kde sa odporuca novsi OpenWebStart, ktory je vyvijany pre Java 11 a vyssie. Aktualna Fedora 43 instaluje ako zavislost java-21-openjdk package, kedze je to najnizsia verzia Javy, ktora je v aktualnej Fedore distribuovana. Odporuca sa vsak doinstalovat Javu verziu 8 (a teda temurin-8-jdk package) pre ktoru je icedtea-web vyvijane. Ano, chaos2.

V pripade realnej potreby JavaWS asi najrozumnejsie bude stiahnut povodny Oracle Java SE 8, JRE, ktoreho sucastou je aj javaws.

IcedTea-Web running with Java version 21, 25 and 8
$ JAVA_HOME=/usr/lib/jvm/java-21-openjdk/ javaws -version   # to same as default
$ javaws -version
selected jre: /usr/lib/jvm/jre-21-openjdk
WARNING: package sun.applet not in java.desktop
WARNING: package com.sun.net.ssl.internal.ssl not in java.base
WARNING: package jdk.internal.util.jar not in java.base
WARNING: package javax.jnlp not in java.desktop
WARNING: A command line option has enabled the Security Manager
WARNING: The Security Manager is deprecated and will be removed in a future release
icedtea-web 1.8.8 (fedora-10.fc43-x86_64)

$ JAVA_HOME=/usr/lib/jvm/java-25-openjdk/ javaws -version      # warnings and error
selected jre: /usr/lib/jvm/java-25-openjdk/
WARNING: package sun.applet not in java.desktop
WARNING: package com.sun.net.ssl.internal.ssl not in java.base
WARNING: package sun.security.action not in java.base
WARNING: package jdk.internal.util.jar not in java.base
WARNING: package javax.jnlp not in java.desktop
Error occurred during initialization of VM
java.lang.Error: A command line option has attempted to allow or enable the Security Manager. Enabling a Security Manager is not supported.
        at java.lang.System.initPhase3(java.base@25.0.2/System.java:1969)

$ JAVA_HOME=/usr/lib/jvm/java-8-temurin-jdk/ javaws -version   # recommended
selected jre: /usr/lib/jvm/java-8-temurin-jdk/jre/
icedtea-web 1.8.8 (fedora-10.fc43-x86_64)

Hello World

// file 'HelloWorld.java'

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello world");
  }
}
$ javac HelloWorld.java   # compile and wrote Java bytecode HelloWorld.class from Java source code HelloWorld.java
$ java  HelloWorld        # execute Java bytecode HelloWorld.class (from current . dot dir) in Java runtime environment
Hello world

NOTE A simple source file(s) with a main() class, modern Java (since Java 11) can compile and execute "on the fly".
$ java HelloWorld.java    # compile and execute "on the fly" (only simple source file)