tag:blogger.com,1999:blog-22159238229609020182024-02-21T18:22:59.320-08:00Programación PrácticaProgramación práctica usando lenguajes Java y PL/SQL. Mediante ejemplos didácticos y relacionados, se cubren los principales tópicos del Desarrollo de Aplicaciones Web y JEE utilizando Eclipse, Tomcat, JBoss y Oracle XE.Dustin Ghiahttp://www.blogger.com/profile/12889194226245084576noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-2215923822960902018.post-73329137453673258772011-09-24T19:58:00.000-07:002011-09-24T20:00:52.028-07:00Instalación de Oracle ASM 11g sobre redhat 5.7 Desktop virtualizado<title></title>
<style type="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm; text-align: justify }
P.cjk { font-size: 10pt }
H1 { margin-top: 0.82cm; margin-bottom: 0.21cm }
H1.western { font-family: "Arial", sans-serif; font-size: 16pt }
H1.cjk { font-family: "DejaVu Sans"; font-size: 16pt }
H1.ctl { font-family: "DejaVu Sans"; font-size: 16pt }
P.comando-western { font-family: "Courier New", monospace; font-size: 10pt; text-align: left }
P.comando-cjk { font-size: 10pt; text-align: left }
P.comando-ctl { text-align: left }
H2 { margin-top: 0.62cm; margin-bottom: 0.41cm }
H2.western { font-family: "Arial", sans-serif; font-size: 14pt; font-style: normal }
H2.cjk { font-size: 14pt; font-style: italic; font-weight: normal }
H2.ctl { font-size: 14pt; font-style: italic; font-weight: normal }
H3 { margin-bottom: 0.21cm }
H3.western { font-family: "Arial", sans-serif; font-size: 12pt }
P.sdfootnote { margin-left: 0.5cm; text-indent: -0.5cm; margin-bottom: 0cm; font-size: 10pt; text-align: left }
A:link { so-language: zxx }
A.sdfootnoteanc { font-size: 57% }
-->
</style>
<br />
<br />
<div align="LEFT" class="western" style="margin-bottom: 0cm;">
<br /></div>
<h1 class="western">
1 Instalación de VirtualBox 4.1.2 sobre Ubuntu
10.0.4</h1>
<ol>
<li><div class="western">
Se agrega en Synaptic, el repositorio
correspondiente:</div>
<div class="comando-western">
deb
http://download.virtualbox.org/virtualbox/debian lucid contrib
non-free</div>
</li>
<li><div class="western">
Del sitio web de VirtualBox se descarga la
clave pública <i>oracle_vbox.asc</i><span style="font-style: normal;">,
y se la agrega al sistema:</span></div>
<div class="comando-western">
sudo apt-key add oracle_vbox.asc</div>
</li>
<li><div class="western">
Se procede con la instalación:</div>
<div class="comando-western">
sudo apt-get update</div>
<div class="comando-western">
sudo apt-get install virtualbox-4.1</div>
</li>
</ol>
<div align="LEFT" class="western" style="margin-bottom: 0cm;">
<br /></div>
<h1 class="western">
2 Instalación de RedHat Enterprise 5.7 –
Desktop</h1>
<h2 class="western">
2.1 Creación de la máquina virtual</h2>
<div class="western">
Se crea la máquina virtual con opciones por
defecto, pero los archivos de VirtualBox se deben ubicar en una
unidad con 100GB aproximadamente en el sistema anfitrión; para esto
sugiero montar una partición en una ubicación como <i>/datos</i>.
</div>
<div class="western">
La memoria que se debe asignar a la máquina
virtual debe ser de 2.9GB al menos, para soportar la infraestructura
Oracle que se va a instalar y la instancia standalone del curso. Se
le asigna un procesador y 128MB para vídeo.</div>
<div class="western">
Únicamente se debe tener atención de los
siguientes puntos para evitar advertencias y mantener un desempeño
aceptable.</div>
<h3 class="western">
2.1.1 Creación del disco para el SO</h3>
<div class="western">
Para el sistema operativo que se va a instalar se
crea una unidad de expansión dinámica en el formato nativo de
VirtualBox, con un tamaño máximo de 20GB.</div>
<h3 class="western">
2.1.2 Configuraciones adicionales</h3>
<div class="western">
Una vez creada la máquina, se activa la caché de
E/S para el disco de la máquina, y se agrega el usuario del sistema
operativo anfitrión al grupo <i>vboxusers</i> mediante el comando:</div>
<div class="comando-western">
sudo usermod -a -G vboxusers oracle</div>
<div class="western">
Donde <i>oracle </i>es el usuario anfitrión.
Finalmente, se debe instalar el paquete de adiciones para el
anfitrión:
</div>
<div class="western">
<i>Oracle_VM_VirtualBox_Extension_Pack-4.1.2-73507.vbox-extpack</i></div>
<div class="western">
El cual puede ser descargado del sitio de
VirtualBox, y debe coincidir en versión con la distribución
instalada de VirtualBox.</div>
<div class="western">
Para la instalación del paquete de extensión se
debe primero asociar el binario descargado
(<i>Oracle_VM_VirtualBox_Extension_Pack-4.1.2-73507.vbox-extpack</i>)
a la instalación de VirtualBox (menú archivo > preferencias >
extensiones) y luego usar el menú de la máquina virtual en
ejecución, la opción “Install Guest Additions”. Esto monta una
imagen en la máquina huesped, que contiene entre otros ejecutables
el archivo <i>VboxLinuxAdditions.run</i>, el cual debe ejecutarse
como <i>root</i> luego de haber afinado el sistema hasta llegar la
sección 3.6 del presente documento.</div>
<h2 class="western">
2.2 Instalación del SO</h2>
<div class="western">
El sistema operativo se instala con las opciones
por defecto para la configuración de red, se deshabilitan las
opciones de corta fuegos y de seguridad adicionales, así como se
omite cualquier opción de cifrado.</div>
<div class="western">
Se omiten también la instalación de paquetes de
sonido y de oficina, para conseguir mayor espacio disponible.</div>
<div class="western">
La configuración de particiones sobre el disco de
20GB creado incluye 1 partición SWAP de aproximadamente 3848MB , y
el resto de espacio para el montaje del sistema de archivos de Linux
( <i>/</i> ).</div>
<div class="western">
La contraseña para <i>root</i> será “oracle”,
y se creará un usuario <i>oracle</i> con contraseña “oracle”.
En general y por tratarse de un curso, la contraseña que se
utilizará para todo siempre será “oracle”.</div>
<div class="western">
Durante la instalación se deshabilita el corta
fuegos del servidor, ya que se requerirá realizar una gran cantidad
de operaciones que podrían fallar si el corta fuegos estuviera
habilitado.</div>
<h1 class="western">
3 Instalación de Oracle Grid Infrastructure</h1>
<div class="western">
La <b>Infraestructura de Grilla de Oracle</b> para
un servidor standalone, es software de soporte para la base de datos,
ASM (sistema de archivos y manejador de volúmenes) y para Oracle
Restart.</div>
<h2 class="western" style="margin-bottom: 0.21cm; margin-top: 0.42cm; page-break-after: avoid;">
3.1 Requisitos de memoria</h2>
<ul>
<li><div class="western">
Mínimo recomendado para memoria RAM
(Infraestructura + Server): 2.5GB</div>
</li>
<li><div class="western">
Valor recomendado para memoria RAM
(Infraestructura + Server): 4GB</div>
</li>
<li><div class="western">
SWAP para memoria de 2GB a 16GB, en igual
tamaño que la memoria RAM.</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<b>Comandos importantes:</b></div>
<div class="comando-western">
free – para conocer el estado de la
memoria</div>
<div class="comando-western">
grep MemTotal /proc/meminfo – para
conocer el total de memoria real</div>
<div class="comando-western">
grep SwapTotal /proce/meminfo – para
conocer el total de memoria SWAP</div>
<h2 class="western" style="margin-bottom: 0.21cm; margin-top: 0.42cm; page-break-after: avoid;">
3.2 Requisitos de espacio en disco</h2>
<ul>
<li><div class="western">
Para la infraestructura, 2.3GB libres bajo <i>/</i></div>
</li>
<li><div class="western">
Para el proceso de instalación, 1GB en <i>/tmp</i></div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<b>Comandos importantes:</b></div>
<div class="comando-western">
df -kh – para conocer el espacio
disponible en disco</div>
<h2 class="western" style="margin-bottom: 0.21cm; margin-top: 0.42cm; page-break-after: avoid;">
3.3 Configuración del ambiente</h2>
<h3 class="western" style="page-break-after: avoid;">
3.3.1 Configuraciones
básicas</h3>
<div class="western">
Se deberán seguir las siguientes acciones:</div>
<ul>
<li><div class="western">
Si no lo estuviera, se debe habilitar el
usuario <i>root</i>, lo cual generalmente se podría hacer con el
comando.</div>
<div class="comando-western">
$> sudo passwd root</div>
<div class="western">
En sistemas redhat el usuario root se configura
durante la instalación del SO.</div>
<div class="western">
</div>
</li>
<li><div class="western">
Crear la variable <i>$ORACLE_BASE</i><span style="font-style: normal;">.
Para esto se deben agregar las siguientes instrucciones al final del
archivo </span><i>/etc/bashrc</i><span style="font-style: normal;">
(archivo de comandos invocado por no-login shells):</span></div>
<div class="comando-western" style="font-style: normal;">
ORACLE_BASE=/u01/app/oracle</div>
<div class="comando-western" style="font-style: normal;">
export
ORACLE_BASE</div>
<div class="western">
</div>
</li>
<li><div class="western">
En el archivo ~/.bash_profile se incluyen las
siguientes instrucciones:</div>
<div class="comando-western" style="font-style: normal;">
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/grid</div>
<div class="comando-western" style="font-style: normal;">
ORACLE_SID=+ASM</div>
<div class="comando-western" style="font-style: normal;">
PATH=$PATH:$ORACLE_HOME/bin</div>
<div class="comando-western" style="font-style: normal;">
export
ORACLE_HOME ORACLE_SID PATH</div>
<div class="western">
</div>
</li>
<li><div class="western">
Establecer <i>umask</i><i><a class="sdfootnoteanc" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote1sym" name="sdfootnote1anc"><sup>1</sup></a></i>
a 022 para el usuario dueño de la instalación (en este caso
<i>oracle</i>), con esto se asegura que el programa de instalación
creará archivos con permisos 755 (u:111 – g:101 – o:101; o lo
que es lo mismo, 0 : rwx – 2 : rx – 2 : rx ), es decir, con esto
se asegura que los archivos que crea el usuario dueño de la
instalación son seguros (root tiene umask 022, un usuario en
general tiene 002).</div>
<div class="western">
Para saber cuál es el modo del usuario actual se
usa<a class="sdfootnoteanc" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote2sym" name="sdfootnote2anc"><sup>2</sup></a>:</div>
<div class="comando-western">
$> umask -S</div>
<div class="western">
Para establecer el modo para el usuario, se
considera el orden de llamadas de scripts para login shells, dado
que la instalación se realizará con el usuario <i>oracle</i>, por
esta razón se modifica el archivo <i>/etc/bashrc</i>.</div>
<div class="comando-western">
$> su</div>
<div class="comando-western">
$> gedit /etc/bashrc</div>
<div class="western">
Se agrega el siguiente código luego de las
instrucciones de inicialización de <i>umask</i> originales del
script:</div>
<div class="comando-western">
if [$UID = 500]; then</div>
<ul>
<div class="comando-western">
umask 022</div>
</ul>
<div class="comando-western">
fi</div>
<div class="western">
</div>
</li>
<li><div class="western">
Los recursos disponibles para el usuario
<i>oracle</i> se pueden ver con el comando ulimit<a class="sdfootnoteanc" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote3sym" name="sdfootnote3anc"><sup>3</sup></a>:</div>
<div class="comando-western">
$> ulimit -a</div>
<div class="western" style="font-style: normal;">
Para poder realizar la
instalación de la infraestructura, se requiere que el máximo de
descriptores de archivos abiertos sea de al menos 65536. Este valor
se debe modificar para el usuario <i>oracle</i> editando el archivo
<i>/etc/security/limits.conf</i>:</div>
<div class="comando-western">
$> su</div>
<div class="comando-western">
$> gedit /etc/security/limits.conf</div>
<div class="western" style="font-style: normal;">
En el cual se agregan
las siguientes líneas:</div>
<div class="comando-western">
oracle soft nofile 4096</div>
<div class="comando-western">
oracle hard nofile 65536</div>
<div class="western" style="font-style: normal;">
Lo cual permite que se
pueda ejecutar desde el archivo <i>~/.bash_profile</i> el comando</div>
<div class="comando-western">
ulimit -n 65536</div>
<div class="western" style="font-style: normal;">
Estos cambios se
aplican con el reinicio del sistema. Una buena referencia de estas
configuraciones se puede revisar en
http://www.puschitz.com/TuningLinuxForOracle.shtml.</div>
</li>
</ul>
<h3 class="western" style="page-break-after: avoid;">
3.3.2 Parámetros
del núcleo</h3>
<ul>
<li><div class="western" style="font-style: normal;">
Los parámetros
del núcleo recomendados para una instalación standalone 11g son:</div>
</li>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
kernel.shmall
= 2097152</div>
<div class="comando-western" style="margin-left: 1.25cm;">
kernel.shmmax
= 536870912</div>
<div class="comando-western" style="margin-left: 1.25cm;">
kernel.shmmni
= 4096</div>
<div class="comando-western" style="margin-left: 1.25cm;">
kernel.sem =
250 32000 100 128</div>
<div class="comando-western" style="margin-left: 1.25cm;">
fs.file-max =
6815744</div>
<div class="comando-western" style="margin-left: 1.25cm;">
net.ipv4.ip_local_port_range
= 9000 65500</div>
<div class="comando-western" style="margin-left: 1.25cm;">
net.core.rmem_default
= 4194304</div>
<div class="comando-western" style="margin-left: 1.25cm;">
net.core.rmem_max
= 4194304</div>
<div class="comando-western" style="margin-left: 1.25cm;">
net.core.wmem_default
= 262144</div>
<div class="comando-western" style="margin-left: 1.25cm;">
net.core.wmem_max
= 1048576</div>
<div class="comando-western" style="margin-left: 1.25cm;">
fs.aio-max-nr
= 1048576</div>
<ul>
<li><div class="western" style="font-style: normal;">
Los parámetros
del servidor pueden ser revisados ejecutando el comando</div>
<div class="comando-western" style="font-style: normal;">
$>
/sbin/sysctl -A</div>
</li>
<li><div class="western">
<span style="font-style: normal;">Para
modificar los parámetros que no coincidan con lo recomendado por
Oracle, se debe modificar el archivo </span><i>/etc/sysctl.conf</i><span style="font-style: normal;">,
y una vez hechas las modificaciones se debe ejecutar el comando
indicado a continuación (para que los cambios apliquen sin
necesidad de reiniciar el servidor):</span></div>
<div class="comando-western" style="font-style: normal;">
$>
/sbin/sysctl -p</div>
</li>
</ul>
<h3 class="western" style="page-break-after: avoid;">
3.3.3 Usuarios,
grupos y variables</h3>
<ul>
<li><div class="western" style="font-style: normal;">
Para poder
instalar la instancia de ASM y la infraestructura, se requiere crear
un usuario y grupos con privilegios determinados. Considerando que
durante la instalación del SO (sección 2.2) se creó ya un usuario
<i>oracle</i>, únicamente se agrega el usuario a los grupos creados
(si el usuario no existiera, se usaría el comando <i>./useradd -g
oinstall -G dba oracle</i>):</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="comando-western" style="margin-left: 1.25cm;">
$> su</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$> cd
/usr/sbin</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$>
./groupadd -g 1000 oinstall</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$>
./groupadd -g 1200 dba</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$>
./usermod -g oinstall -G dba oracle</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$> mkdir -p
/u01/app/11.2.0/grid</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$> mkdir -p
/u01/app/oracle</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$> chown -R
oracle:oinstall /u01</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$> chmod -R
775 /u01</div>
<div class="western">
<br />
<br /></div>
<ul>
<div class="western">
Los identificadores para usuario y grupos son
recomendados, pero por seguridad, se pueden listar los usuarios del
sistema revisando el contenido del archivo /etc/passwd<a class="sdfootnoteanc" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote4sym" name="sdfootnote4anc"><sup>4</sup></a>:</div>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
$> cat
/etc/passwd | grep home</div>
<div class="western" style="margin-left: 1.25cm;">
En el caso documentado
por el presente documento, el usuario oracle tendrá ya un
identificador, que se puede mantener.</div>
<h3 class="western" style="page-break-after: avoid;">
3.3.4 Configuración
de red</h3>
<ul>
<li><div class="western">
El SO necesita una dirección IP fija, y una
interfaz de loopback<a class="sdfootnoteanc" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote5sym" name="sdfootnote5anc"><sup>5</sup></a>
(que en sistemas RedHat es configurada por defecto, así como el
nombre por defecto del servidor<a class="sdfootnoteanc" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote6sym" name="sdfootnote6anc"><sup>6</sup></a>).
Si la dirección del servidor estuviera siendo asignada por DHCP, es
conveniente establecerla como fija; para conocer la información
general de las interfaces de red del equipo se utiliza el comando:</div>
</li>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
$> ifconfig</div>
<div class="western">
<br />
<br /></div>
<ul>
<li><div class="western">
Para conocer la dirección del gateway
(necesaria para la configuración fija), se utiliza el comando:</div>
</li>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
$> route -n</div>
<div class="western" style="margin-left: 1.25cm;">
Cuya salida incluirá
una entrada marcada como UG (up / gateway).</div>
<div class="western">
<br />
<br /></div>
<ul>
<li><div class="western">
Además, de asignar un IP estático al
equipo, se debe modificar el archivo <i>/etc/hosts</i>, para
registrar dicho IP y asociarlo a un nombre con el cual se registrará
el equipo durante la instalación:</div>
<div class="comando-western">
$> su</div>
<div class="comando-western">
$> gedit /etc/hosts</div>
<div class="western">
</div>
<div class="western">
Agregar en el archivo de hosts:</div>
<div class="comando-western">
IP_CONFIGURADO server11gNNAA</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
En donde NNAA podrían ser las iniciales de los
nombres y apellidos, e IP_CONFIGURADO es el número que se asignó
en el paso anterior.</div>
<ul>
<div class="western">
</div>
<li><div class="western">
Para reiniciar las interfaces de red del
servidor, se usan los comandos:</div>
</li>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
$> su</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$>
/etc/init.d/network restart</div>
<ul>
<div class="western">
</div>
<li><div class="western">
Hechos los cambios en la configuración de
red, es posible que el servicio <i>sendmail</i> tarde varios minutos
en levantarse al no poder ubicar un DNS, lo cual repercute en el
tiempo de inicio del sistema operativo. Esto puede ser atendido
modificando el nivel de ejecución del servicio <i>sendmail</i>,
mediante el comando<a class="sdfootnoteanc" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote7sym" name="sdfootnote7anc"><sup>7</sup></a>:
</div>
<div class="comando-western">
$> su</div>
<div class="comando-western">
$> /sbin/chkconfig --level 5 sendmail
off</div>
</li>
</ul>
<h3 class="western" style="page-break-after: avoid;">
3.3.5 Configuración
del driver para las librerías de ASM</h3>
<ul>
<li><div class="western">
El software dependerá de la versión del
núcleo del SO. Para conocer cuál es la versión del núcleo, se
ejecuta el comando:</div>
</li>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
$> uname
-rm</div>
<ul>
<div class="western">
</div>
<li><div class="western">
Dependiendo del valor mostrado, se
descargarán del sitio de Oracle las librerías apropiadas. Por
ejemplo, si la ejecución del comando retorna:</div>
</li>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
$> uname
-rm</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$>
2.6.18-274.el5 i686</div>
<ul>
<div class="western">
</div>
<li><div class="western">
Se deberán descargar del <a href="http://www.oracle.com/technetwork/server-storage/linux/downloads/rhel5-084877.html">sitio
de Oracle</a> los ejecutables que correspondan exactamente:</div>
</li>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
oracleasm-support-2.1.7-1.el5.i386.rpm
</div>
<div class="comando-western" style="margin-left: 1.25cm;">
oracleasm-2.6.18-274.el5-2.0.5-1.el5.i686.rpm</div>
<div class="comando-western" style="margin-left: 1.25cm;">
oracleasmlib-2.0.4-1.el5.i386.rpm
</div>
<ul>
<div class="western">
</div>
<li><div class="western">
Para instalar el software se deben colocar
los archivos en un directorio al cual se pueda acceder y se los
instala como <i>root</i>. Se utiliza el comando siguiente:</div>
<div class="comando-western">
$> /bin/rpm -Uvh
oracleasm-support-2.1.7-1.el5.x86_64.rpm \
oracleasm-2.6.18-274.el5-2.0.5-1.el5.x86_64.rpm \
oracleasmlib-2.0.4-1.el5.x86_64.rpm
</div>
<div class="western">
</div>
</li>
<li><div class="western">
Para inicializar ASM se requiere conocer el
ID del usuario dueño de la instalación y el grupo al cual
pertenecerá la interfaz de ASM que se está instalando (el driver):</div>
<div class="comando-western">
$> id oracle</div>
<div class="western">
</div>
</li>
<li><div class="western">
Para realizar la configuración se debe
ejecutar:</div>
<div class="comando-western">
$> /etc/init.d/oracleasm configure</div>
</li>
</ul>
<div class="western" style="margin-left: 1.25cm;">
Los valores que se
utilizarán son:</div>
<div class="western" style="margin-left: 2.5cm;">
<b>UID:</b> el ID del
usuario oracle</div>
<div class="western" style="margin-left: 2.5cm;">
<b>GID:</b> el ID del
grupo dba creado en el numeral 3.3.3</div>
<div class="western" style="margin-left: 2.5cm;">
<b>Iniciar el driver al
iniciar el SO:</b> sí</div>
<div class="western" style="margin-left: 2.5cm;">
<b>Escanear por discos
ASM al arrancar el SO:</b> sí</div>
<h2 class="western" style="margin-bottom: 0.21cm; margin-top: 0.42cm; page-break-after: avoid;">
3.4 Oracle ASM – definiciones</h2>
<div class="western">
Software de la base de datos Oracle (Oracle
Installation Software): El software de una instalación de servidor
de bases de datos Oracle.</div>
<ul>
<li><div class="western">
<b>Oracle Configuration Asistant (OCA):</b>
Programa de creación y configuración de bases de datos.</div>
</li>
<li><div class="western">
<b>Oracle Restart:</b> Software que permite
el reinicio automático de la instancia de base de datos, Oracle Net
Listener, Servicios de la base de datos, y OASM.</div>
</li>
<li><div class="western">
<b>Oracle Automatic Storage Management
(OASM):</b> Software especializado, manejador de volúmenes y
sistema de archivos que soporta instalaciones de una sola instancia
e instalaciones tipo clúster.</div>
</li>
<li><div class="western">
<b>Oracle Automatic Storage Management
Cluster File System (OACFS):</b> Permite trabajar a ASM en ambientes
tipo cluster tanto como en ambientes de una sola instancia.</div>
</li>
<li><div class="western">
<b>Oracle Automatic Dymanic Volumen Manager
(OADVM):</b> Manejador de volúmenes que utiliza OASM.</div>
</li>
<li><div class="western">
<b>Oracle ASM Configuration Asistant
(OASMCA):</b> En versiones 10g, la configuración de ASM estaba
delegada al OCA. En versiones 11g existe este programa para dicho
fin. OASMCA es parte de Oracle Grid Infraestructure.</div>
</li>
<li><div class="western">
<b>Oracle Grid Infraestructure:</b> Software
de Oracle que provee soporte a nivel de sistema para OASM. OACFS,
Oracle Restart y para el software de la base de datos en sí mismo.</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<h2 class="western" style="margin-bottom: 0.21cm; margin-top: 0.42cm; page-break-after: avoid;">
3.5 Consideraciones para la instalación de OASM</h2>
<ul>
<li><div class="western">
¿Se va a utilizar ASM para DB files? ¿Para
recovery files? ¿Para ambos? Esta alternativa se puede decidir
durante la creación y configuración de una base de datos cuando se
realiza esto en modo AVANZADO.</div>
</li>
<li><div class="western">
¿Qué nivel de redundancia se va a utilizar?
ASM provee 3 niveles:</div>
</li>
<li><div class="western">
<b>Redundancia externa:</b> Oracle ASM no
refleja los contenidos de sus grupos de discos. Se recomienda esta
opción cuando el SO provee redundancia por RAID.</div>
</li>
<li><div class="western">
<b>Redundancia normal:</b> A este nivel ASM
provee por defecto espejamiento de dos vías para archivos de datos
(<i>data files</i>) y de tres vías para archivos de control
(<i>control files</i>), aunque esto puede ajustarse a un menor nivel
si fuese lo requerido. Para usar redundancia normal, se requieren al
menos dos grupos de discos de fallo (dos dispositivos de disco). <u>El
espacio efectivo disponible en disco en un esquema de este tipo, es
igual a la mitad de la suma del espacio disponible en ambos discos</u>.</div>
</li>
<li><div class="western">
<b>Alta Redundancia:</b> Se requieren al
menos tres grupos de discos de fallo (tres dispositivos) y el
espejamiento se realiza en tres vías para data files y en cuatro
vías para control files.</div>
</li>
<li><div class="western">
¿Cómo configurar los grupos de discos
(failure groups)? Conceptos relevantes relacionados con alta
disponibilidad de discos pueden encontrarse en:</div>
</li>
</ul>
<div class="western" style="margin-left: 1.25cm;">
<a href="http://www.cuddletech.com/veritas/raidtheory/x31.html">http://www.cuddletech.com/veritas/raidtheory/x31.html</a></div>
<div class="western" style="margin-left: 1.25cm;">
<a href="http://en.wikipedia.org/wiki/RAID">http://en.wikipedia.org/wiki/RAID</a></div>
<ul>
<li><div class="western">
Considerando lo anterior, y si existieran
discos candidatos para la instalación de ASM, se debe cuidar que:</div>
</li>
<li><div class="western">
El dueño de la instalación de ASM debe ser
también dueño de los dispositivos (de los discos, como <i>/dev/sdb1</i>
por ejemplo).</div>
</li>
<li><div class="western">
Aunque es posible instalar ASM sobre
particiones hechas sobre un disco, lo recomendado por Oracle es usa
discos para conformar los grupos de discos de ASM.</div>
</li>
<li><div class="western">
Todos los dispositivos de un mismo grupo
deben tener la misma capacidad y el mismo desempeño.</div>
</li>
<li><div class="western">
¿Se puede usar LVM con ASM? Oracle
recomienda no hacer esto, pues ASM es en sí un manejador de
volúmenes.</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<h2 class="western" style="margin-bottom: 0.21cm; margin-top: 0.42cm; page-break-after: avoid;">
3.6 Configuración previa a la instalación de OASM</h2>
<div class="western">
Si se han revisado y cumplido los pasos descritos
en las secciones 3.1 a 3.5, se puede proceder a instalar OASM.</div>
<ul>
<li><div class="western">
Atendiendo lo recomendado, se agregan a la
máquina virtual 2 discos de tamaño fijo sobre el controlador SATA
existente. Cada disco tiene 8GB de espacio. El SO reconoce los
nuevos discos al ser iniciado.</div>
</li>
<li><div class="western">
Para verificar el estado de los discos, se
ejecuta el comando<i> /sbin/fdisk -l</i> como <i>root</i>. Los
discos no inicializados aparecerán sin una tabla de particiones
válida, nombrados como <i>/dev/sdb</i>, <i>dev/sdc</i>, etc.</div>
</li>
<li><div class="western">
Para cada disco disponible (/dev/sdb,
/dev/sdc, etc), se utiliza el siguiente comando para su
inicialización:</div>
<div class="comando-western">
$> /sbin/fdisk /dev/sdb</div>
<div class="western">
Las opciones del diálogo de consola que se
utilizan son:</div>
<div class="comando-western">
n (nuevo)</div>
<div class="comando-western">
p (primary partition)</div>
<div class="comando-western">
default (primer cilindro)</div>
<div class="comando-western">
default (último cilindro)</div>
<div class="comando-western">
w (fin de comando)</div>
<div class="western">
Hecho esto se habrán creado particiones
primarias no formateadas en cada disco. Por ejemplo, para el disco
<i>/dev/sdb</i> se creará la partición <i>/dev/sdb1</i>.</div>
</li>
<li><div class="western">
Para crear los discos para ASM se ejecutan
los comandos:</div>
<div class="comando-western">
/etc/init.d/oracleasm createdisk vol1
/dev/sdb1</div>
<div class="comando-western">
/etc/init.d/oracleasm createdisk vol2
/dev/sdc1</div>
<div class="comando-western">
etc... si se quisieran configurar más
discos, en este caso se inicializan y configuran 4 discos.</div>
<div class="western">
El resultado de la ejecución del comando es:</div>
<div class="comando-western">
[root@localhost dev]#
/etc/init.d/oracleasm createdisk vol1 /dev/sdb1
</div>
<div class="comando-western">
Marking disk "vol1" as an ASM
disk: [ OK ]
</div>
<div class="comando-western">
[root@localhost dev]#
/etc/init.d/oracleasm createdisk vol2 /dev/sdc1
</div>
<div class="comando-western">
Marking disk "vol2" as an ASM
disk: [ OK ]
</div>
<div class="comando-western">
[root@localhost dev]#
/etc/init.d/oracleasm createdisk vol3 /dev/sdd1
</div>
<div class="comando-western">
Marking disk "vol3" as an ASM
disk: [ OK ]
</div>
<div class="comando-western">
[root@localhost dev]#
/etc/init.d/oracleasm createdisk vol4 /dev/sde1
</div>
<div class="comando-western">
Marking disk "vol4" as an ASM
disk: [ OK ]</div>
</li>
<li><div class="western">
El siguiente paso es crear los directorios
para la base de datos y para la infraestructura grid. Debe
recordarse que se creó anteriormente una variable que concuerda
justamente con el directorio para la base de datos ($ORACLE_BASE) y
una variable que coincide con la ubicación del software instalado
de la infraestructura ($ORACLE_HOME).</div>
<div class="comando-western">
$> su</div>
<div class="comando-western">
$> mkdir -p /u01/app/oracle</div>
<div class="comando-western">
$> mkdir -p
/u01/app/oracle/product/11.2.0/grid</div>
<div class="comando-western">
$> chown -R oracle:oinstall /u01</div>
<div class="comando-western">
$> chmod -R 775 /u01</div>
</li>
<li><div class="western">
El software de instalación se lo debe copiar
en el disco duro, lo cual puede hacerse con el usuario <i>oracle</i>,
dado que ya se realizó el cambio recursivo de dueño y de permisos
sobre <i>/u01</i>:</div>
<div class="comando-western">
$> mkdir -p /u01/app/oracle/stage/grid</div>
<div class="comando-western">
$> mkdir -p
/u01/app/oracle/stage/database</div>
<div class="western">
En el directorio grid se copia el software de
instalación de la infraestructura, y en el directorio database el
software de instalación de la base de datos. Para descomprimir un
archivo zip se pude usar el comando <i>unzip</i>.</div>
</li>
<li><div class="western">
Antes de proseguir con la instalación y
considerando que se está utilizando una versión de 32 bits de
RedHat Enterprise (<i>uname -a</i>), se debe verificar que los
siguientes paquetes estén instalados en el SO:</div>
</li>
</ul>
<div class="western" style="margin-left: 1.25cm;">
kernel-headers-2.6.18-274.el5.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
kernel-devel-2.6.18-274.el5.i686.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
glibc-2.5-65.i386.rpm
(para la configuración de este manual debería estar ya instalado)</div>
<div class="western" style="margin-left: 1.25cm;">
glibc-headers-2.5-65.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
glibc-devel-2.5-65.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
gcc-4.1.2-51.el5.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
elfutils-libelf-devel-0.137-3.el5.i386.rpm
elfutils-libelf-devel-static-0.137-3.el5.i386.rpm *</div>
<div class="western" style="margin-left: 1.25cm;">
libstdc++-4.1.2-51.el5.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
libstdc++-devel-4.1.2-51.el5.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
gcc-c++-4.1.2-51.el5.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
libaio-0.3.106-5.i386.rpm
(para la configuración de este manual debería estar ya instalado)</div>
<div class="western" style="margin-left: 1.25cm;">
libaio-devel-0.3.106-5.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
sysstat-7.0.2-11.el5.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
unixODBC-2.2.11-7.1.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
unixODBC-devel-2.2.11-7.1.i386.rpm
</div>
<div class="western" style="margin-left: 1.25cm;">
ksh-20060214-1.1.i386.rpm</div>
<div class="western" style="margin-left: 1.25cm;">
<br />
<br /></div>
<div class="western" style="margin-left: 1.25cm;">
Muchos de los paquetes
no están disponibles en los repositorios de redhat, por lo que deben
ser descargados de otros repositorios para la versión Centos OS 5.
Son de gran ayuda los siguientes sitios:</div>
<div class="western" style="margin-left: 1.25cm;">
<a href="http://rpm.pbone.net/">http://rpm.pbone.net/</a></div>
<div class="western" style="margin-left: 1.25cm;">
<a href="http://www.rpmseek.com/">http://www.rpmseek.com</a></div>
<div class="western" style="margin-left: 1.25cm;">
(*) Los paquetes
elfutils-libelf-devel-0.137-3.el5.i386.rpm y
elfutils-libelf-devel-static-0.137-3.el5.i386.rpm son
interdependientes, por lo que deben ser instalados en un solo
comando:</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$> su</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$> rpm -Uvh
elfutils-libelf-devel-0.137-3.el5.i386.rpm
elfutils-libelf-devel-static-0.137-3.el5.i386.rpm
</div>
<ul>
<div class="western">
</div>
</ul>
<h2 class="western" style="margin-bottom: 0.21cm; margin-top: 0.42cm; page-break-after: avoid;">
3.7 Ejecución del instalador de la infraestructura</h2>
<ul>
<li><div class="western">
Habiendo cumplido lo indicado en los pasos
anteriores, se procede a ejecutar el instalador de la
infraestructura:</div>
<div class="comando-western">
$> cd /u01/app/oracle/stage/grid</div>
<div class="comando-western">
$> ./runInstaller</div>
</li>
<li><div class="western">
El asistente guía la instalación a lo largo
de 11 pasos, como se muestra en las capturas siguientes:</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
Se selecciona la instalación de un servidor
standalone:</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="482" name="gráficos1" src="proceso_v01_r02_html_html_222183c.png" width="643" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
Se seleccionan los idiomas para la
instalación:</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="482" name="gráficos2" src="proceso_v01_r02_html_html_m3ea68f60.png" width="643" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
Se crea un grupo de discos para datos, por
ello se conserva el nombre por defecto <i>DATA</i>. El nivel de
redundancia se establece en normal (sección 3.5) y se seleccionan
dos discos candidatos puesto que lo recomendado por Oracle para un
nivel de redundancia normal es usar al menos dos discos.</div>
</li>
<li><div class="western">
Si el asistente no encuentra discos
candidatos a pesar de haberlos creado y configurado con las
librerías del driver de oracle para ASM, se puede cambiar la ruta
de acceso de detección hacia el directorio <i>/dev/oracleasm/disks</i>,
en donde por defecto ASM incluye los dispositivos configurados.</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="482" name="gráficos3" src="proceso_v01_r02_html_html_67cabe3d.png" width="643" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
Se utiliza una misma contraseña para las
cuentas de administración de ASM: <i>Oracle11</i></div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="482" name="gráficos4" src="proceso_v01_r02_html_html_m385f9b81.png" width="643" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
Los grupos de usuarios ASM (internos de la
instancia) requieren vincularse con un grupo del sistema operativo
para autenticarse. Se utiliza el grupo <i>dba</i> creado
anteriormente. Si se presenta un mensaje de advertencia se acepta y
se prosigue.</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="482" name="gráficos5" src="proceso_v01_r02_html_html_m40790768.png" width="643" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
Dadas las consideraciones de OFA (Oracle
Flexible Architecture), se utilizan las ubicaciones para instalación
que el asistente plantea por defecto, las cuales concuerdan con las
variables de entorno configuradas en la sección 3.3.1. La ubicación
por defecto indicada para el inventario de instalación también se
puede mantener.</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="482" name="gráficos6" src="proceso_v01_r02_html_html_6e04729a.png" width="643" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
El resumen de la instalación que se va a
realizar agrega un dato de suma importancia: el espacio en disco. En
este punto se puede tomar cualquier correctivo si hiciera falta más
espacio en disco o si la cuota del usuario dueño de la instalación
no contempla suficiente espacio.</div>
<div class="western">
Tras accionar el botón <i>Terminar</i> se inicia
el proceso, mismo que puede durar entre 20 y 30 minutos dependiendo
de los recursos del equipo anfitrión. Durante la última etapa del
proceso, se solicitará la ejecución de dos scripts.</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="482" name="gráficos7" src="proceso_v01_r02_html_html_1ca8eda3.png" width="643" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
Los scripts pueden ejecutarse con los
comandos:</div>
</li>
</ul>
<div class="comando-western" style="margin-left: 1.25cm;">
$> su</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$>
/u01/app/oraInventory/orainstRoot.sh</div>
<div class="comando-western" style="margin-left: 1.25cm;">
$>
/u01/app/oracle/product/11.2.0/grid/root.sh</div>
<div class="western" style="margin-left: 1.25cm;">
El segundo script
solicitará que se ingrese la ruta hacia <i>/usr/local/bin</i>.</div>
<div class="western" style="margin-left: 1.25cm;">
Tras la ejecución de
los scripts se realizan los últimos pasos de la instalación de
forma automática.</div>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="361" name="gráficos8" src="proceso_v01_r02_html_html_m61aea569.png" width="475" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western" style="page-break-before: always;">
<br />
<br /></div>
<ul>
<li><div class="western">
Una vez finalizada la instalación se
presenta la pantalla de confirmación.</div>
</li>
</ul>
<div class="western">
<br />
<br /></div>
<div class="western">
<img align="LEFT" border="0" height="482" name="gráficos9" src="proceso_v01_r02_html_html_m1da28d08.png" width="643" /><br />
<br /></div>
<div class="western">
<br />
<br /></div>
<h1 class="western" style="page-break-after: avoid; page-break-before: always;">
4 </h1>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div class="western">
<br />
<br /></div>
<div id="sdfootnote1">
<div class="sdfootnote">
<a class="sdfootnotesym" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote1anc" name="sdfootnote1sym">1</a><b>umask:</b>
función o comando <b>POSIX</b> que permite establecer la “máscara
para el modo de creación de archivos” (file mode creation mask)
del proceso actual. <b>POSIX</b>: <b>P</b>ortable <b>o</b>perative
<b>s</b>ystem <b>i</b>nterface for Uni<b>x</b>, conjunto de
estándares de la IEEE que definen una API para shells y utilitarios
para sistemas basados en UNIX.</div>
</div>
<div id="sdfootnote2">
<div class="sdfootnote">
<a class="sdfootnotesym" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote2anc" name="sdfootnote2sym">2</a>http://www.dba-oracle.com/linux/umask_command_tips.htm</div>
</div>
<div id="sdfootnote3">
<div class="sdfootnote">
<a class="sdfootnotesym" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote3anc" name="sdfootnote3sym">3</a>ulimit
y umask son comandos preestablecidos del shell, por esta razón no
se usa su ubicación para ejecutarlos.</div>
</div>
<div id="sdfootnote4">
<div class="sdfootnote">
<a class="sdfootnotesym" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote4anc" name="sdfootnote4sym">4</a>Explicación
útil en:
http://www.cyberciti.biz/faq/understanding-etcpasswd-file-format/</div>
</div>
<div id="sdfootnote5">
<div class="sdfootnote">
<a class="sdfootnotesym" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote5anc" name="sdfootnote5sym">5</a>Interfaz
de red interna del servidor 127.0.0.1 (localhost)</div>
</div>
<div id="sdfootnote6">
<div class="sdfootnote">
<a class="sdfootnotesym" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote6anc" name="sdfootnote6sym">6</a>Para
conocer el nombre del servidor se puede usar el comando <i>hostname</i></div>
</div>
<div id="sdfootnote7">
<div class="sdfootnote">
<a class="sdfootnotesym" href="http://www.blogger.com/post-create.g?blogID=2215923822960902018#sdfootnote7anc" name="sdfootnote7sym">7</a>El
nivel de ejecución de un servicio determina su modo de
funcionamiento, el nivel 5 corresponde a la ejecución normal en
entorno gráfico. Más información se puede encontrar en este
<a href="http://en.wikipedia.org/wiki/Runlevel">enlace</a>.</div>
</div>
<div type="FOOTER">
<div align="RIGHT" style="margin-bottom: 0cm; margin-top: 0.5cm;">
<span style="font-size: x-small;"><i><b>Dustin
Ghia R.</b></i></span></div>
</div>Dustin Ghiahttp://www.blogger.com/profile/12889194226245084576noreply@blogger.com2tag:blogger.com,1999:blog-2215923822960902018.post-29079880643140720002011-08-06T23:32:00.000-07:002011-08-06T23:32:29.678-07:00Instalación de SQL Developer 3.0.04 sobre Ubuntu 10.04<ol>
<li>Para instalar SQL Developer, lo primero será verificar que estén instalados los paquetes debhelper y tofrodos. Esto se lo puede hacer muy fácil con el Gestor de Paquetes Synaptic. Si los paquetes no estuvieran instalados, se los agrega. También se debe tener un JDK, el cual tiene la versión 1.6.0.26 para la presente entrada.</li>
<li>Estando correctamente instalado el paquete tofrodos, se abre un terminal en el directorio /usr/bin y se crean dos enlaces simbólicos mediante los comandos:<br />
<span class="co0">sudo ln -s fromdos dos2unix</span><br />
<span class="co0">sudo ln -s todos unix2dos</span><span class="co0"> </span><br />
</li>
<li>Usando Synaptic o apt, se instala el paquete sqldeveloper-package.</li>
<li>Del sitio de Oracle, se descarga el archivo de instalación de SQL Developer para otras plataformas, el cual es un ZIP. A la fecha de creación de esta entrada el archivo disponible fue sqldeveloper-3.0.04.34-no-jre.zip . Dicho archivo debe ser puesto en un directorio para el cual se tengan permisos de escritura, por ejemplo ~/temporal.</li>
<li>Se crea un paquete en base al archivo de instalación descargado usando el comando:<br />make-sqldeveloper-package sqldeveloper-3.0.04.34-no-jre.zip
</li>
<li>Para ejecutar el paquete se debe verificar que tenga los permisos necesarios (si no los tuviera se los puede otorgar con sudo chmod u+wx sqldeveloper_3.0.04.34+0.2.3-1_all.deb). El comando de instalación es:<br /> <span class="kw2">sudo</span> <span class="kw2">dpkg</span> <span class="re5">--install</span> sqldeveloper_2.1.1.64.45+0.2.3-<span class="nu0">1</span>_all.deb</li>
<li>Terminada la instalación, el programa será accesible desde el menú principal bajo la opción "Programación". Se deberá proveer la ruta del JDK instalado, por ejemplo "/usr/lib/jvm/java-6-sun".</li>
<li>Generalmente, se lanzará una excepción en la primera instalación, debido a que no existe el directorio "/usr/share/sqldeveloper/sqldeveloper/extensions/oracle.datamodeler/log". Para resolver esto, se lo puede crear como root, y se establece el permiso de escritura para otros usuarios (chmod o+w log)</li>
</ol>
<br />
<br />
<br />
<br />
<br />
<br />Dustin Ghiahttp://www.blogger.com/profile/12889194226245084576noreply@blogger.com0tag:blogger.com,1999:blog-2215923822960902018.post-88210609395096430522011-04-04T09:59:00.001-07:002011-04-04T11:36:58.054-07:00JEE5 – 2) Configuración y primera aplicaciónEl presente artículo y los artículos relacionados (JEE) se basan en lo presentado en el libro Beginning Java EE5 (Editorial Apress), en los manuales y tutoriales de Sun/Oracle, y en problemas/soluciones propias.<br />
<br />
En esta entrada se realizarán las siguientes tareas:<br />
<ul>
<li>Instalar y configurar Tomcat para trabajar con Eclipse Galileo 3.5.2.</li>
<li>Instalar y configurar JBoss 5.1.0 GA.</li>
<li>Crear una aplicación básica, desplegarla en Tomcat y JBoss y revisar de manera general su estructura y funcionamiento.</li>
</ul>
<div class="titulo2">
Instalar y configurar Tomcat en Eclipse Galileo</div>
Antes de instalar y configurar de Apache Tomcat, se deben cumplir los siguientes puntos:<br />
<ul>
<li>Instalar Java Development Kit 1.5. La versión que se utiliza en este caso es jdk1.5.0_22, la cual se puede descargar del sitio web de Oracle (jdk-1_5_0_22-windows-i586-p.exe).</li>
<li>Configurar la variable JAVA_HOME y agregar el directorio bin de la misma al path del sistema.</li>
<li>Configurar la variable JRE_HOME, apuntando al JRE full contenido en la instalación de JDK.</li>
<li>Descargar e instalar (descomprimir) Eclipse Galileo 3.5.2.</li>
</ul>
<br />
Puesto que mi sistema es Windows 7 a 64 bits, y dado que he instalado JDK para 32 bits, para poder usar Apache Tomcat 6 con dicho JDK he requerido descargar la distribución binaria de Apache Tomcat para 32 bits: apache-tomcat-6.0.32-windows-x86.zip.<br />
<br />
Para instalar Tomcat 6.0.32 de 32 bits (distribución binaria), basta con descomprimirlo y seguir los pasos indicados en el archivo RUNNING.txt. Por defecto, Tomcat se levanta en el puerto 8080, y una vez iniciado debe ser posible validar su funcionamiento accediendo a http://localhost:8080.<br />
<br />
Para proseguir, vale verificar que Eclipse utilice el JRE adecuado, lo cual se consigue con el menú [Window > Preferences > Java > Installed JREs].<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikn-I8ZgimXXwjGMkOUHJVTOtPIPBMLAg7I5lOxld4JRNnso-ahrDZt5uj-SSaEyzhAXK-9f_lJHeZTRExwp232aSdDg7XUBNJulcjIlYm-3cprdpkDhKTNOVg3GHLwDfxs30n3bfRsxBB/s1600/01_JRE_Eclipse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikn-I8ZgimXXwjGMkOUHJVTOtPIPBMLAg7I5lOxld4JRNnso-ahrDZt5uj-SSaEyzhAXK-9f_lJHeZTRExwp232aSdDg7XUBNJulcjIlYm-3cprdpkDhKTNOVg3GHLwDfxs30n3bfRsxBB/s320/01_JRE_Eclipse.png" width="320" /></a></div>
<br />
<br />
Para configurar Tomcat en Eclipse, en la vista “Servers”, con el menú contextual para nuevo servidor se inicia el asistente. El nombre del servidor puede estar dado por el IP de la máquina.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZUN2RvxaakrHPGPksty4nb7IzcSKpRf_7gBRI6YN9jyH-z6q_7JWme8M0YUTMnbMWByPFwcrJsW_czEK8AOXoUlmyhy2MgL7lrPhRcclYph3EWdl6y9DG76ljVKPkRdSvy21030An8rgR/s1600/02_nuevo_servidor_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZUN2RvxaakrHPGPksty4nb7IzcSKpRf_7gBRI6YN9jyH-z6q_7JWme8M0YUTMnbMWByPFwcrJsW_czEK8AOXoUlmyhy2MgL7lrPhRcclYph3EWdl6y9DG76ljVKPkRdSvy21030An8rgR/s320/02_nuevo_servidor_1.png" width="320" /></a></div>
<br />
<br />
El <b>directorio de instalación de apache se denomina CATALINA_HOME</b>, y se utiliza el JRE por defecto del entorno.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaGHuUfVa3vpIJ-kvxsS2XSr1F0ueVDT0qa7lk7APxZqQON0nc6alq5-qWvXYNOLbm2uxrsxNWL1srzXITQcE3P52Is7a24mHyJl9hIfisSpgmrIz_xZ-sNI4-K2H2Oya-KTJvsoCX0jUp/s1600/03_nuevo_servidor_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaGHuUfVa3vpIJ-kvxsS2XSr1F0ueVDT0qa7lk7APxZqQON0nc6alq5-qWvXYNOLbm2uxrsxNWL1srzXITQcE3P52Is7a24mHyJl9hIfisSpgmrIz_xZ-sNI4-K2H2Oya-KTJvsoCX0jUp/s320/03_nuevo_servidor_2.png" width="320" /></a></div>
<br />
<br />
Dado que no existen proyectos creados, se pasa esta parte del asistente sin realizar acciones, y se lo finaliza.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw-AC3JbmIui2gbm-oJ_TL2zG9kTHmM7excTf7q1Gfs73-c4uFX-TZ7fm0-RK_t1xu7x5fazEv7BzM4GlfyvFgtKkdvJjUn0IrHQU5UGRaNNyk89r1C5vO2POumTJDzZGHcaxE6GdzE8Fv/s1600/04_nuevo_servidor_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw-AC3JbmIui2gbm-oJ_TL2zG9kTHmM7excTf7q1Gfs73-c4uFX-TZ7fm0-RK_t1xu7x5fazEv7BzM4GlfyvFgtKkdvJjUn0IrHQU5UGRaNNyk89r1C5vO2POumTJDzZGHcaxE6GdzE8Fv/s320/04_nuevo_servidor_3.png" width="320" /></a></div>
<br />
<br />
Terminado el asistente, se crea un proyecto nuevo llamado “Servers”, el cual debe permanecer abierto para poder agregar proyectos al servidor Tomcat, así como para levantarlo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2_EZnoOG8cJzfvFPDHIyvCUvK3LNosieDlsr4ZI59Mn445NT_H-ptCUkwHrwulb_fEPAs4VqeIHCJC-kCNf3xqS56CTs91RWhbbSRY7Vm0RqBGjlQ-QEFVLi8RcNP_STArMG0KGn3u_lQ/s1600/05_nuevo_servidor_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2_EZnoOG8cJzfvFPDHIyvCUvK3LNosieDlsr4ZI59Mn445NT_H-ptCUkwHrwulb_fEPAs4VqeIHCJC-kCNf3xqS56CTs91RWhbbSRY7Vm0RqBGjlQ-QEFVLi8RcNP_STArMG0KGn3u_lQ/s320/05_nuevo_servidor_4.png" width="319" /></a></div>
<br />
<div class="titulo2">
Instalar JBoss</div>
Dado que Tomcat es un Contenedor Web (Servlet/JSP) no es apropiado para desplegar EJBs; este trabajo es apropiado para un servidor de aplicaciones como JBoss. La versión que utilizo para este conjunto de entradas es JBoss 5.1.0 GA.<br />
<br />
Para instalar y ejecutar JBoss, basta con descargar el comprimido del sitio de JBoss (jboss-5.1.0.GA.zip), y descomprimir el contenido a un directorio con permisos suficientes (En Windows suele ser conveniente hacerlo en una ruta como c:\java\jboss), dicho directorio puede ser llamado<b> JBOSS_HOME</b>.<br />
<br />
<div class="titulo2">
Proyecto básico</div>
Eclipse IDE cuenta con un sinnúmero de asistentes y poderosas herramientas para crear proyectos web y proyectos JEE; sin embargo, a fin conocer de mejor manera aquello que se está construyendo, se detalla a continuación la elaboración de un proyecto JEE básico, paso a paso y sin asistencia del IDE. El ejemplo original puede ser descargado del sitio web del libro “Beginning Java EE5”.<br />
<br />
<div class="titulo3">
Construyendo un proyecto JEE básico</div>
En primer lugar, se debe crear un directorio de trabajo, el cual por conveniencia podría estar ubicado dentro del workspace que se vaya a utilizar para Eclipse. Dentro del directorio (JEE501) se agrega una página JSP index.jsp con el siguiente código:<br />
<br />
<div class="codigoFuente">
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><html></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <head></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <title></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> Prueba
de la instalacion</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> </title></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> </head></span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <body></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <%
for(int i = 0; i < 3; i++) { %></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <h<%=i
+ 1%>> Hola Mundo!!! </h<%=i + 1%>></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <%}%></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> </body></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"></html></span></span></div>
<br /></div>
<br />
La página index.jsp será el componente web de la aplicación, para validar su funcionamiento, se la empaqueta en un componente redistribuible de despliegue: holaApp.war<br />
<br />
Estando en el directorio de trabajo creado anteriormente (JEE501), usando la consola se ejecuta el siguiente comando:<br />
<br />
<div class="codigoComandos">
jar -cvf holaApp.war index.jsp</div>
<br />
En donde:<br />
<b>-c:</b> para crear un nuevo contenedor<br />
<b>-f:</b> para que se deba ingresar un nombre para el contenedor<br />
<b>-v:</b> para una salida completa de mensajes en consola<br />
<br />
El detalle de las opciones del comando se lo puede obtener ejecutándolo sin argumentos. El resultado es un nuevo archivo war, el cual debe ser copiado al directorio CATALINA_HOME\webapps. Hecho esto, se levanta el servidor Apache Tomcat y se accede a la dirección: http://localhost:8080/holaApp/index.jsp, el resultado debe ser:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvst2nwC5JYQgGBO5VzR2GP5WM6hJEqDSkkaxY6a6sX55ysIz5-pM9W7ek6moQxNtBpNSX2TsgCW1_lSN4KoAZV3v-RPawa8W8_fyEluXpTL2CUnrxGQe7al1qWg2yft7ktfL3nHo2eW9R/s1600/06_JEE501_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvst2nwC5JYQgGBO5VzR2GP5WM6hJEqDSkkaxY6a6sX55ysIz5-pM9W7ek6moQxNtBpNSX2TsgCW1_lSN4KoAZV3v-RPawa8W8_fyEluXpTL2CUnrxGQe7al1qWg2yft7ktfL3nHo2eW9R/s320/06_JEE501_01.png" width="320" /></a></div>
<br />
<div class="pieImagen">
Verificación de la instalación de Tomcat y de la creación del primer war</div>
<br />
Normalmente un proyecto web tiene más que un archivo trivial, pero la estructura general de un proyecto web se revisará posteriormente, por el momento se ha podido constatar que Tomcat (Servlet/JSP) container ha funcionado perfectamente.<br />
<br />
El siguiente paso será empaquetar el war creado (los componentes web) dentro de un ear. Un ear puede contener archivos war, jar, descriptores (archivos xml), etc., todos en el contexto de una misma aplicación empresarial.<br />
<br />
Dentro del directorio JEE501, se crea el directorio META-INF, y dentro del mismo, se incluye el archivo application.xml, el cual es el descriptor de despliegue de la aplicación:<br />
<br />
<div class="codigoFuente">
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><?xml
version=“1.0” ?></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><application></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <display-name>Hola
JEE</display-name></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> </span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <module></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <web></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <web-uri>holaApp.war</web-uri></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> <context-root>/hola</context-root></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> </web></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"> </module></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"></application></span></span></div>
<br /></div>
<br />
Para construir el ear, de manera análoga a lo que se hizo con el war, estando en el directorio JEE501 se ejecuta el comando:<br />
<br />
<div class="codigoComandos">
jar -cvf holaAppEar.ear holaApp.war META-INF
</div>
<br />
Para probar el funcionamiento del ear, se lo debe desplegar en el servidor de aplicaciones que se instaló, para hacer esto hay que situarse en JBOSS_HOME\server, allí se encuentran las instancias (configuraciones) que provee el servidor predeterminadamente. Para crear una propia instancia y mantener las existentes sin modificaciones, se puede copiar cualquiera de ellas y renombrar la copia; en este caso, se utiliza como plantilla la instancia default y se crea la instancia “mijee5”.<br />
<br />
En el directorio JBOSS_HOME\server\mijee5\conf\bindingservice.beans\META-INF, se encuentra el archivo de configuración bindings-jboss-beans.xml, en el cual se cambia el parámetro que define el conjunto de bindings para uso de la instancia, para que quede de esta forma la configuración:<br />
<br />
<div class="codigoComandos">
<div style="margin-bottom: 0cm;">
<parameter>${jboss.service.binding.set:ports-01}</parameter></div>
</div>
<br />
Esto resulta útil, puesto que el servidor Tomcat que se configuró utiliza el puerto 8080, y con el cambio indicado en el parámetro, la instancia de mijee5 lo hará en el puerto 8180. Esta configuración también resulta útil para poder levantar distintas instancias de JBoss en una misma máquina al mismo tiempo.<br />
<br />
En el directorio deploy de mijee5, se coloca el empaquetado holaAppEar.ear, y estando situado en JBOSS_HOME\bin, se utiliza el siguiente comando para levantar el servidor:<br />
<br />
<div class="codigoComandos">
run.bat -c mijee5 -b 0.0.0.0
</div>
<br />
<b>-c:</b> para indicar cual instancia se va a levantar<br />
<b>-b:</b> para indicar en qué interfaces de red se va a levantar la instancia, 0.0.0.0 es para todas las interfaces<br />
<br />
Habiendo seguido los pasos anteriores, el resultado sería:
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrNU8F1Ivzr-MzMAuHyiMlS6MovrCFONAsyYko186GGnrvCV-Ff3W1hh22uJpuENM9Ek7yC91TgcRUW3_JEHhvLz7XN35dv3iNfHFKo3krnFO962uDmZ4hYiUZEnoq_ieiPWPPxQ30IORT/s1600/07_jboss_levantado.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="63" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrNU8F1Ivzr-MzMAuHyiMlS6MovrCFONAsyYko186GGnrvCV-Ff3W1hh22uJpuENM9Ek7yC91TgcRUW3_JEHhvLz7XN35dv3iNfHFKo3krnFO962uDmZ4hYiUZEnoq_ieiPWPPxQ30IORT/s320/07_jboss_levantado.png" width="320" /></a></div>
<br />
<div class="pieImagen">
Consola indicando que la instancia mijee5 se ha levantado correctamente</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgECndz_JEjnLwK51jC0knAfMgXPDvDI3FJr0XTw95ib0dD9UrGuClSJSuziWqIOypVCs-oCtso1wySptrO5AIni0IzJFqZVfB3Gy_jbyjgZvxewFkw62DDPUoa9LADooWG5hX4fTyI4ACs/s1600/08_jboss_home.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgECndz_JEjnLwK51jC0knAfMgXPDvDI3FJr0XTw95ib0dD9UrGuClSJSuziWqIOypVCs-oCtso1wySptrO5AIni0IzJFqZVfB3Gy_jbyjgZvxewFkw62DDPUoa9LADooWG5hX4fTyI4ACs/s320/08_jboss_home.png" width="320" /></a></div>
<br />
<div class="pieImagen">
Página de inicio para la administración de JBoss</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGFQbPr7q5BTvzaXIGJvswns1_6b2VJEZVqJY54sfGPVb90uInWVT_OFjFhup81LNuawDXFr4RtFF5E_Dt8lpyS4MuXN_GaxyjqqNqrTyu8NKoV1utNPkQNDO_7U6TahKuQjPkKtBMQsxU/s1600/09_jmx_console.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGFQbPr7q5BTvzaXIGJvswns1_6b2VJEZVqJY54sfGPVb90uInWVT_OFjFhup81LNuawDXFr4RtFF5E_Dt8lpyS4MuXN_GaxyjqqNqrTyu8NKoV1utNPkQNDO_7U6TahKuQjPkKtBMQsxU/s320/09_jmx_console.png" width="320" /></a></div>
<br />
<div class="pieImagen">
La Consola JMX muestra que se han desplegado el ear y su módulo war</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJnujDLmptxhxqFgfnb5liyQh316ZRQWXW-hJW6myue-YV7ZBGpM5ZeUmK8ocDpFj1jyNas-oO7JpKLrcZr7-TphUGAb01v7eO8QXcGXtzyLsuscaDG_d2RW3hoX1ksyL9z9GbGYgS9Rfc/s1600/10_aplicacion_levantada.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJnujDLmptxhxqFgfnb5liyQh316ZRQWXW-hJW6myue-YV7ZBGpM5ZeUmK8ocDpFj1jyNas-oO7JpKLrcZr7-TphUGAb01v7eO8QXcGXtzyLsuscaDG_d2RW3hoX1ksyL9z9GbGYgS9Rfc/s320/10_aplicacion_levantada.png" width="320" /></a></div>
<br />
<div class="pieImagen">
La aplicación levantada, nótese que el URL es el contexto raíz indicado en el descriptor application.xml</div>
<div class="titulo3">
¿Cómo funciona?</div>
La última pantalla muestra una página web con tres títulos que dicen “Hola Mundo!!!”, si se muestra el código fuente de la página, lo que tenemos es bastante simple:<br />
<br />
<div class="codigoFuente">
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><html></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><head></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><title></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;">Prueba
de la instalacion</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"></title></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"></head></span></span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><body></span></span></div>
<div style="margin-bottom: 0cm;">
</div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><h1>
Hola Mundo!!! </h1></span></span></div>
<div style="margin-bottom: 0cm;">
</div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><h2>
Hola Mundo!!! </h2></span></span></div>
<div style="margin-bottom: 0cm;">
<a href="http://www.blogger.com/post-edit.g?blogID=2215923822960902018&postID=8821060939509643052" name="line13"></a>
</div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"><h3>
Hola Mundo!!! </h3></span></span></div>
<div style="margin-bottom: 0cm;">
</div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"></body></span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;"></html></span></span></div>
</div>
<br />
La cuestión es, ¿Cómo se transformó el código JSP en el HTML mostrado? Como se mencionó en la primera entrada, “JSP es un lenguaje de plantillas para escribir Servlets”; de hecho, cuando el servidor JBoss recibe una petición de lo que se encuentra en el contexto raíz de su módulo web (<web-uri>holaApp.war</web-uri>, <context-root>/hola</context-root>), utiliza sus contendores web, jsp y servlet para generar el código fuente del servlet para la página index.jsp, para compilarlo, cargarlo e instanciarlo, y finalmente es el servlet el encargado
de retornar al cliente un flujo (OutputStream) que contiene el HTML que se despliega (el detalle de este punto será retomado en la siguiente entrada).<br />
<br />
Como se vio, el war generado pudo desplegarse en Tomcat y podría desplegarse en JBoss de la misma manera; sin embargo, al empaquetarlo en un ear, se posibilita que coexista con lógica que no necesariamente debe residir en “la capa web”, es decir, dentro del war, pero que es parte de la lógica de toda una aplicación.<br />
<br />
La estrucutra de archivos del ejemplo es súmamente simple, pues un proyecto real puede ser bastante complejo, no obstante, se cumple un propósito clave con dicha estructura: indicar que en un empaquetado de despliegue existen componentes y archivos de soporte (descriptores, manifiestos, propiedades). En este caso, el empaquetado holaApp.war incluye un componente jsp y un archivo de soporte agregado durante la creación del empaquetado, se trata de un archivo de manifesto, el cual viene a ser como un directorio de contenidos para el empaquetado. Por su parte el ear tiene un módulo web (holaApp.war) y cumpliendo el estándar, dentro de un directorio META-INF tiene el descriptor de despliegue de la aplicación (application.xml), el cual es utilizado por el servidor para saber cómo acceder a los componentes del ear.<br />
<br />
<div class="titulo2">
Sinópsis y siguientes temas</div>
En el presente documento se ha revisado la instalación y configuración de Apache Tomcat y de JBoss, de manera que ambos servidores puedan trabajar a la vez en una misma máquina. También se ha construido una aplicación JEE elemental, pero útil para explicar lo más relevante sobre su proceso de empaquetamiento y despliegue. Más adelante se revisarán los tópicos más importantes de JSP, con lo cual se conseguirá un sustento sólido para abordar JSF.Dustin Ghiahttp://www.blogger.com/profile/12889194226245084576noreply@blogger.com0tag:blogger.com,1999:blog-2215923822960902018.post-37236718405038554262011-03-31T09:51:00.000-07:002011-04-04T10:01:57.271-07:00JEE5 - 1) FundamentosEl presente artículo y los artículos relacionados (JEE) se basan en lo presentado en el libro Beginning Java EE5 (Editorial Apress), en los manuales y tutoriales de Sun/Oracle, y en problemas/soluciones propias.<br />
<br />
La importancia de estudiar JEE, se encuentra desde mi punto de vista, en la gran cantidad de sistemas e infraestructuras actualmente implementadas, que requieren mantenimiento evolutivo y correctivo, y por supuesto, en la necesidad aún vigente de implementar nuevos sistemas usando JEE5.<br />
<br />
JEE está enfocado en la creación de aplicaciones empresariales , las cuales se caracterizan por: <br />
<ul>
<li><b>Resolver problemas empresariales</b>, lo cual supone almacenamiento seguro, concurrencia, seguridad, escalabilidad, almacenamiento y procesamiento distrubuidos... “robustez en el plano de la complejidad” </li>
<li><b>Estar construidas sobre una infraestructura base: los servidores de aplicaciones</b>. Haciendo una analogía con las obras civiles, cuando se construye un edificio no se fabrican ladrillos y vigas de acero, se utiliza las que provee algún fabricante y se usan elementos estrucuturales prefabricados en base a patrones adecuados, que permiten construir y a su vez conectar el nuevo edificio a infraestructuras que proveen servicios básicos. En el contexto del software, los servidores de aplicaciones proveen esos elementos e infraestructura base mediante contenedores, servicios y otros componentes, así como las facilidades de interacción respectivas. </li>
</ul>
<br />
Considerando lo anterior, se puede definir a JEE como: <br />
<ul>
<li>Un conjunto de especificaciones para APIs. </li>
<li>Una arquitectura distrubuida y multicapa. </li>
<li>Definiciones para empaquetar componentes redistruibuibles para despliegue. </li>
<li>Un conjunto de componentes, contenedores y servicios estandarizados, para crear y desplegar aplicaciones distribuidas en la arquitectura mencionada. </li>
</ul>
<br />
“<b>La plataforma JEE define el estándar para desarrollar aplicaciones empresariales distribuidas basadas en componentes</b>” (Sun Microsystems), y está fundada sobre J2SE. Así como J2SE cuenta con AWT/Swing para la construcción de sus interfaces gráficas de usuario, JEE provee un framework web basado en componentes para alcanzar el mismo fin: JavaServer Faces (JSF). <br />
<div class="titulo2">
Arquitecturas multicapa</div>
En general una aplicación puede estar constituida por 3 capas lógicas:<br />
<ul>
<li>Capa de presentación</li>
<li>Capa de reglas del negocio o capa media</li>
<li>Capa de acceso a datos</li>
</ul>
<div class="titulo3">
Sistemas de una capa</div>
<ul>
<li>Presentación, negocio y acceso a datos se encuentran en una sola capa computacional.</li>
<li>No soportan múltiples usuarios.</li>
</ul>
<div class="titulo3">
Sistemas cliente-servidor (dos capas)</div>
<ul>
<li>Presentación y las reglas del negocio se encuentran en el cliente (DLLs, clases), el cual constituye la aplicación. </li>
<li>El manejo de datos lo realiza generalmente un servidor de bases de datos, que puede a su vez implementar cierta lógica (PL/SQL, Transact SQL, etc.) </li>
<li>El principal problema de esta arquitectura la actualización y gestión de cambios (distribuir una DLL, o cualquier otro componente, entre los n clientes para implementar 1 cambio o mejor). </li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwFtWm9leJPE4wf0_Fmc7RyIgZuj09RhRHxur2GlYYs1KBveyf3DhOKWdPlhcvf-BBWxF2e4FWf2FMIElR9WgOvsv9njVMip1OcSrYP7tfAESs2VtHxm9sZ8zeyKxi04gCvywBclZvchDw/s1600/1_arquitectura_dos_capas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwFtWm9leJPE4wf0_Fmc7RyIgZuj09RhRHxur2GlYYs1KBveyf3DhOKWdPlhcvf-BBWxF2e4FWf2FMIElR9WgOvsv9njVMip1OcSrYP7tfAESs2VtHxm9sZ8zeyKxi04gCvywBclZvchDw/s320/1_arquitectura_dos_capas.png" width="274" /></a></div>
<br />
<div class="pieImagen">
Arquitectura convencional de dos capas, cliente-servidor (cliente pesado)</div>
<div class="titulo3">
Arquitectura n capas</div>
<ul>
<li>Se agrega una capa para implementar lo más crucial de la lógica del sistema, esta capa podría ser implementada en un servidor con gran capacidad de cómputo, mientras que la capa de presentación puede ser ligera, de forma que pueda ser ejecutada en un navegador.</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5IeL8i9EcsGSuhmQU04BKYTK5zP3QmZ7umkfG9OIRZ5zR1aNmAkQOCx6XFkrFKf6d6SvnNc-wXCP4E_Q1fLH395A4zweof1lEk5KxwkCf4nsbXPr1ouykjTODQR00LZkgkr_6AXsjVkH0/s1600/2_arquitectura_n_capas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5IeL8i9EcsGSuhmQU04BKYTK5zP3QmZ7umkfG9OIRZ5zR1aNmAkQOCx6XFkrFKf6d6SvnNc-wXCP4E_Q1fLH395A4zweof1lEk5KxwkCf4nsbXPr1ouykjTODQR00LZkgkr_6AXsjVkH0/s1600/2_arquitectura_n_capas.png" /></a></div>
<br />
<div class="pieImagen">
Arquitectura base de tres capas</div>
<ul>
<li>Se agrega una capa para implementar lo más crucial de la lógica del sistema, esta capa podría ser implementada en un servidor con gran capacidad de cómputo, mientras que la capa de presentación puede ser ligera, de forma que pueda ser ejecutada en un navegador.</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2q7hM-Bl0oWdtKxRCIjWKo28vwirMKt1RERc8bvx5wiDI9eGEoAl79CX39G3ZqzfV4JjqdUNtUFcBCebv2wmlA9yNW_lnbiy2OO_Hyy8zAg9JcSTHqkTG0LpTilhJme0k9U7TeI6fUuQr/s1600/3_ejemplo_arquitectura_jee.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2q7hM-Bl0oWdtKxRCIjWKo28vwirMKt1RERc8bvx5wiDI9eGEoAl79CX39G3ZqzfV4JjqdUNtUFcBCebv2wmlA9yNW_lnbiy2OO_Hyy8zAg9JcSTHqkTG0LpTilhJme0k9U7TeI6fUuQr/s320/3_ejemplo_arquitectura_jee.png" width="184" /></a></div>
<br />
<div class="pieImagen">
Ejemplo de arquitectura de n capas</div>
<div class="titulo4">
Problemas que atiende la arquitectura de n capas</div>
Una arquitectura de n capas atiende 6 puntos clave:<br />
<ul>
<li><b>Mantenibilidad:</b> Se adapta a los cambios del negocio.</li>
<li><b>Consistencia:</b> La lógica del negocio se implementa y se distribuye, lo cual previene implementaciones parciales inconsistentes entre múltiples aplicaciones.</li>
<li><b>Interoperabilidad:</b> La arquitectura permite compartir/invocar servicios y datos entre aplicaciones.</li>
<li><b>Flexibilidad:</b> La arquitectura no restringe la implementación de la presentación, la cual puede realizarse mediante GUIs, interfaces web, u otros tipos de interfaces.</li>
<li><b>Escalabilidad:</b> Mediante la aplicación de la arquitectura y los patrones apropiados, una aplicación puede soportar una mayor carga de usuarios mediante cambios/ajustes en la infraestructura que la soporta.</li>
<li><b>Seguridad:</b> Se pueden agregar mecanismos que mejoren la seguridad de las aplicaciones.</li>
</ul>
<br />
JEE se basa en los puntos explicados para una arquitectura de n capas, por ende <b>los servidores de aplicaciones</b> que implementan las especificación <b>JEE</b>, <b>brindan la infraestructura y facilidades necesarias para construir robustas aplicaciones de n capas</b>.<br />
<br />
<b>JEE procura independencia con el vendedor</b>-proveedor de la infraestructura (servidor de aplicaciones), pero como especificación, <b>no se ocupa ni del desempeño ni de la disponibilidad</b> de las aplicaciones.<br />
<div class="titulo2">
Características y conceptos de JEE</div>
<div class="titulo3">
Clientes y servidores</div>
Un cliente JEE puede ser implementado de diferentes maneras:<br />
<ul>
<li><b>Clientes ligeros (thin)</b>, generalmente basados en web, que se ejecutan en un navegador, y bien pueden ser puro código HTML, o estar enriquecidos con JavaScript, o incluso ser applets.</li>
<li><b>Clientes pesados (fat)</b>, implementados mediante aplicaciones de consola, o GUIs con AWT/Swing. Este tipo de cliente está soportado por código Java que se ejecuta fuera del servidor.</li>
</ul>
<br />
Por otra parte, el servidor está conformado por dos tipos de componentes:<br />
<ul>
<li><b>Componentes web</b> (soportados por un contenedor web), que incluyen: JSPs y Servlets.</li>
<li><b>Componentes de negocio</b> (soportados por un contenedor EJB), que son evidentemente componentes EJB.</li>
</ul>
<div class="titulo3">
Contenedores</div>
<b>Proveen un ambiente para los componentes</b> descritos, así como las<b> interfaces para que los componentes puedan acceder a la infraestructura del servidor</b> (red, seguridad, manejo de transacciones, nombres, localización de recursos). <b>JEE provee contenedores para Servlets, JSPs y EJBs</b>.<br />
<div class="titulo3">
Servlets.</div>
<ul>
<li>Un servlet es un componente Java que implementa la interfaz <b>javax.servlet.Servlet</b>.</li>
<li>Aunque el modelo de Servlet es genérico, en JEE casi siempre se utilizan <b>HTTPServlets</b>.</li>
<li>Un servlet es invocado por una petición HTTP del cliente, que viene en forma de una consulta HTTP. El servidor web toma la petición y notifica al Contenedor Servlet, el cual carga el servlet e invoca el método apropiado de la interfaz javax.servlet.Servlet, la respuesta (un flujo) es devuelta por el servidor web al cliente.</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAter9daA0hfPizJriF_gQ3sLBXOHhjbSrgKqjRJyI0T5Kik0rH8ItdbEL6dTnBuJT51R-QixtBwutPG6K4y1mdkKR0N0k_9EdQ3WLB5rDT-ZLM6ssK99c7H5BHlpdX3u8FeB16zR2v33v/s1600/4_esquema_basico_servlet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAter9daA0hfPizJriF_gQ3sLBXOHhjbSrgKqjRJyI0T5Kik0rH8ItdbEL6dTnBuJT51R-QixtBwutPG6K4y1mdkKR0N0k_9EdQ3WLB5rDT-ZLM6ssK99c7H5BHlpdX3u8FeB16zR2v33v/s320/4_esquema_basico_servlet.png" width="320" /></a></div>
<br />
<div class="pieImagen">
Esquema básico de funcionamiento de un servlet</div>
<div class="titulo3">
JSP</div>
JSP es una <b>tecnologia Java creada para generar dinámicamente contenido HTML, XML, o de otros tipos</b> (tal como lo hace un servlet). De hecho, ¡<b>JSP es un lenguaje de plantillas que permite generar un Servlet</b>!<br />
<br />
En primera instancia, una página JSP es un documento basado en HTML que puede incluir bloques de código Java, llamados scriptlets, que son introducidos mediante una sintaxis particular (<% código java %>), o pueden incluir etiquetas definidas en librerías de etiquetas (Tag Libraries) que son utilizadas para realizar acciones, tal como si se incluyera código Java; dichas etiquetas pueden ser personalizadas (tema que se revisará posteriormente). El propósito de las páginas JSP, podría decirse, es facilitar la construcción de las interfaces web de las aplicaciones a trabajadores que no necesariamente deben conocer los pormenores del lenguaje de programación Java, y que mas bien deben concentrarse en los detalles de la presentación (en vez de escribir servlets).<br />
<br />
Cuando el servidor web recibe por primera vez una petición de una página JSP, se comunica con el contenedor JSP, el cual traduce la página JSP a código Java y lo compila en un servlet, el cual es cargado por el contenedor de servlets en la JVM del servidor en donde es instanciado recibiendo los parámetros del request del cliente. El servlet realiza los procesamientos necesarios y responde al servidor web, el cual canaliza dicha respuesta al cliente. Para las peticiones subsiguientes de la misma página JSP, siempre que ésta no haya sufrido cambios, el servidor web se refiere directamente al contenedor de servlets.
<br />
<br />
Debe acotarse en este punto que <b>JEE enfatiza el uso de JSF</b>, y que aunque para las especificaciones 1.1 y 1.2 de JSF el lenguaje de declaración de vista por defecto era JSP (basado en html), en <b>JSF 2.0 el lenguaje de declaración de vista por defecto es Facelets</b> (Sistema de plantillas web creado por Apache).<br />
<div class="titulo3">
JSF</div>
JSF es un <b>framework web basado en componentes, que implementa el modelo MVC</b>. Los componentes JSF facilitan la construcción de ricas interfaces web del lado del servidor, se conectan a fuentes de datos y beans, y conectan transparentemente eventos de cliente con manejadores en el servidor.<br />
Cuando se usa JSF, toma un rol protagónico el servlet llamado <b>FacesServlet</b>, el cual se encarga de: procesar peticiones dirigidas a “vistas JSF”, cargar la plantilla apropiada para la vista requerida, construir un árbol de componentes para esa vista, procesar eventos y retornar la respuesta al cliente (por defecto HTML).<br />
<div class="titulo3">
JDBC</div>
Java DataBase Connectivity, es una API capaz de <b>acceder a cualquier fuente tabular de datos</b>, como por ejemplo, bases de datos relacionales. Para acceder transparentemente a las diferentes fuentes de datos que pueden haber, JDBC requiere de librerías específicas para cada sistema (drivers).<br />
<div class="titulo3">
EJBs</div>
Los EJBs son los componentes de negocio de una aplicación JEE. Como se mencionó, las aplicaciones empresariales son distribuidas, lo cual implica comunicaciones y servicios que pueden ser invocados de manera local y remota, lo cual en Java se puede conseguir con RMI (Remote method invocation).<br />
<br />
El uso de RMI involucra 3 pasos:<br />
<ul>
<li>Declarar una interfaz que extiende a javax.rmi.Remote</li>
<li>Implementar dicha interfaz con una clase que extienda a javax.rmi.server.UnicastRemoteObject</li>
<li>Instanciar la clase y registrarla mediante RMI Registry (un servicio de búsqueda simple)</li>
</ul>
Sin embargo, RMI tiene limitaciones en el contexto de las aplicaciones empresariales, lo cual da paso a los EJBs. RMI provee un framework base para comunicaciones que es utilizado por los <b>contenedores EJB</b>, los cuales <b>mantienen separados a los EJBs de la capa de presentación, convirtiéndolos en un conjuto de servicios disponibles para una o más aplicaciones</b>.<br />
<br />
Un contenedor EJB realiza las siguientes tareas:<br />
<ul>
<li>Cargar un EJB cuando es requerido.</li>
<li>Invoca al método apropiado según lo requerido.</li>
<li>Aplica reglas de seguridad.</li>
<li>Maneja la transaccionalidad de las operaciones.</li>
</ul>
Para desplegar un EJB en un contenedor EJB, se deben realizar pasos similares a los indicados para RMI:<br />
<ul>
<li>Crear una interfaz local, o una interfaz remota, o ambas.</li>
<li>Implementar dichas interfaces mediante una clase (el EJB).</li>
<li>Desplegar el EJB en el contenedor.</li>
</ul>
<div class="titulo4">
Tipos de EJBs</div>
<div class="titulo5">
Session Beans</div>
Su propósito es proveer servicios de negocio (como retornar un conjunto de datos, o ejecutar un proceso), y a su vez se clasifican en Stateless Session Beans y Stateful Session Beans. Los session beans existen mientras dura la conversación o la sesión entre el cliente que hace la petición y el contenedor EJB. Los stateless session beans no guardan su estado, mientras que los stateful session beans lo pueden hacer en el ir y venir de requests/responses hasta que explícitamente se los descarte.<br />
<div class="titulo5">
Entity beans</div>
Su función es representar los objetos del negocio (entidades), los cuales pueden ser persistidos y recuperados del repositorio de datos mediante dos estrategias: delegando el control total al contenedor EJB (<b>CMP – container managed persistence</b>), o haciéndo “manualmente” (<b>BMP – bean managed persistence</b>).<br />
<div class="titulo5">
Message-driven beans</div>
Son especialmente útiles para atender procesos asíncronos. Los Message-driven beans (<b>MDBs</b>) proveen un modelo distinto del tradicional cliente-servidor, que consiste en servicios que escuchan a un Servicio de Mensajes (Message Service). Los <b>servicios que escuchan (MDBs) son suscriptores de una cola</b>, que es en donde se publican los mensajes respectivos.<br />
<div class="titulo3">
Soporte XML en JEE</div>
JEE provee un conjunto de APIs para trabajar con XML:<br />
<ul>
<li><b>Java API for XML Processing (JAXP)</b>: provee funcionalidad para generar y procesar (parse) XML con <b>DOM (Documment Object Model)</b> y <b>SAX (Simple API por XML)</b>.</li>
<li><b>Java API for XML Binding (JAXB)</b>: provee soporte para mapear XML desde y hacia clases Java.</li>
<li><b>Java API for XML Registries (JAXR)</b>: permite acceder a registros basados en XML, como <b>UDDI (Universal Description, Discovery and Integration)</b>.</li>
<li><b>Java API for XML Messaging (JAXM)</b>: habilita comunicación vía XML y <b>SOAP</b> (<b>Simple Object Access Protocol</b>, para transmitir información entre web services).</li>
<li><b>Java API for XML-based Remote Procedure Calls (JAX-RPC)</b>: API avanzada para invocar procedimientos remotos.</li>
</ul>
<div class="titulo3">
Web Services</div>
Un web service es “<b>software para soportar la interacción máquina-máquina sobre una red. Su interfaz se describe con WSDL (Web Service Description Language) y se comunica con su cliente mediante SOAP</b>” (el cliente necesita conocer el WSDL del web service para poder comunicarse).<br />
<div class="titulo3">
Seguridad</div>
JEE provee:<br />
<ul>
<li>Acceso anónimo</li>
<li>Autenticación</li>
<li>Autorización</li>
</ul>
La seguridad en JEE puede ser declarativa (mediante descriptores – durante el despliegue de las aplicaciones) o programática (en tiempo de ejecución).<br />
<div class="titulo2">
Arquitectuas JEE habituales</div>
De las muchas variantes posibles, se presentan sólo dos, como casos ilustrativos:<br />
<div class="titulo3">
Cliente servidor</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS54l-xURcsNM09iD8tmsxhWf2cs1Wm9pPtlU5Mq3E7PFbBWKrpd8yJCJF4Y_O-oYw4nb6Ob3tfW44MdGIOp1E9_mETVNWJzaTHlGMQ1e82mvtgXtF598hza8zvLC1AbJtg7TMxzmA4ws-/s1600/5_arquitectura_cliente_servidor_jee.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS54l-xURcsNM09iD8tmsxhWf2cs1Wm9pPtlU5Mq3E7PFbBWKrpd8yJCJF4Y_O-oYw4nb6Ob3tfW44MdGIOp1E9_mETVNWJzaTHlGMQ1e82mvtgXtF598hza8zvLC1AbJtg7TMxzmA4ws-/s320/5_arquitectura_cliente_servidor_jee.png" width="320" /></a></div>
<br />
<div class="titulo3">
Aplicación Web – EJB y/o EJB – Web Services</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgePrYStwoffrBrKylxcdB0QVlEwyXWc2l0YDaiBIYGlu0c_ZHxzfmeaZs7lQ3kWJSHODViQy_GfiaASbpaRaHVAqEqYaEueWSceaqCSAoyeOi6mINgFF-18r7_pGem7j1Upfs1nLoXCGPg/s1600/6_arquitectura_web_jee.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgePrYStwoffrBrKylxcdB0QVlEwyXWc2l0YDaiBIYGlu0c_ZHxzfmeaZs7lQ3kWJSHODViQy_GfiaASbpaRaHVAqEqYaEueWSceaqCSAoyeOi6mINgFF-18r7_pGem7j1Upfs1nLoXCGPg/s320/6_arquitectura_web_jee.png" width="320" /></a></div>
<br />
<div class="titulo2" style="font-size: 26px; font-weight: bold;">
Sinópsis y siguientes temas</div>
En el presente documento se han cubierto los conceptos y definiciones fundamentales de JEE, pasando por las arquitecturas relacionadas y los elementos constitutivos más importantes de la plataforma: Contenedores, servlets, JSPs, JSF, EJBs, web services y el soporte XML relacionado. Más adelante se revisarán las configuraciones básicas para empezar a construir aplicaciones web dentro del marco de JEE, así como los tópicos más importantes de JSP, con lo cual se conseguirá un sustento sólido para abordar JSF.Dustin Ghiahttp://www.blogger.com/profile/12889194226245084576noreply@blogger.com0tag:blogger.com,1999:blog-2215923822960902018.post-89647098142872343032011-03-27T17:32:00.000-07:002011-03-27T21:40:24.508-07:00Leer un archivo de propiedadesUna tarea común es leer un archivo de propiedades desde una aplicación Java. Esto suele ser útil cuando se trata de configurar algún parámetro de la aplicación sin la necesidad de tener que compilarla cada vez, como por ejemplo cuando se trata de definir un Contexto Inicial para buscar componentes EJB desplegados en un servidor.
Como IDE se utiliza Eclipse Galileo, sobre jdk1.5.0_22.
Para empezar, se crea un proyecto nuevo, la perspectiva puede ser Java:
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj15lSayOmh3IG2_-2m-uCJIgKRhZxpRpUnzFdDMRz_dF9sgD1LbEQ1T48kQWHFCBnKFjOkVnMrrjrmDowWV0MZ9S3nRrkbNalkJK7UJmozsXdUKcrTDIGC9t_EFXbj3WElBHaqZX6G9F-4/s1600/01_crear_proyecto.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj15lSayOmh3IG2_-2m-uCJIgKRhZxpRpUnzFdDMRz_dF9sgD1LbEQ1T48kQWHFCBnKFjOkVnMrrjrmDowWV0MZ9S3nRrkbNalkJK7UJmozsXdUKcrTDIGC9t_EFXbj3WElBHaqZX6G9F-4/s320/01_crear_proyecto.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9_jgLGoNJcZYrm7lkhvsg30yM1r15LWiXQ5HXkaAWaZWThCJRke74t88nZ6_-XtH6J8bopbgu9Rd2e1hZWKaq88T_QZ1sAWBogSaYoWGF4XUWf1r2mJ7fej55c_BFZclzZlCsxSpm9TQ2/s1600/02_crear_proyecto.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9_jgLGoNJcZYrm7lkhvsg30yM1r15LWiXQ5HXkaAWaZWThCJRke74t88nZ6_-XtH6J8bopbgu9Rd2e1hZWKaq88T_QZ1sAWBogSaYoWGF4XUWf1r2mJ7fej55c_BFZclzZlCsxSpm9TQ2/s320/02_crear_proyecto.jpg" width="234" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Las demás opciones se mantienen en sus valores por defecto. Una vez creado el proyecto, continuamos con el archivo de propiedades y la clase que lo leerá.
<br />
<br />
<b>La clase:</b>
<br />
<div id="1" style="border:#36C solid 1px; padding:10px; overflow-x:scroll; overflow-y:auto; width:640px;">
<div align="left" class="java">
<table bgcolor="#ffffff" border="0" cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td align="left" nowrap="nowrap" valign="top"><code>
<span style="color: #7f0055;"><b>package </b></span><span style="color: black;">com.programmabilis.util;</span><br />
<span style="color: white;"></span><br />
<span style="color: #7f0055;"><b>import </b></span><span style="color: black;">java.io.IOException;</span><br />
<span style="color: #7f0055;"><b>import </b></span><span style="color: black;">java.io.InputStream;</span><br />
<span style="color: #7f0055;"><b>import </b></span><span style="color: black;">java.util.Properties;</span><br />
<span style="color: white;"></span><br />
<span style="color: #3f5fbf;">/**</span><br />
<span style="color: white;"> </span><span style="color: #3f5fbf;">* Provee funcionalidades basicas para leer y procesar archivos</span><br />
<span style="color: white;"> </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: white;"> </span><span style="color: #3f5fbf;">* </span><span style="color: #7f9fbf;">@author </span><span style="color: #3f5fbf;">Dustin Ghia</span><br />
<span style="color: white;"> </span><span style="color: #3f5fbf;">* </span><br />
<span style="color: white;"> </span><span style="color: #3f5fbf;">*/</span><br />
<span style="color: #7f0055;"><b>public class </b></span><span style="color: black;">UtilitarioArchivos </span><span style="color: black;">{</span><br />
<span style="color: white;"></span><br />
<span style="color: white;"> </span><span style="color: #7f0055;"><b>public static </b></span><span style="color: #7f0055;"><b>void </b></span><span style="color: black;">main</span><span style="color: black;">(</span><span style="color: black;">String</span><span style="color: black;">[] </span><span style="color: black;">argumentos</span><span style="color: black;">) {</span><br />
<span style="color: white;"> </span><span style="color: black;">String archivo = </span><span style="color: #2a00ff;">"../../../archivo.properties"</span><span style="color: black;">;</span><br />
<span style="color: white;"> </span><span style="color: black;">Properties props = </span><span style="color: #7f0055;"><b>new </b></span><span style="color: black;">Properties</span><span style="color: black;">()</span><span style="color: black;">;</span><br />
<span style="color: white;"> </span><span style="color: black;">InputStream flujoEntrada = UtilitarioArchivos.</span><span style="color: #7f0055;"><b>class</b></span><br />
<span style="color: white;"> </span><span style="color: black;">.getResourceAsStream</span><span style="color: black;">(</span><span style="color: black;">archivo</span><span style="color: black;">)</span><span style="color: black;">;</span><br />
<span style="color: white;"> </span><span style="color: #7f0055;"><b>try </b></span><span style="color: black;">{</span><br />
<span style="color: white;"> </span><span style="color: black;">props.load</span><span style="color: black;">(</span><span style="color: black;">flujoEntrada</span><span style="color: black;">)</span><span style="color: black;">;</span><br />
<span style="color: white;"></span><br />
<span style="color: white;"> </span><span style="color: black;">System.out.println</span><span style="color: black;">(</span><span style="color: #2a00ff;">"Nombres completos ---> "</span><br />
<span style="color: white;"> </span><span style="color: black;">+ </span><span style="color: #2a00ff;">""</span><span style="color: black;">.concat</span><span style="color: black;">(</span><span style="color: black;">props.getProperty</span><span style="color: black;">(</span><span style="color: #2a00ff;">"prop1"</span><span style="color: black;">))</span><span style="color: black;">.concat</span><span style="color: black;">(</span><span style="color: #2a00ff;">" "</span><span style="color: black;">)</span><span style="color: black;">.concat</span><span style="color: black;">(</span><br />
<span style="color: white;"> </span><span style="color: black;">props.getProperty</span><span style="color: black;">(</span><span style="color: #2a00ff;">"prop2"</span><span style="color: black;">)))</span><span style="color: black;">;</span><br />
<span style="color: white;"> </span><span style="color: black;">} </span><span style="color: #7f0055;"><b>catch </b></span><span style="color: black;">(</span><span style="color: black;">IOException e</span><span style="color: black;">) {</span><br />
<span style="color: white;"> </span><span style="color: black;">e.printStackTrace</span><span style="color: black;">()</span><span style="color: black;">;</span><br />
<span style="color: white;"> </span><span style="color: black;">}</span><br />
<span style="color: white;"> </span><span style="color: black;">}</span><br />
<span style="color: white;"></span><br />
<span style="color: black;">}</span></code>
</td>
</tr>
<tr>
<td align="right"><small>
<a href="http://www.java2html.de/" target="_blank">Java2html</a>
</small>
</td>
</tr>
</tbody></table>
</div>
</div>
<br />
<b>El archivo de propiedades:</b>
<br />
<b><br /></b><br />
<div id="2" style="border:#36C solid 1px; padding:10px; overflow-x:scroll; overflow-y:auto; width:640px;">
<div align="left" class="java">
<table bgcolor="#ffffff" border="0" cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td align="left" nowrap="nowrap" valign="top"><code>
<span style="color: black;">prop1=</span><br />
<span style="color: black;">prop2=P\u00e1ez</span></code>
</td>
</tr>
<tr>
<td align="right"><small>
<a href="http://www.java2html.de/" target="_blank">Java2html</a>
</small>
</td>
</tr>
</tbody></table>
</div>
</div>
<br />
La vista del proyecto debe quedar aproximadamente así:
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUV-LfqLhvsyDE-iO1C8YZI52gkwNx5C3xftyhBT_7zwy1LeKYXznyEP-zMdBIaJMg-YLHonIciHGthjtqlCGEjjYfzK0nJZxzkOSeXnsbLEovMXCvWZEKeHQetMRxU36w89m1IQ4ABXdO/s1600/03_proyecto_terminado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUV-LfqLhvsyDE-iO1C8YZI52gkwNx5C3xftyhBT_7zwy1LeKYXznyEP-zMdBIaJMg-YLHonIciHGthjtqlCGEjjYfzK0nJZxzkOSeXnsbLEovMXCvWZEKeHQetMRxU36w89m1IQ4ABXdO/s320/03_proyecto_terminado.jpg" width="296" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Nótese que se deben considerar la ubicación de la clase y la del archivo de propiedades para poder cargarlo. Finalmente, se enfatiza en que es posible obtener un campo con valor vacío del archivo de propiedades, aunque se podría asumir que se obtendría un null.Dustin Ghiahttp://www.blogger.com/profile/12889194226245084576noreply@blogger.com0