Java EE tiene este "velo misterioso" a su alrededor para los desarrolladores de Java más jóvenes, uno que he estado tratando de levantar durante bastante tiempo con poco éxito.
La confusión surge de:
Java EE parece ser tanto una biblioteca como una plataforma; hay varias formas de "obtener" la biblioteca de Java EE, normalmente de algo como la descarga del SDK de Java EE de Oracle. Sin embargo, la biblioteca Java EE no funcionará ni se compilará a menos que su código se esté ejecutando o tenga acceso a un servidor de aplicaciones Java EE (como JBoss, GlassFish, Tomcat, etc.). ¿Por qué? ¿No pueden las bibliotecas funcionar fuera del entorno del servidor de aplicaciones? ¿Por qué necesito algo masivo como JBoss solo para compilar un código simple para enviar un correo electrónico?
¿Por qué las bibliotecas Java EE no son "estándar" y están incluidas en la descarga regular de JVM y / o en el SDK?
¿Por qué hay tantas ofertas de Java EE cuando en realidad solo hay dos tipos principales de Java estándar (Oracle JVM / SDK | OpenJDK JVM / JDK)?
¿Qué se puede hacer con Java EE que no se puede hacer con Java estándar?
¿Qué se puede hacer con Java estándar que no se puede hacer con Java EE?
¿Cuándo decide un desarrollador que "necesita" Java EE?
¿Cuándo decide un desarrollador que no necesita Java EE?
¿Por qué la versión de la biblioteca Java EE no está sincronizada con las versiones estándar de la biblioteca Java (Java EE 6 frente a Java 7)?
¡Gracias por ayudarme a limpiar la flagelación!
fuente
Respuestas:
¿Por qué las bibliotecas no pueden funcionar fuera del entorno del servidor de aplicaciones?
De hecho, pueden. La mayoría de las bibliotecas se pueden usar directamente de forma independiente (en Java SE) o incluirse en un .war (prácticamente eso es casi siempre Tomcat). Algunas partes de Java EE, como JPA, tienen secciones explícitas en sus respectivas especificaciones que indican cómo deben funcionar y usarse en Java SE.
En todo caso, no es tanto un entorno de servidor de aplicaciones per se lo que está en juego aquí, sino la presencia de todas las demás bibliotecas y el código de integración que las une.
Por eso, las anotaciones se escanearán solo una vez para todas sus clases en lugar de que cada biblioteca (EJB, JPA, etc.) realice este escaneo una y otra vez. También por eso, las anotaciones CDI se pueden aplicar a beans EJB y los administradores de entidades JPA se pueden inyectar en ellos.
¿Por qué necesito algo masivo como JBoss solo para compilar un código simple para enviar un correo electrónico?
Hay algunas cosas mal en esta pregunta:
¿Por qué las bibliotecas Java EE no son "estándar" y están incluidas en la descarga regular de JVM y / o en el SDK?
Java EE, en cierto modo, fue uno de los primeros intentos de dividir el ya enorme JDK en fragmentos que son más fáciles de administrar y descargar. La gente ya se está quejando de que las clases gráficas (AWT, Swing) y los Applets están dentro del JRE cuando todo lo que hacen es ejecutar algunos comandos en un servidor sin cabeza. ¿Y luego también desea incluir todas las bibliotecas Java EE en el JDK estándar?
Con el eventual lanzamiento del soporte de modularidad, solo tendremos un JRE base pequeño con muchas cosas que se pueden instalar por separado como paquetes. Quizás algún día muchas o incluso todas las clases que ahora componen Java EE serán también ese paquete. El tiempo dirá.
¿Por qué hay tantas ofertas de Java EE cuando en realidad solo hay dos tipos principales de Java estándar (Oracle JVM / SDK | OpenJDK JVM / JDK)?
Hay más de dos sabores de Java SE. Existe al menos el IBM JDK, el anterior BEA (JRocket, que se fusionará con el de Oracle / Sun debido a la adquisición), varias otras implementaciones de código abierto y una gran cantidad de implementaciones para uso integrado.
La razón por la que Java SE y EE son una especificación es que muchos proveedores y organizaciones pueden implementarlo y, por lo tanto, fomenta la competencia y mitiga el riesgo de bloqueo del proveedor.
Realmente no es diferente con los compiladores C y C ++, donde tiene muchas ofertas en competencia y todas se adhieren al estándar C ++.
¿Por qué la versión de la biblioteca Java EE no está sincronizada con las versiones estándar de la biblioteca Java (Java EE 6 frente a Java 7)?
Java EE se basa en Java SE, por lo que se queda atrás. Sin embargo, las versiones se corresponden. Java EE 5 requiere Java SE 5. Java EE 6 requiere Java SE 6 y así sucesivamente. Es solo que principalmente cuando Java SE X es actual, Java EE X-1 es actual.
fuente
Aquí hay algunas respuestas rápidamente redactadas a sus preguntas ...
¿Por qué no pueden funcionar las bibliotecas JavaEE sin un servidor de aplicaciones? Los servicios proporcionados por JavaEE (transacciones administradas por contenedores, inyección de dependencias administradas por contenedores, servicio de temporizador, etc.) involucran inherentemente servidores de aplicaciones compatibles con JavaEE (por ejemplo: GlassFish, JBoss, WebSphere, etc.). Por lo tanto, las bibliotecas JavaEE no sirven para nada sin un contenedor de este tipo. " ¿Por qué necesito algo tan masivo como JBoss solo para compilar un código simple para enviar un correo electrónico? " Hay formas de enviar un correo electrónico sin JavaEE ... Pero si quieres hacerlo de la forma JavaEE, necesitas un contenedor JavaEE.
¿Por qué no se incluyen las bibliotecas JavaEE con la descarga de JavaSE? La misma razón por la que muchas bibliotecas no están incluidas: sería una exageración. Dado que ni siquiera puede usar las bibliotecas JavaEE sin un servidor de aplicaciones, ¿por qué molestarse en incluirlas? JavaEE debe descargarse siempre y cuando un desarrollador instale un servidor de aplicaciones y decida utilizar JavaEE.
¿Por qué hay tantas ofertas de JavaEE? ¿Hay realmente " tantas " ofertas de JavaEE? Si es así, enumere algunos de ellos. Más exactamente, creo que hay varias implementaciones de las mismas API .
¿Qué se puede hacer con JavaEE que no se puede hacer sin Java estándar? Un montón. No puede confiar en un servidor de aplicaciones para administrar transacciones o contextos de persistencia sin JavaEE. No puede permitir que un servidor de aplicaciones administre la inyección de dependencias EJB sin JavaEE. No puede usar un servicio de temporizador administrado por aplicación sin JavaEE. La respuesta a esta pregunta debería aclarar la respuesta a la primera pregunta ... La mayoría de los servicios proporcionados por JavaEE requieren un contenedor JavaEE.
¿Qué se puede hacer con JavaSE que no se puede hacer con JavaEE? Um ... no lo sé.
¿Cuándo decide un desarrollador que necesita JavaEE? Esta pregunta es completamente subjetiva ... Pero si necesitas alguno de los servicios proporcionados por JavaEE, empieza a pensar en ello. Si no sabe qué es JavaEE ... probablemente no lo necesite.
¿Cuándo decide un desarrollador que no necesita JavaEE? Ver respuesta anterior.
¿Por qué la versión de la biblioteca JavaEE no está sincronizada con la versión JavaSE? Buena pregunta. No pretendo saber cómo responder ... Pero supongo que la respuesta es: "porque no están sincronizados".
fuente
A vista de pájaro, Java EE es una plataforma, es decir, algo sobre lo que podemos construir.
Desde una perspectiva más técnica, el estándar Java Enterprise Edition define un conjunto de API que se utilizan comúnmente para crear aplicaciones empresariales. Estas API son implementadas por servidores de aplicaciones, y sí, diferentes servidores de aplicaciones tienen la libertad de utilizar diferentes implementaciones de las API de Java EE.
Compila con las API de Java EE, por lo que solo necesita esas API en el momento de la compilación. En tiempo de ejecución, también necesitará una implementación de estas API, es decir, un servidor de aplicaciones.
Tu no Sin embargo, si desea utilizar la API de Java EE para enviar correo, necesitará una implementación de esa API en tiempo de ejecución. Esto puede ser proporcionado por un servidor de aplicaciones o proporcionado por una biblioteca independiente que agregue a su classpath.
Porque solo las API están estandarizadas, no las implementaciones.
Porque la gente no está de acuerdo sobre la forma correcta de implementar ciertas funciones. Porque diferentes proveedores compiten por la participación de mercado.
Dado que las implementaciones de Java EE se crean con "Java estándar": Nada. Sin embargo, aprovechar las bibliotecas existentes puede ahorrar una gran cantidad de esfuerzo si está resolviendo problemas empresariales típicos, y el uso de una API estandarizada puede evitar el bloqueo del proveedor.
Nada, ya que Java EE incluye Java SE.
En términos generales, las API de Java EE resuelven problemas típicos y recurrentes en la informática empresarial. Si tiene estos problemas, por lo general tiene sentido utilizar las soluciones estándar, pero si tiene problemas diferentes, es posible que se requieran soluciones diferentes. Por ejemplo, si necesita hablar con una base de datos relacional, debería considerar usar JPA. Pero si no necesita una base de datos relacional, JPA no lo ayudará.
fuente
¿Qué es Java EE?
Comencemos por la definición de canonicidad en wiki:
El punto principal aquí es que Java EE es una plataforma que proporciona una API, no una biblioteca concreta.
¿Qué se necesita para Java EE?
El alcance principal de Java EE son las aplicaciones basadas en red, a diferencia de Java SE orientado al desarrollo de aplicaciones de escritorio con soporte de red simple. Ésta es la principal diferencia entre ellos. Escalabilidad, mensajería, transacciones, soporte DB para cada aplicación ... la necesidad en todo esto ha aumentado con la evolución de la red. Por supuesto, muchas de las soluciones listas que proporciona Java SE son útiles para el desarrollo de redes, por lo que Java EE amplía Java SE.
¿Por qué necesitamos servidores de aplicaciones para ejecutar nuestro código?
¿Por qué necesitamos sistemas operativos? Debido a que hay mucho trabajo doloroso con el hardware que debemos hacer para hacer una aplicación aún más simple. Y sin SO tienes que hacerlo una y otra vez. El sistema operativo simplificado es solo un contenedor programático, que nos proporciona un contexto global para ejecutar nuestras aplicaciones.
Y esto es lo que son los servidores de aplicaciones. Nos permiten ejecutar nuestras aplicaciones en su contexto y nos proporcionan una gran cantidad de funciones de alto nivel que se necesitan para las aplicaciones de red empresariales de alta carga. Y no queremos escribir nuestras propias bicicletas para resolver estos problemas, queremos escribir código que satisfaga nuestras necesidades comerciales.
Otro ejemplo aquí podría ser JVM para Java.
¿Por qué Java EE no contiene un servidor de aplicaciones integrado?
Difícil de decir para mí. Creo que se hizo para mayor flexibilidad. Java EE dice lo que deben hacer, ellos deciden cómo hacerlo.
¿Por qué JVM no incluye Java EE?
Porque se dirigieron a diferentes sectores del mercado. Java EE tiene un montón de funcionalidades que no son necesarias para los escritorios habituales.
¿Por qué hay tantas ofertas de Java EE?
Porque Java EE solo describe el comportamiento. Todos pueden implementarlo.
¿Qué se puede hacer con Java EE que no se puede hacer con Java SE?
Para conquistar internet. Es muy difícil de hacer con los subprogramas y sockets de Java SE :)
¿Qué se puede hacer con Java SE que no se puede hacer con Java EE?
Como se mencionó anteriormente, Java EE extiende Java SE, por lo que con Java EE debería poder hacer todo lo que está disponible para Java SE.
¿Cuándo decide un desarrollador que "necesita" Java EE?
Cuando necesitan el poder de Java EE. Todo lo mencionado anteriormente.
¿Cuándo decide un desarrollador que no necesita Java EE?
Cuando escriben una aplicación de escritorio o consola habitual.
¿Por qué las versiones de Java SE y Java EE no están sincronizadas?
Java siempre ha tenido problemas con sus tecnologías de nomenclatura y control de versiones. Entonces esta situación no es una excepción.
fuente
Java EE tiene que ver con el concepto de contenedor.
El contenedor es un contexto de ejecución dentro del cual se ejecutará su aplicación y que le proporcionará un conjunto de servicios. Cada tipo de servicio está definido por una especificación denominada JSR. Por ejemplo, JSR 907, JTA (Java transaction Api) que proporciona una forma estándar de administrar transacciones distribuidas contra diferentes recursos.
En general, hay muchas implementaciones diferentes para un JSR determinado, la implementación que usará depende del proveedor del contenedor, pero eso no le importa, ya que está seguro de que el comportamiento respeta el contrato predefinido: la API JSR.
Entonces, para aprovechar Java EE, debe ejecutar su aplicación dentro de un contenedor. Los dos principales son EJB y el contenedor de servlets que están presentes en cualquier servidor de aplicaciones certificado por Java EE.
El objetivo de todo esto es definir un entorno de ejecución estándar que le permita empaquetar su aplicación solo con lo esencial, id.est. tu negocio. Evita depender de un conjunto desconocido y variado de bibliotecas de terceros que tendría que empaquetar y proporcionar con su aplicación de otra manera, y que pueden ser fuentes de conflicto con otras aplicaciones en el servidor. En Java EE, usted sabe que todos los requisitos estándar no funcionales como seguridad, transacción, escalabilidad, invocación remota y muchos más serán proporcionados por el contenedor (factorizado para todas las aplicaciones que se ejecutan dentro de él) y solo tiene que basar su trabajo en su.
fuente