Perché le librerie non possono funzionare al di fuori dell'ambiente del server delle applicazioni?
In realtà possono. La maggior parte delle librerie può essere utilizzata direttamente in modalità standalone (in Java SE) o inclusa in un file .war (praticamente è quasi sempre Tomcat). Alcune parti di Java EE, come JPA, hanno sezioni esplicite nelle rispettive specifiche che indicano come dovrebbero funzionare ed essere utilizzate in Java SE.
Semmai, non è tanto un ambiente di application server in sé che è in gioco qui, ma la presenza di tutte le altre librerie e il codice di integrazione che le unisce.
Per questo motivo, le annotazioni verranno scansionate solo una volta per tutte le classi invece di ogni libreria (EJB, JPA, ecc.) Che esegue questa scansione più e più volte. Anche per questo motivo, le annotazioni CDI possono essere applicate ai bean EJB e in essi possono essere iniettati i gestori di entità JPA.
Perché ho bisogno di qualcosa di enorme come JBoss solo per compilare un semplice codice per inviare un'e-mail?
Ci sono alcune cose che non vanno in questa domanda:
- Per la compilazione è necessario solo il jar API, che è inferiore a 1 MB per il profilo Web e poco più di 1 MB per il profilo completo.
- Per correre hai ovviamente bisogno di un'implementazione, ma "massiccio" sta esagerando. OpenJDK, ad esempio, è di circa 75 MB e TomEE (un'implementazione del profilo Web contenente il supporto per la posta) è solo di 25 MB. Anche GlassFish (un'implementazione del profilo completo) è solo 53 MB.
- Mail funziona perfettamente da Java SE (e quindi Tomcat) anche utilizzando mail.jar e activation.jar indipendenti .
Perché le librerie Java EE non sono "standard" e sono incluse nel normale download di JVM e / o nell'SDK?
Java EE in un certo senso è stato uno dei primi tentativi di suddividere il già enorme JDK in blocchi più facili da gestire e scaricare. Le persone si lamentano già del fatto che le classi grafiche (AWT, Swing) e le applet si trovano all'interno di JRE quando tutto ciò che fanno è eseguire alcuni comandi su un server headless. E poi vuoi includere anche tutte le librerie Java EE nel JDK standard?
Con l'eventuale rilascio del supporto per la modularità avremo solo un piccolo JRE di base con molte cose installabili separatamente come pacchetti. Forse un giorno molte o anche tutte le classi che ora compongono Java EE saranno anche tali pacchetti. Il tempo lo dirà.
Perché ci sono così tante offerte Java EE quando esistono solo due versioni principali di Java standard (Oracle JVM / SDK | OpenJDK JVM / JDK)?
Esistono più di due versioni di Java SE. C'è almeno l'IBM JDK, il precedente BEA (JRocket, che è stato fuso in Oracle / Sun a causa dell'acquisizione), varie altre implementazioni open source e una sfilza di implementazioni per uso embedded.
Il motivo per cui Java SE ed EE sono una specifica è che molti fornitori e organizzazioni possono implementarla e quindi incoraggia la concorrenza e mitiga il rischio di vincoli del fornitore.
Non è davvero diverso con i compilatori C e C ++, dove hai molte offerte concorrenti e tutte aderenti allo standard C ++.
Perché la versione della libreria Java EE non è sincronizzata con le versioni della libreria Java standard (Java EE 6 e Java 7)
Java EE si basa su Java SE, quindi rimane indietro. Le versioni però corrispondono. Java EE 5 richiede Java SE 5. Java EE 6 richiede Java SE 6 e così via. È solo che soprattutto quando Java SE X è aggiornato, Java EE X-1 è attuale.