Soporte para LibrerÃas Compartidas en NetBeans 6.1
Cuantas veces nos encontramos al compartir un proyecto con problemas de librerÃas no referenciadas? Ó, cuantas veces nos piden/tenemos que pedir las dependencias de un proyecto que fue compartido, finalmente pasando jars, javadoc, sources, explicaciones de cómo se tiene que llamar las librerÃas, etc.? Muchas veces el problema no es notorio si nosotros somos lo que lo compartimos, pero si al momento de recibir un proyecto y encontrar que algo falta para poder compilar el mismo.
Por suerte, desde NB 6.1 Beta podemos ver una luz en el horizonte: Sharable Libraries.
Veremos un repaso a los problemas comunes que nos encontramos hoy en dÃa y como resolverlos con esta nueva caracterÃstica incorporada en esta versión del IDE.
Conceptos Básicos
Antes de ver un ejemplo, nos adentrarnos en el tema repasaremos algunos conceptos.
Tipos de librerÃas
Existen tres tipos de librerÃas que se pueden insertar dentro de un proyecto de NetBeans:
- Jar/Folder: Aquà directamente se indica un .jar que se quiere agregar al proyecto.
- Project: Este tipo hace referencia a otro proyecto de NetBeans.
-
Library: Las librerÃas son conjuntos de .jar relacionados bajo un mismo nombre, facilitando su referenciación en un proyecto. Pueden incluir no solo los binarios, sino además Javadoc y Sources que nos ayudarán al momento de programar.
Este tipo de librerÃas a su vez pueden ser de dos tipos: definidas por NB (definidas a la hora de instalar el IDE) o definidas por el usuario. Su configuración es guardado por en un archivo de definiciones de librerÃas.
Por ejemplo, la librerÃa JAX-WS 2.1 encapsula los siguientes jars:
Archivos de definición de librerÃas
Es un archivo de propiedades (.properties) o XML en el cual se guarda la definición de las librerÃas, por ejemplo:
libs.junit.classpath=${base}/junit/junit-3.8.2.jar
libs.junit.javadoc=${base}/junit/junit-3.8.2-api.zip
libs.junit_4.classpath=${base}/junit_4/junit-4.1.jar
libs.MyLibrary_01.classpath=${base}/AbsoluteLayout.jar
Hasta NB 6.0 solo existÃa un archivo de definición de librerÃas a nivel global del IDE, que hoy es conocido como Catalogo de LibrerÃas.
A partir de NB 6.1 Beta se pueden crear y editar archivos de definición de librerÃas personalizados, creando repositorios para uno o más proyectos en particular. Esto permite poder compartir no solo el proyecto, sino además este junto con a definición de las librerÃas y las librerÃas propiamente dichas que utiliza.
Para editar un archivos de definición (ya sea el global o los personalizados) se debe acceder al Library Manager (desde el menú Tools->Libraries). Una vez que elegimos la localización del archivo de definiciones, podremos ver, definir una nueva, borrar ó modificar la definición de una librerÃa:
Catálogo de LibrerÃas
Como vimos anteriormente, el catalogo de librerÃas (ó Global Libraries) es el repositorio de librerÃas a nivel global del IDE. En él vienen definidas las librerÃas por defecto creadas al momento de realizar la instalación de NB y es el que utilizan todos los proyectos por defecto, salvo que indique un archivo de definición de librerÃas en particular.
Se puede acceder a él mediante el Library Manager eligiendo como localidad de la librerÃa a “Global Libraries”:
En este caso no se ha agregado ninguna definición de librerÃa nueva, pudiendo observar el listado de librerÃas definidas por defecto al instalar NB 6.1 Beta.
Estructura de archivos de un proyecto
Al crear un nuevo proyecto en NB (ya sea desde cero o a partir de código existente), por defecto este generará una estructura de archivos que permiten la mejor organización, por ejemplo:
Donde:
- src: aquà se encuentra el código fuente de nuestra aplicación (.java)
- test: aquà está el código fuente de las pruebas (.java)
- build: aquà contiene los archivos generados por el compilador (.class)
- dist: aquà se encuentran los archivos listos para distribuir (.jar y librerÃas)
-
nbproject: aquà NB guarda las configuraciones del proyecto
- prÃvate: configuraciones propias del usuario
- prÃvate: configuraciones propias del usuario
De los archivos que vemos en la figura, toma vital importancia el archivo build.xml, debido a que este es el script de Ant que configura todos los aspectos relacionados a la compilación del proyecto, indicando los pasos de construcción y empaquetado, ubicación de las librerÃas de dependencias, etc.
Compartiendo un proyecto
Básicamente existen dos tipos de destinatarios que pueden recibir un proyecto nuestro: otro usuario de NB o uno que no lo sea. Este último deberá valerse del script de Ant para poder realizar la compilación (build.xml).
Como podemos suponer, al compartir un proyecto, no es necesario compartir los directorios build y dist, ya que estos pueden ser generados a partir del código fuente (almacenado en src). Adicionalmente si el destinatario tiene NB no hará falta tampoco compartir el directorio con configuraciones del usuario (nbproject/private) ya que este se configurará al momento de abrir el proyecto.
Un caso extremo (e ideal a la hora de compartir) es un proyecto que no dependa de ninguna librerÃa. No importa el tipo de destinatario del proyecto este no tendrÃa que tener ninguna complicación a la hora de compilar y ejecutar la aplicación, ya que posee todo el código necesario y todas las librerÃas (es decir, ninguna).
Este no es el común de los casos, aunque sea para realizar test, para visualización, etc. siempre tendremos al menos un librerÃa, y justamente los problemas comienzan cuando tenemos al menos una librerÃa en el proyecto a compartir.
Los problemas más comunes que podemos tener a la hora de utilizar cada tipo de librerÃa son los siguientes:
LibrerÃas provistas por NB
Este tipo de librerÃas comúnmente no posee ningún problema entre usuarios del IDE debido a que estas librerÃas ya vienen definidas al instalar el mismo (salvo que la librerÃa usada haya sido borrada del Catalogo Global). El problema que se lo encontrarán los usuarios que quieran compilar el proyecto directamente desde Ant, sin utilizar el IDE, ya que no podrán resolver las referencias a las librerÃas.
LibrerÃas definidas por el usuario
Aquà la situación es la misma que la anterior para el usuario de Ant, ya que no posee la definición de las librerÃas.
Para otro usuario de NB que no posee las librerÃas definidas el IDE le indicará el problema, indicándole el nombre que debe poseer la librerÃa que debe crear, pero no sabrá que jars incluye. En este punto es donde deberá contactarse con la persona que compartió el archivo para completar la definición de las librerÃas.
Un problema potencial adicional es si el usuario de NB posee definidas librerÃas con el nombre de las requeridas pero el contenido es totalmente diferente (jars que incluye), debiendo modificar la definición de la librerÃa para solucionar el problema, pero seguramente trasladando los problemas al proyecto para el cual habÃa creado la misma.
Jars
Los jars se agregan a un proyecto con paths relativos al proyecto, por lo que ambos tipos de usuario tendrán problemas si el jar en cuestión no se encuentra en la localización correcta.
Generalmente la forma de solucionar este problema hasta NB 6 era colocarlo dentro de la estructura del proyecto (en un directorio llamado lib por ejemplo), para que al compartir el proyecto el jar vaya dentro del mismo.
Otro proyecto de NB
Cuando un proyecto depende de otro ocurrirá la misma situación anterior, se utiliza el path relativo para referenciarlo, por lo que la localización del mismo será muy importante a la hora de compilar.
Otra vez, la forma de compartir los proyectos que dependen uno del otro debe hacerse de tal forma que el receptor luego no tenga problemas para reubicar los mismos en la forma adecuada. Tanto en NB 6.1 Beta como en las versiones anteriores este problema debe resolverse de esta forma, ya que la librerÃa de la cual se depende es un proyecto en si mismo, no pudiéndose mover/copiar a una ubicación arbitrariamente.
Solución a los Problemas con NetBeans 6.1 Beta
NB 6.1 Beta resuelve los tres primeros casos vistos anteriormente creando un repositorio con todas las librerÃas (junto a su definición) y jars de los cual depende el proyecto.
El repositorio creado deberá ser compartido junto al proyecto.
El proyecto guarda un path relativo al repositorio, por lo que se debe elegir bien la posición donde se colocara (lo mismo que pasa al compartir un proyecto de NB que depende de otro).
Por ejemplo:
Para este ejemplo, tenemos en el directorio “ProyectoNB” el proyecto que vamos a compartir, mientras que en el directorio “libreries” el repositorio.
Dentro del directorio “Proyecto NB” tenemos la estructura de directorio de nuestro proyecto, y dentro de “libreries” tenemos la definición de las librerÃas (nblibreries.properties) junto con las librerÃas y jars requeridos por el proyecto.
Al momento de compartir lo que harÃamos seria enviar el directorio “a_compartir” completo al destinatario.
Veremos un par de ejemplos para ver las pantallas que se ven implicadas en el proceso. También veremos que es muy fácil transformar un proyecto existente a compartido.
Ejemplo 1: Crear un proyecto nuevo preparado para ser compartido
En este ejemplo veremos como empezar de cero un nuevo proyecto compartido.
Creamos un nuevo proyecto:
Al llegar a este dialogo nos encontramos con dos nuevos agregados en NB 6.1 Beta:
- A: Si chequeamos indicaremos explÃcitamente que el proyecto es un proyecto para compartir.
- B: Al chequear A se habilita el textbox para indicar la ubicación que tendrá el repositorio de librerÃas. Mediante el botón “Browse…” nos facilita la búsqueda del lugar donde se encuentra un repositorio de librerÃas creado anteriormente.
Una vez aceptado este dialogo (haciendo click en Finish) se tendrá el proyecto listo para compartir.
Ejemplo 2: Pasar de un proyecto no compartido a hacerlo
En este ejemplo veremos como si tenemos un proyecto no compartido (nuevos o de versiones de NB previas a NB 6.1 Beta).
Al crear el nuevo proyecto no compartido:
C: Creamos el proyecto como no compartido (sin chequear la casilla)
Abrimos dentro del proyecto sus propiedades y revisamos las propiedades de las librerÃas:
Hacemos click en el botón se nos abrirá un dialogo de configuración del archivo de definición de librerÃas.
y luego de haber aceptado solo queda decir que acción se va a realizar con las librerÃas a las cuales el proyecto estaba apuntando.
NB nos preguntara que hacer, generalmente conviene “Use Existing Library in New Location”, ya que todas las librerÃas necesarias por el proyecto serán copiadas en el directorio de librerÃas, dejando el proyecto listo para ser compartido.
Saludos.
Hasta la próxima.
Más Info
NetBeans IDE 6.1 Beta Blogging Constest
Este post está participando de NetBeans IDE 6.1 Beta Blogging Contest


















