Java 17
()
Información de este libro electrónico
Este libro va dirigido a to
Relacionado con Java 17
Libros electrónicos relacionados
Java 17 Programación Avanzada Calificación: 0 de 5 estrellas0 calificacionesProgramación Orientada a Objetos en JAVA Calificación: 0 de 5 estrellas0 calificacionesIngeniería inversa Calificación: 0 de 5 estrellas0 calificacionesAprende a Programar con Java Calificación: 4 de 5 estrellas4/5Programación Java - Una Guía para Principiantes para Aprender Java Paso a Paso Calificación: 3 de 5 estrellas3/5Programación Java: JDBC y Swing Calificación: 0 de 5 estrellas0 calificacionesBackbone JS. JavaScript Framework. 2ª Edición Calificación: 0 de 5 estrellas0 calificacionesCurso de programación Bash Shell Calificación: 0 de 5 estrellas0 calificacionesDesarrollo de aplicaciones móviles para Android con Kodular Calificación: 0 de 5 estrellas0 calificacionesSeguridad en aplicaciones Web Java: SEGURIDAD INFORMÁTICA Calificación: 5 de 5 estrellas5/5Seguridad en aplicaciones Web Java Calificación: 0 de 5 estrellas0 calificacionesDesarrollo de aplicaciones web con Jakarta EE Calificación: 0 de 5 estrellas0 calificacionesIniciar con Lazarus y Free Pascal Calificación: 5 de 5 estrellas5/5JavaScript Una Guía de Aprendizaje para el Lenguaje de Programación JavaScript Calificación: 3 de 5 estrellas3/5Desarrollo Web en Java Calificación: 3 de 5 estrellas3/5Processing: Desarrollo de interfaces de usuario, aplicaciones de visión artificial e IoT para Arduino y ESP8266 Calificación: 5 de 5 estrellas5/5Domine JavaScript (4ª Edición) Calificación: 0 de 5 estrellas0 calificacionesAprende a Programar ASP .NET y C# - Segunda Edición Calificación: 0 de 5 estrellas0 calificacionesDomine Microsoft Windows Server 2012 Calificación: 0 de 5 estrellas0 calificacionesCreación de Macros en Excel Calificación: 0 de 5 estrellas0 calificacionesDomine Microsoft Windows Server 2012: Servidores Calificación: 0 de 5 estrellas0 calificacionesAprende a Programar para Android Calificación: 5 de 5 estrellas5/5JavaScript: Guía completa Calificación: 4 de 5 estrellas4/5La programación JavaScript Calificación: 0 de 5 estrellas0 calificacionesProgramación en C# para Principiantes Calificación: 0 de 5 estrellas0 calificacionesAprende a programar en C# Calificación: 5 de 5 estrellas5/5Backbone JS Calificación: 0 de 5 estrellas0 calificacionesProgramación Visual Basic con Excel 2010 Calificación: 0 de 5 estrellas0 calificacionesProgramación Visual Basic con Excel 2010: Hojas de cálculo Calificación: 4 de 5 estrellas4/5Kotlin y Jetpack Compose. Desarrollo de aplicaciones Android Calificación: 0 de 5 estrellas0 calificaciones
Programación para usted
Aprende a programar: Crea tu propio sitio web Calificación: 4 de 5 estrellas4/5Excel de la A a la Z: El Manual Práctico Paso a Paso de Microsoft Excel para Aprender Funciones Básicas y Avanzadas, Fórmulas y Gráficos con Ejemplos Fáciles y Claros Calificación: 0 de 5 estrellas0 calificacionesPython para principiantes Calificación: 5 de 5 estrellas5/5Python Paso a paso: PROGRAMACIÓN INFORMÁTICA/DESARROLLO DE SOFTWARE Calificación: 4 de 5 estrellas4/5GuíaBurros Microsoft Excel: Todo lo que necesitas saber sobre esta potente hoja de cálculo Calificación: 4 de 5 estrellas4/5HTML para novatos Calificación: 5 de 5 estrellas5/5Ortografía para todos: La tabla periódica de la ortografía Calificación: 5 de 5 estrellas5/5El gran libro de Python Calificación: 5 de 5 estrellas5/5Fundamentos de programación: un enfoque práctico Calificación: 5 de 5 estrellas5/5Lógica de programación: Solucionario en pseudocódigo – Ejercicios resueltos Calificación: 4 de 5 estrellas4/5Linux Essentials: una guía para principiantes del sistema operativo Linux Calificación: 5 de 5 estrellas5/5VBA Excel Guía Esencial Calificación: 5 de 5 estrellas5/5Python Aplicaciones prácticas Calificación: 4 de 5 estrellas4/5Fundamentos De Programación Calificación: 5 de 5 estrellas5/5Python a fondo Calificación: 5 de 5 estrellas5/5Arduino. Trucos y secretos.: 120 ideas para resolver cualquier problema Calificación: 5 de 5 estrellas5/5Arduino. Edición 2018 Curso práctico Calificación: 4 de 5 estrellas4/5Curso básico de Python: La guía para principiantes para una introducción en la programación con Python Calificación: 0 de 5 estrellas0 calificacionesAprende a programar en C# Calificación: 5 de 5 estrellas5/5Diseño Web con CSS Calificación: 5 de 5 estrellas5/5El Libro Práctico Del Programador Ágil Calificación: 5 de 5 estrellas5/5115 Ejercicios resueltos de programación C++ Calificación: 3 de 5 estrellas3/5Introducción al Uso de Formularios (UserForms) en VBA Calificación: 3 de 5 estrellas3/5JavaScript: Guía completa Calificación: 4 de 5 estrellas4/5Bases de Datos con MySQL Calificación: 4 de 5 estrellas4/5Power Query para Excel 365/2021 Calificación: 0 de 5 estrellas0 calificacionesAprende a Programar en C++ Calificación: 5 de 5 estrellas5/5Aprender a programar con Excel VBA con 100 ejercicios práctico Calificación: 5 de 5 estrellas5/5
Comentarios para Java 17
0 clasificaciones0 comentarios
Vista previa del libro
Java 17 - José María Vegas Gertrudix
INTRODUCCIÓN
El hardware es la parte física de un computador, mientras que el software es la parte lógica del mismo.
Un Ingeniero de Software es aquella persona que construye un sistema software correcto y eficiente para ser ejecutado por el hardware de un computador.
Construir software es divertido y gratificante. En cierto modo, nos convierte en creadores de mundos nuevos. Pero también es difícil, porque los computadores tienen la mala costumbre de hacer lo que les decimos que hagan, no lo que queremos que hagan.
El camino para aprender a construir software correcto y eficiente es duro, pero estoy seguro de que libros como el que estás leyendo ahora mismo pueden ayudarte a hacerlo más fácil.
El libro que estás leyendo está actualizado para Java 17 y JUnit 5. Se dirige a aquellos programadores que quieren poner a trabajar la tecnología Java en proyectos reales, para lo cual se estudian herramientas y técnicas metódicas que permiten el desarrollo de software fiable y eficiente.
El libro está pensado para ser leído secuencialmente, porque cada capítulo se construye sobre los conceptos aprendidos en los capítulos previos. No obstante, el lector que ya conozca determinados contenidos puede saltar directamente a los capítulos que le resulten desconocidos.
Es preciso tener en cuenta que lo normal no es entender todos los conceptos presentados en el libro simplemente leyendo el texto. Es importante estudiar el código, escribirlo, ejecutarlo e incluso puede que depurarlo para llegar a entenderlo.
Para los que deseen profundizar aún más en este lenguaje, el autor tiene publicada otra obra con el título Java 17 Programación Avanzada que amplía y complementa los contenidos de ésta.
El código fuente que aparece en el libro está disponible para descargar en:
https://github.com/josemari/JavaCursoPracticoProjects
Y en la web del libro en: www.ra-ma.com
Incluye varios proyectos Maven que pueden ser importados en Eclipse. Cualquier versión de este entorno de desarrollo integrado debería servir, siempre y cuando soporte Java 17.
Me encantaría tener noticia de cualquier errata que exista en el libro o en el código. Para informar de una errata, está disponible el siguiente correo electrónico:
Al final de la presente obra, hay una sección dedicada a la bibliografía consultada para la elaboración de este manual. Quiero expresar mi más profundo agradecimiento tanto a los autores de dichas obras de consulta, como a las numerosas fuentes de internet que han ayudado a que este libro sea una realidad, tan amplias que son de difícil enumeración.
1
Introducción a Java
Instalación de Java, Maven y Eclipse
El primer paso de nuestra aventura consiste en preparar el entorno de trabajo. Lo primero que necesitamos es tener instalado un JDK compatible en el computador. Instalaremos la última versión que tiene soporte extendido por ser la más estable, Java 17.
El JDK puede ser descargado del sitio web de Oracle en la dirección:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
O bien es posible emplear una implementación de código abierto del JDK denominada OpenJDK, que se puede descargar de:
http://openjdk.java.net/
Una vez instalado el JDK, el siguiente paso es establecer apropiadamente la variable de entorno JAVA_HOME.
Así, en Mac OS, en caso de no existir para nuestro usuario el fichero .profile, lo primero que hay que hacer es crear uno vacío mediante la siguiente instrucción ejecutada en la ventana del terminal:
touch ~/.profile
A continuación, utilizamos el editor de textos TextEdit para modificar el fichero:
open -a TextEdit ~/.profile
Y añadimos la siguiente línea al fichero:
export JAVAHOME=$(/usr/libexec/javahome)
donde /usr/libexec/java_home retorna la versión actual de Java instalada en Mac OS.
Una vez hemos guardado los cambios y salido del editor de texto, ejecutamos la siguiente instrucción para aplicar los cambios al fichero .profile:
source ~/.profile
Si ahora ejecutamos en la ventana del terminal la instrucción
echo $JAVA_HOME
obtendremos algo semejante a lo siguiente
/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
También es posible obtener la versión actual de Java instalada en la máquina si ejecutamos la siguiente instrucción en la ventana del terminal
java -version
de modo tal que obtendremos algo parecido a lo siguiente
java version 17
2021-09-14 LTS
Java(TM) SE Runtime Environment (build 17+35-LTS-2724)
Java HotSpot(TM) 64-Bit Server VM (build 17+35-LTS-2724, mixed mode, sharing)
En el caso de Windows, tenemos que pulsar en el botón derecho de Equipo y seleccionar Propiedades. A continuación, vamos a
Configuración avanzada del sistema -> Variables de entorno
Después, pulsamos en Nueva (variable del sistema). En el Nombre de la variable escribimos JAVA_HOME y, en el Valor de la variable, escribimos el directorio donde se ha instalado el JDK.
Finalmente, en
Configuración avanzada del sistema -> Variables de entorno -> Variables del sistema
se modifica la variable PATH añadiendo al final %JAVA_HOME%\bin. Si abrimos una ventana de la consola y ejecutamos la siguiente instrucción:
java -version
obtendremos algo parecido a lo siguiente:
java version 17
2021-09-14 LTS
Java(TM) SE Runtime Environment (build 17+35-LTS-2724)
Java HotSpot(TM) 64-Bit Server VM (build 17+35-LTS-2724, mixed mode, sharing)
El siguiente paso es la instalación de Maven, una herramienta de gestión de proyectos que se puede descargar de la dirección siguiente:
https://maven.apache.org/download.cgi
Elegimos para descargar Maven en formato .zip. Una vez descargada la distribución de Maven, dado que es un archivo .zip, se descomprime dicho archivo en una carpeta y ya se ha finalizado todo el proceso de instalación. Es recomendable actualizar la variable de entorno PATH para que incluya la ruta del ejecutable de Maven.
En el caso de Mac OS, el archivo .zip se descomprime automáticamente una vez finaliza la descarga, así que después movemos a la ruta /opt:
sudo mv $HOME/Downloads/apache-maven-3.8.2 /opt
Finalmente, modificamos el fichero .profile para actualizar la variable de entorno PATH:
export PATH=$PATH:/opt/apache-maven-3.8.2/bin
De nuevo, no nos olvidamos de:
source ~/.profile
Si ahora ejecutamos en la ventana del terminal la instrucción
echo $PATH
obtendremos lo siguiente
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/apache-maven-3.8.2/bin
Asimismo, si ejecutamos en la ventana del terminal la instrucción
mvn -version
obtendremos lo siguiente
Apache Maven 3.8.2 (ea98e05a04480131370aa0c110b8c54cf726c06f)
Maven home: /opt/apache-maven-3.8.2
Java version: 17, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
Default locale: es_ES, platform encoding: UTF-8
OS name: mac os x
, version: 11.5.2
, arch: x86_64
, family: mac
Las dependencias descargadas por Maven se almacenarán por defecto en la carpeta situada en la siguiente ruta, que constituye el repositorio local de Maven:
$USER_HOME/.m2/repository
En caso de que queramos almacenar las mencionadas dependencias en otro destino, podemos indicarlo editando el fichero de configuración de Maven, settings.xml, que se encuentra en el subdirectorio /conf dentro de la carpeta de instalación de Maven; en nuestro caso, sería
/opt/apache-maven-3.8.2/conf
Lo siguiente que necesitamos es un entorno de desarrollo integrado. Vamos a utilizar Eclipse IDE for Java Developers, que podemos descargar de la siguiente dirección:
https://www.eclipse.org/downloads/packages/
Una vez descomprimida la distribución de Eclipse que ha sido descargada en una carpeta, se ha finalizado la instalación. En el caso de Mac OS, al descomprimir el archivo descargado -de tipo .dmg-, se obtiene una aplicación que copiamos a la carpeta de aplicaciones del sistema operativo.
En Windows, se ejecuta Eclipse desde el fichero ejecutable eclipse.exe que viene con la distribución.
Dentro del menú de Eclipse, buscamos la opción Preferences -> Maven. En caso de que la versión de Maven que viene con Eclipse sea inferior a la que hemos instalado en nuestra máquina, podemos añadir y configurar esta última en Eclipse.
También dentro del menú de Eclipse, buscamos la opción Preferences -> Java -> Installed JREs, y marcamos por defecto Java 17. A su vez, en la opción Preferences -> Java -> Compiler, seleccionamos 17 como Compiler compliance level.
Introducción a Maven
Maven es una herramienta de gestión de proyectos que se ha convertido en un estándar de hecho, debido a que su utilización proporciona los siguientes beneficios:
Una estructura de proyecto estándar y bien definida.
Una gestión automática de las dependencias del proyecto.
Una gestión integral del ciclo de vida del proyecto.
Una rápida configuración del proyecto por medio de los arquetipos.
Maven utiliza convención en lugar de configuración. La estructura de proyecto que define Maven es una convención y se ha convertido en un estándar a nivel mundial para el desarrollo de proyectos Java. Por ejemplo, asumiendo que
${basedir}
indica la ubicación del proyecto en el disco duro, los proyectos Maven suelen tener las carpetas
${basedir}/src/main/java
${basedir}/src/main/test
En la primera, se coloca el código fuente y, en la segunda, el código de las pruebas. Maven es suficientemente inteligente para incluir en los archivos binarios que se van a distribuir solo las clases compiladas a partir de la carpeta java y no las que provienen de las pruebas. Otras carpetas habituales de los proyectos Maven son
${basedir}/src/main/resources
${basedir}/src/test/resources
En la primera, se almacenan ficheros de recursos necesarios para la ejecución de la aplicación y, en la segunda, se almacenan ficheros de recursos necesarios únicamente para la ejecución de las pruebas. También tenemos que las clases compiladas se almacenan en
${basedir}/target/classes
mientras que el artefacto generado se almacena en
${basedir}/target
En definitiva, Maven reconoce su estructura de proyecto al compilar y empaquetar los proyectos. Por ejemplo, coloca todos los ficheros de recursos en la raíz del archivo JAR resultante de la operación de empaquetado. De esta manera, se facilita muchísimo el desarrollo de un proyecto en múltiples entornos de desarrollo integrados.
Todo proyecto Maven tiene un fichero XML descriptor pom.xml en la raíz del proyecto que especifica todas sus características, también llamado simplemente fichero POM, donde POM significa Modelo de Objetos del Proyecto (del inglés Project Object Model).
Un proyecto genera un único artefacto, sea un archivo JAR, WAR o EAR. El artefacto o biblioteca generada necesita ser identificado para poder ser utilizado por otros proyectos. De ahí que se definan las coordenadas del proyecto como los parámetros cuyos valores definen al proyecto de manera unívoca. Estas coordenadas del proyecto son el groupId, el artifactId, la version y el packaging y se definen en el pom.xml.
La coordenada groupId indica el identificador único de la organización o grupo que ha creado el proyecto. Generalmente, se suele utilizar el nombre del dominio en internet de la organización, pero invirtiendo el orden de escritura de las palabras; es decir, si el dominio en internet fuera maven.apache.org, el groupId del proyecto creado sería org.apache.maven.
La coordenada artifactId indica el prefijo único del nombre del artefacto que genera el proyecto. Generalmente, el nombre final del artefacto será de la forma:
La coordenada version indica la versión del artefacto que genera el proyecto. Cuando una versión tiene el apéndice de SNAPSHOT, significa que el proyecto está en desarrollo.
La coordenada packaging indica qué tipo de artefacto va a generar Maven a partir del proyecto. Si se omite esta coordenada, el empaquetado por defecto es jar. Otras opciones posibles son ejb, war, ear y pom. Lógicamente, en función del tipo de proyecto, el valor del empaquetado será uno u otro.
Un repositorio de Maven es un almacén de bibliotecas JAR y de ficheros descriptores POM. Cuando un proyecto define una dependencia en su fichero POM, Maven busca primero en el repositorio local y, si no la encuentra, la descarga del repositorio central. Como ya sabemos, el repositorio local por defecto de Maven es:
$USER_HOME/.m2/repository
Y el repositorio central de Maven es:
https://repo1.maven.org/maven2/
En el fichero descriptor POM, también se indican las dependencias, es decir, las bibliotecas necesarias para compilar o probar el proyecto. Una biblioteca tiene distintas versiones de modo que la dependencia, a través de sus coordenadas, especifica qué versión nos interesa. Maven gestiona automáticamente las dependencias transitivas, de modo que descarga también las dependencias de las bibliotecas descargadas. Cuando se define una dependencia en el POM, existe también la posibilidad de definir su ámbito (en inglés scope). Existen varios ámbitos diferentes posibles:
El ámbito compile es el ámbito por defecto, de modo que será el utilizado si no se especifica ámbito alguno. Toda dependencia con ámbito de compilación será incluida en la ruta de clases del proyecto y también será incluida en el artefacto final.
El ámbito test indica que la dependencia sólo es necesaria para compilar y ejecutar las pruebas del proyecto, de modo que no será incluida en el artefacto final.
El ámbito provided indica que la dependencia se utiliza durante las fases de compilación y pruebas, pero que no se incluyen en el artefacto final. Se utiliza a menudo para incluir los archivos JAR de JavaEE (como, por ejemplo, servlet-api.jar), ya que son necesarios para compilar pero, como ya están en el servidor de aplicaciones Java, no es necesario volver a incluirlos dentro del artefacto final.
El ámbito runtime indica que la dependencia será necesaria durante la ejecución de la aplicación pero no al compilar.
Existen tres ciclos de vida de construcción en Maven: default, clean y site.
El ciclo de vida clean controla la limpieza del proyecto, ya que se encarga de eliminar las clases compiladas y archivos binarios del proyecto.
El ciclo de vida default controla el despliegue del proyecto, ya que genera las clases compiladas y archivos binarios del proyecto.
El ciclo de vida site controla la generación de la página web de documentación del proyecto, ya que genera los ficheros .html que describen el proyecto.
Para ejecutar estos ciclos de vida, excepto en el caso de default, se debe poner mvn ciclo. Así, por ejemplo:
mvn clean
O bien:
mvn site
Cada uno de estos ciclos de vida está definido por una lista diferente de fases, donde cada fase representa un estado en el ciclo de vida. Las fases del ciclo de vida default son 23, pero no es necesario aprenderlas todas; entre las más relevantes, y en el orden en el que se ejecutan, están:
La fase validate, que valida el proyecto.
La fase initialize que configura propiedades y crea directorios.
La fase compile que compila el código fuente del proyecto.
La fase test que ejecuta las pruebas.
La fase package que genera el artefacto del proyecto.
La fase verify que verifica el artefacto generado.
La fase install que instala el artefacto en el repositorio local.
La fase deploy que sube el artefacto a un repositorio Maven en la red.
Para ejecutar una fase, basta escribir mvn fase. Una fase contiene a todas las fases anteriores. Es decir, cada una de estas fases se ejecuta secuencialmente para completar el ciclo de vida. Si, por ejemplo, invocamos la ejecución de la fase deploy del ciclo de vida default:
mvn deploy
Esta invocación también provocará la ejecución de todas las fases que la preceden.
Aunque parece complicado, en la práctica la mayoría de las veces se utiliza para compilar un proyecto la orden:
mvn clean install
Sin embargo, aunque una fase de construcción es responsable de un paso específico en el ciclo de vida de construcción, el modo en que éste se lleva a cabo puede variar. Esto se consigue declarando objetivos (en inglés goals) de complementos (en inglés plugins) asociados a fases de construcción.
Un objetivo de un complemento es una tarea específica que se puede unir a alguna de las fases, aunque podría darse el caso de que un objetivo no estuviera unido a fase alguna y se ejecutara fuera del ciclo de vida; por ejemplo, mediante una llamada directa.
Pongamos como ejemplo la orden siguiente:
mvn clean dependency:copy-dependencies package
Los argumentos clean y package son fases de construcción, mientras que dependency:copy-dependencies es un objetivo de un complemento. Si la ejecutásemos, la fase clean se ejecutaría primero (lo cual quiere decir que ejecutará todas las fases precedentes del ciclo de vida clean, además de la propia fase clean), y luego el objetivo dependency:copy-dependencies (lo cual quiere decir que ejecuta el objetivo copy-dependencies del complemento de Maven dependency), antes de ejecutar finalmente la fase package (y todas sus fases precedentes del ciclo de vida default).
En función del tipo de empaquetado del proyecto, cambian los objetivos que Maven asocia por defecto a las diferentes fases del ciclo de vida.
Podemos desarrollar más aún estos conceptos.
Un objetivo es una tarea unitaria aislada que realiza algún tipo de trabajo real. Por ejemplo, el objetivo compile compila el código fuente de Java y se ejecuta de la forma siguiente
mvn compiler:compile
Todos los objetivos son proporcionados por complementos, sean complementos por defecto o bien complementos definidos por el usuario y configurados en el fichero POM.
Una fase es un grupo de objetivos ordenados o, en otras palabras, cero o más objetivos de complementos que están vinculados a una fase, bien por defecto o bien por el usuario. Por ejemplo, la fase compile de compilación, que se puede ejecutar como
mvn compile
consiste sólo en el objetivo del complemento siguiente:
compiler:compile
Ejecutar una fase consiste básicamente en ejecutar todos los complementos vinculados a ella.
El ciclo de vida de construcción es un grupo de fases ordenadas. Si ejecutamos una fase, todas las fases anteriores incluyendo dicha fase serán ejecutadas. Una fase con cero objetivos de complementos asociados no realiza tarea alguna.
Como hemos comentado, en función del empaquetado del proyecto, diferentes objetivos serán asociados a diferentes fases del ciclo de vida por Maven.
La diferencia entre objetivo y complemento es clara:
Un complemento puede tener múltiples objetivos.
Un complemento puede no estar necesariamente vinculado a una fase.
Cuando un objetivo de un complemento está asociado a una fase de un ciclo de vida, es básicamente para extender funcionalidad no encontrada todavía en ese ciclo de vida.
Una fase de un ciclo de vida puede estar asociada a uno o más objetivos de un complemento.
Un objetivo es a veces llamado Mojo, del inglés Maven plain Old Java Object.
Cada versión generada de un artefacto software debe estar etiquetada a través de un número de versión. Dicho número de versión debe seguir un formato específico para que así cada versión del artefacto sea identificada de manera única, y además pueda aportar información de su naturaleza y objetivo. En general, se expresa que a una versión de un artefacto software se le asigna una versión X.Y.Z, de modo que:
X representa el número de versión mayor.
Y representa el número de versión menor.
Z representa el número de parche de la versión.
Cuando se genera una nueva versión del artefacto software, se decide si se incrementa el número de versión mayor, menor o el número de parche en función de la naturaleza del cambio. Así, dada una versión con número de versión X.Y.Z y una nueva versión a partir de ella:
Se incrementa X si la nueva versión incluye cambios de API incompatibles.
Se incrementa Y si se trata de evolutivos o cambios retrocompatibles con la versión X.Y.Z.
Se incrementa Z cuando se trata de correcciones de errores en la versión X.Y.Z.
Es importante tener en cuenta lo siguiente:
El incremento de los números de versión mayor, menor y número de parche es secuencial.
Si se incrementa la versión mayor, se ponen a cero los valores de la versión menor y del número de parche de la versión. Es decir, la nueva versión mayor de la versión 3.2.1 es la 4.0.0.
Si se incrementa la versión menor, se pone a cero el número de parche de la versión. Es decir, la nueva versión menor de la versión 3.2.1 es la 3.3.0.
Si se incrementa el número de parche de la versión, los números de versión mayor y de versión menor no se modifican. Es decir, un parche sobre la versión 3.2.1 genera una nueva versión con número de versión 3.2.2.
Pueden incluirse etiquetas en las versiones del artefacto que actualmente están en desarrollo. Es decir, 3.0.0-alpha o también 3.0.0-SNAPSHOT.
Un concepto particularmente útil que presenta Maven es el de arquetipo. En esencia, un arquetipo es una plantilla para la creación de una clase de proyectos. Existen multitud de arquetipos de modo que, empleando Eclipse, podemos seleccionar el arquetipo a partir del cual queremos que nos cree el proyecto.
Del menú File, se selecciona New, y luego Project. En la ventana que aparece de New Project, seleccionamos Maven Project y pulsamos Next. En la siguiente ventana de configuración, si seleccionamos la opción Create a simple project, Eclipse indicará a Maven que utilice el arquetipo por defecto -que crea un proyecto Java simple- y, por tanto, no nos permitirá escoger qué arquetipo queremos usar para crear el proyecto.
La ventana de configuración también nos permite decidir si se utiliza o no la ruta por defecto del espacio de trabajo actual para este nuevo proyecto. El concepto de espacio de trabajo es esencial en Eclipse. Cada vez que se ejecuta el entorno de desarrollo integrado Eclipse, lo hace sobre un determinado espacio de trabajo, que no es más que un directorio o carpeta de la máquina en la que estamos trabajando. Este espacio de trabajo se selecciona cuando se inicia Eclipse. No obstante, se puede cambiar mientras se está ejecutando el entorno de desarrollo; ahora bien, en caso de modificarlo, habría que reiniciar Eclipse.
En caso de no seleccionar la opción anteriormente indicada, sí podremos seleccionar el arquetipo que nos interese en la siguiente ventana de selección. Después, pulsamos Next.
En la siguiente ventana de configuración, debemos especificar las coordenadas de Maven que se van a añadir al fichero pom.xml del nuevo proyecto:
El paquete base para el nuevo proyecto, por defecto, recibe automáticamente el valor de groupId.
El nombre del nuevo proyecto, artifactId.
La versión inicial del nuevo proyecto, version que, por defecto, recibe un valor automáticamente aunque puede ser modificado a nuestra conveniencia.
Después, pulsamos Finish y ya estaría.
Hay que hacer notar que el arquetipo por defecto no está actualizado, de forma que los complementos que tiene configurados por defecto no son compatibles con versiones actuales de Java. No obstante, se soluciona fácilmente: Sólo es necesario decirle a Maven, a través del POM, que utilice versiones más actuales de los complementos indicándoles, allí donde sea necesario, qué versión de Java queremos emplear. Así, por ejemplo, para compilar con una versión actualizada de Java, podemos incluir en el POM lo siguiente:
1.0 encoding=UTF-8
?>
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd
>
...
Cuando se realiza algún cambio en el POM, es necesario pulsar el botón derecho del ratón sobre el nombre del proyecto en Eclipse y seleccionar:
Maven -> Update Project
De esta manera, la configuración de Eclipse se sincroniza con la configuración del POM.
En ocasiones, Eclipse se queda atascado usando Maven, mostrando errores persistentes. Si estamos seguros de que el proyecto se encuentra bien configurado, podemos seguir la siguiente secuencia de acciones para que Eclipse se actualice correctamente y deje de mostrar dichos errores:
Pulsamos botón derecho del ratón sobre el proyecto y seleccionamos -> Refresh.
En la barra de menú de Eclipse, seleccionamos Project -> Clean.
Pulsamos botón derecho del ratón sobre el proyecto y seleccionamos Maven -> Update Project.
Pulsamos botón derecho del ratón sobre el proyecto y seleccionamos Run As... -> Maven Clean.
Pulsamos botón derecho del ratón sobre el proyecto y seleccionamos Run As... -> Maven Install.
En el peor de los casos, podemos borrar todo el repositorio local de Maven y volver a ejecutar la secuencia anterior de acciones. Los artefactos que necesita el proyecto volverán a descargarse del repositorio central.
También podemos importar en Eclipse un proyecto ya creado con Maven. Así, por ejemplo, podemos descargar los proyectos situados en la siguiente dirección de GitHub:
https://github.com/josemari/JavaCursoPracticoProjects
Después, los proyectos descargados se pueden importar uno por uno en Eclipse siguiendo la siguiente secuencia de movimientos:
File -> Import -> Maven -> Existing Maven Projects
y seleccionar el directorio donde se encuentre el proyecto descargado y descomprimido.
Dado que el proyecto BookExamples tiene como dependencia al proyecto BookLibrary, es mejor compilar primero el proyecto BookLibrary, por lo que primero nos situamos sobre el proyecto BookLibrary y, sobre el nombre del mismo, pulsamos el botón derecho y seleccionamos
Run As... -> Maven Clean
Y después
Run As... -> Maven Install
Después, hacemos lo mismo con BookExamples.
Finalmente, para ejecutar cualquiera de los ejemplos que vienen con el proyecto BookExamples y que explicaremos en los sucesivos capítulos, lo único que hay que hacer es situarse en el fichero que contiene la clase que posee el método main() (del que hablaremos en su momento), pulsar el botón derecho y seleccionar
Run As... -> Java Application
Disección de un Programa Sencillo en Java
Un programa sencillo en Java sería el siguiente:
package org.jomaveger.bookexamples.chapter1;
public class FirstExample {
public static void main(String[] args) {
System.out.println(Hello World!
);
}
}
Este programa se limita a imprimir un mensaje en la ventana de la consola.
Java respeta las mayúsculas y las minúsculas por lo que, si se cometen errores en este sentido (como, por ejemplo, escribir Main en lugar de main), el programa no funcionará.
La palabra reservada public es un modificador de acceso. Estos modificadores de acceso controlan el nivel de acceso que tienen a este código otras partes del programa.
La palabra reservada class recuerda que toda entidad que existe en un programa en Java vive dentro de una clase.
Después de la palabra reservada class, está el nombre de la clase. Los nombres de las clases tienen que empezar por una letra, y después pueden contener cualquier combinación de letras y dígitos. La longitud del nombre no está limitada. No se pueden utilizar palabras reservadas de Java como nombre de una clase.
La convención estándar consiste en que los nombres de las clases son sustantivos que comienzan por una letra mayúscula. Si un nombre está formado por múltiples palabras, se escribe en mayúsculas la inicial de cada una de estas palabras.
Es necesario hacer que el nombre de fichero correspondiente al código fuente sea el nombre de la clase pública, añadiéndole la extensión .java. Por tanto, es preciso almacenar este código en un fichero llamado FirstExample.java. De nuevo, las mayúsculas y minúsculas son importantes. No obstante, normalmente es el IDE Eclipse el que se encarga automáticamente de esta gestión.
Para ejecutar un programa compilado, la máquina virtual de Java siempre empieza la ejecución en el código que se encuentra en el método main() de la clase indicada. Por tanto, para que el código se pueda ejecutar, es preciso tener un método main() en el código fuente declarado como en el ejemplo. Es posible, por supuesto, añadir nuestros propios métodos a una clase e invocar esos métodos desde el método main(), como veremos más adelante.
Las llaves delimitan los bloques del programa. Un método es un bloque de programa, por lo que el código de los métodos tiene que empezar por una llave abierta y tiene que terminar con una llave cerrada. Para un método, estas llaves marcan el principio y el fin del cuerpo del método. Dentro del método, se encuentran las sentencias. Toda sentencia en Java debe acabar con un punto y coma.
El cuerpo del método main() contiene una sentencia que escribe una única línea de texto en la consola. En este caso, estamos empleando el objeto System.out e invocamos al método println(). La sintaxis habitual de Java
object.method(params)
es, en cierto modo, equivalente a llamar a una función.
En este caso, estamos llamando al método println() y le pasamos una cadena de caracteres como parámetro real. El método escribe en la consola la cadena que recibe como argumento. Después, pone fin a la línea de resultado de tal modo que cada nueva llamada a println() muestra su resultado en una línea nueva.
Las cadenas de caracteres se delimitan mediante comillas dobles.
Los métodos en Java pueden carecer de parámetros, o bien tener uno o más parámetros. Ahora bien, aun cuando un método no tenga parámetros, sigue siendo necesario emplear los paréntesis cuando se le invoca. Por ejemplo, una variante del método println() sin parámetros se limita a imprimir una línea en blanco, y se invoca mediante la siguiente llamada:
System.out.println();
El objeto System.out también tiene un método print() que no añade el caracter de nueva línea al resultado. Por ejemplo:
System.out.print(Hello
);
imprime Hello sin un salto de línea al final. El próximo resultado aparecerá inmediatamente después de la o.
Comentarios
Los comentarios en el código fuente en Java, al igual que en el resto de lenguajes de programación, no aparecen en el programa ejecutable. Java posee tres tipos de comentarios:
El comentario que empieza por // se extiende desde ese caracter hasta el final de la línea.
Se pueden emplear los delimitadores de comentarios /* y */ para crear un comentario de varias líneas.
Finalmente, hay un tercer tipo de comentario que permite generar automáticamente la documentación del código. Este comentario emplea un /** para empezar y un */ para terminar.
Java tiene una herramienta muy útil, llamada javadoc, que genera documentación en formato HTML a partir de los ficheros de código fuente. La utilidad javadoc extrae información relativa a los elementos siguientes:
Paquetes
Clases e interfaces públicas.
Métodos públicos y protegidos.
Atributos públicos y protegidos.
Por tanto, la utilidad javadoc genera automáticamente la documentación del código fuente a partir de los comentarios que empiezan por /** y terminan por */.
Estos comentarios de documentación contienen texto de formato libre seguido en ocasiones de marcadores. La primera frase del texto de formato libre debería ser una frase que aporte un resumen. Los marcadores más habituales son los siguientes:
El marcador
@param descripción de variable
añade una entrada a la sección de parámetros del método actual. La descripción puede abarcar múltiples líneas. Todos los marcadores de este tipo de un mismo método deben estar juntos.
El marcador
@return descripción
añade una sección al método actual, cuya longitud puede ser de varias líneas, que describe el contenido de lo que retorna el método.
El marcador
@throws descripción de clase
añade una nota indicativa de que el método actual puede lanzar una excepción.
El marcador
@author nombre
es un comentario de documentación de clase que indica el autor de la misma.
El marcador
@version texto
es también un comentario de documentación de clase que describe la versión actual de la misma.
El marcador
@since texto
se puede utilizar con cualquier elemento susceptible de ser documentado, de modo que el texto puede ser cualquier descripción de la versión en que se introdujo esta característica.
El marcador
@deprecated texto
añade un comentario que indica que esta clase, método o variable ya no debería utilizarse; ahora bien, el texto debería sugerir un sustituto.
Tipos de Datos Enteros
Los tipos de datos enteros se utilizan para números que carecen de parte fraccionaria. Se permiten valores negativos. Java ofrece cuatro tipos de datos enteros:
El tipo byte, cuya anchura es de 8 bits o bien 1 byte, y su rango inclusivo de valores va de -128 a 127.
El tipo short, cuya anchura es de 16 bits o bien 2 bytes, y su rango inclusivo de valores va de -32.768 hasta 32.767.
El tipo int, cuya anchura es de 32 bits o bien 4 bytes, y su rango inclusivo de valores va de –2.147.483.648 a 2.147.483.647.
El tipo long, cuya anchura es de 64 bits o bien 8 bytes, y su rango inclusivo de valores va de –9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
Es interesante observar que Java carece de tipos sin signo. Asimismo, en Java los tamaños de todos los tipos numéricos son independientes de la plataforma.
Tipos de Datos de Punto Flotante
Los tipos de datos de punto flotante denotan números con parte fraccionaria. Java ofrece dos tipos de punto flotante:
El tipo float, cuya anchura es de 32 bits o bien 4 bytes, y su rango aproximado de valores va de 1,4e–045 hasta 3,4e+038.
El tipo double, cuya anchura es de 64 bits o bien 8 bytes, y su rango aproximado de valores va de 4,9e–324 hasta 1,8e+308.
Hay tres valores especiales en punto flotante: El infinito positivo, el infinito negativo y NaN (no es un número, del inglés Not a Number). Estos tres valores sirven para denotar los desbordamientos y errores. Por ejemplo, el resultado de dividir un número positivo entre cero es el infinito positivo. Al calcular la división de cero entre cero o la raíz cuadrada de un número negativo se obtiene NaN.
Las constantes Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY y Double.NaN (así como las constantes Float correspondientes) representan estos valores especiales. No obstante, no se puede utilizar la comprobación:
if (x == Double.NaN)
porque nunca es verdadero, en el caso de querer determinar si un determinado resultado no es un número. Esto es debido a que todos los valores que no son un número se consideran diferentes entre sí. Sin embargo, se puede emplear para la misma finalidad el siguiente método:
if (Double.isNaN(x))
El Tipo de Datos de los Caracteres
En Java, el tipo de datos empleado para almacenar caracteres es char y se considera también un tipo numérico. Java utiliza Unicode para representar los caracteres, que es un conjunto de caracteres completamente internacional que requiere 16 bits. Por tanto, el tipo char en Java tiene una anchura de 16 bits o bien 2 bytes y, por tanto, su rango inclusivo de valores va de 0 a 65.536. El conjunto estándar de caracteres conocido como ASCII abarca el rango de valores que va de 0 a 127; a su vez, el conjunto de caracteres ISO-Latin-1 comprende el rango de valores que va de 0 a 255.
El Tipo de Datos Lógico
El tipo de datos en Java que gobierna los valores lógicos es el tipo de datos boolean, que sólo tiene dos posibles valores literales, false y true. Se utiliza para evaluar condiciones lógicas. A diferencia de otros lenguajes de programación, no se pueden hacer conversiones entre valores enteros y el tipo de datos boolean.
Literales
Un valor constante en Java se crea utilizando una representación literal del mismo.
Cualquier número entero escrito en base decimal, como 1, 2, 3 y 42, se considera de tipo int. Un número entero puede expresarse en hexadecimal o base 16, mediante el prefijo 0x o bien 0X (por ejemplo, 0xCAFE). Un número entero también puede expresarse en octal o base 8, mediante el prefijo 0; así, por ejemplo, 010 en octal es el 8 en decimal.
Para especificar un literal entero largo de tipo long, es necesario anexar al literal el sufijo L o l (por ejemplo, 4000L).
A partir de Java 7, se pueden especificar literales enteros utilizando notación binaria, para lo cual se utiliza el prefijo 0b o bien 0B. Por ejemplo, el valor decimal 10 puede especificarse mediante el siguiente literal entero en forma binaria:
0b1010
También, a partir de Java 7, es posible utilizar uno o más guiones bajos en un literal entero con el fin de separar dígitos, de modo que los guiones bajos no pueden aparecer ni al principio ni al final del literal. Cuando el literal es compilado, los guiones bajos son descartados. Así, si tenemos el siguiente literal:
123_456_789
quedará el siguiente valor una vez haya sido compilado:
123456789
Los literales de punto flotante representan números decimales con una componente fraccionaria. Se pueden expresar