miércoles, abril 23, 2008

SVN Keywords

Para poner datos como versión, autor y última actualización dentro de los fuentes es necesario decirle a svn.

Una manera rápida de hacerlo es creando un archivo .keywords en la raíz del proyecto con el siguiente contenido.
Author
Rev
Id
Date
Luego indicar a svn que queremos llevar esos keywords en todos los archivos del proyecto.
$ svn -R propset svn:keywords -F .keywords *

Agregamos una cabecera para los archivos fuentes parecida a esta
/**
* Archivo.java
* $Rev:: $: Revision of last commit
* $Author:: $: Author of last commit
* $Date$:
*/

Y damos un commit a todo el proyecto
$ svn ci -m"Setting keywords"

Mas información en svnbook

miércoles, abril 16, 2008

Multiples instancias de Tomcat

Para correr multiples instancias de Tomcat en el mismo servidor.

Tengo un Tomcat instalado en un RHEL5 en /opt/apache-tomcat-5.5.23 con una liga simbólica de /opt/tomcat5
Dentro de esta instalación en /opt/tomcat5/conf/server.xml tengo configurados varias aplicaciones. Teniendo varias desventajas.
  • Si una aplicación consume muchos recursos, todas las demás bajan de rendimiento.
  • Si una aplicación congela el JVM, las demás dejan de funcionar también.
No es práctico tener una instancia para cada aplicación, sobre todo cuando estas son pequeñas soluciones.

Ahora estoy desarrollando para Tomcat 6 y no quise migrar todas la aplicaciones ya configuradas y probadas en Tomcat 5.5.

Cree un directorio nuevo /var/tomcat y extraje el último Tomcat 6 en /var/tomcat/apache-tomcat-6.0.16
Cree otro directorio, exclusivo para mi instancia lo llamé serverB (pensando en que luego habrá un serverA y un serverC) y cree el siguiente árbol.

|-- conf
| |-- server.xml
| |-- tomcat-users.xml
| `-- web.xml
|-- logs
| `-- catalina.out
|-- temp
|-- webapps
`-- work


Ahora viene lo bueno.
Para correr la instancia y que no choque con la que ya está corriendo, hay que cambiar algunos puertos.

<Service name="Catalina">
<Connector port="8082" URIEncoding="UTF-8" />

<!-- Define an AJP 1.3 Connector on port 8020 -->
<Connector port="8020" enableLookups="false" redirectPort="9972" protocol="AJP/1.3"
URIEncoding="UTF-8" />

Creamos un script de arranque,
run

#!/bin/sh -e
JAVA_HOME="/usr/lib/jvm/java-1.5.0-sun-1.5.0.11"
JAVA_OPTS="-Xmx800m -Xms800m"
#CATALINA_HOME=/opt/tomcat5
CATALINA_HOME=/var/tomcat/apache-tomcat-6.0.16
CATALINA_BASE=/var/tomcat/serverB
export JAVA_HOME JAVA_OPTS CATALINA_HOME CATALINA_BASE

# -p preserves the environment (for $JAVA_HOME etc.)
# -s is required because tomcat's login shell is /bin/false
su -p -s /bin/sh tomcat -c "$CATALINA_HOME/bin/catalina.sh start"


y un script de parada
stop

#!/bin/sh -e
JAVA_HOME="/usr/lib/jvm/java-1.5.0-sun-1.5.0.11"
JAVA_OPTS="-Xmx800m -Xms800m"
CATALINA_HOME=/var/tomcat/apache-tomcat-6.0.16
CATALINA_BASE=/var/tomcat/serverB
export JAVA_HOME JAVA_OPTS CATALINA_HOME CATALINA_BASE

su -p tomcat -c "$CATALINA_HOME/bin/catalina.sh stop"


Ahora tenemos otro Tomcat corriendo en el mismo servidor con puertos diferentes. Creamos un workerb en /etc/httpd/conf/worker.properties apuntando al puerto 8020.

worker.workerb.port=8020
worker.workerb.host=localhost
worker.workerb.type=ajp13
worker.workerb.lbfactor=1


y listo!

martes, abril 15, 2008

Appfuse 2. Creando un nuevo proyecto Spring MVC

Appfuse tiene varias plantillas de proyecto, crearemos nuestro proyecto con la plantilla de Spring-MVC.

En el directorio que queremos crear el proyecto:
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.1 -DgroupId=com.miproyecto.app -DartifactId=proyecto

Las dos últimas opciones son las que cambiamos para personalizar nuestro proyecto.
-DgroupId=com.miproyecto.app es el paquete raíz que utilizaremos, todos los nuevos paquetes que genera Appfuse se crearán dentro de este.
-DartifactId=proyecto es el nombre de nuestro proyecto.

Luego de ejecutar el comando, Appfuse y Maven bajarán todas las librearías de las que depende el proyecto Spring-MVC, entre ellas, Velocity, Hibernate, Spring, AcegiSecurity,...

Para probarlo primero nois aseguramos de tener un MySQL funcionando con una base de datos lista para el proyecto y editamos el archivo pom.xml en la sección Database Settings que está casi al final para introducir las credenciales.

<!-- Database settings -->

<dbunit.dataTypeFactoryName>org.dbunit.dataset.datatype.DefaultDataTypeFactory</dbunit.dataTypeFactoryName>
<dbunit.operation.type>CLEAN_INSERT</dbunit.operation.type>
<hibernate.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</hibernate.dialect>

<jdbc.groupId>mysql</jdbc.groupId>
<jdbc.artifactId>mysql-connector-java</jdbc.artifactId>
<jdbc.version>5.0.5</jdbc.version>

<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
<jdbc.url><![CDATA[jdbc:mysql://localhost/mibasededatos?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8]]></jdbc.url>
<jdbc.username>miusuario</jdbc.username>

<jdbc.password>miclave</jdbc.password>

Para vestir el sitio, editamos las leyendas en /src/main/resources/ApplicationResources.properties


Lo incluimos a un servidor de control de versiones

svn import miproyecto svn://somesvnserver.com/proyecto/trunk -m "Inicio de miproyecto"

Ahora bajamos el resto de los archivos del proyecto

mvn appfuse:full-source

Con este paso dejamos a un lado muchos archivos de appfuse que después podemos integrar al svn cuando creamos necesario.

Generamos los archivos para edición con Eclipse:

mvn install eclipse:eclipse

Ahora probamos nuestra aplicación:

mvn jetty:run-war

Abrimos nuestro navegador en http://localhost:8080 y debemos ver una ventana de bienvenida

¡Listo!


Otros comandos usados comúnmente:



  • Para crear rápidamente una entidad con CRUD
    mvn appfuse:gen -Dentity=Page

  • Para correr y probar todo el sistema
    mvn clean; mvn jetty:run-war -Dmaven.buildNumber.doCheck=false

  • Para correr un JUnit
    mvn test -Dtest=UserFormControllerTest

  • Para exportar la BD usando DBUnit
    mvn dbunit:export -Ddest=sample-data.xml


domingo, abril 06, 2008

SVN mini tutorial

Para importar un proyecto nuevo.

svn import miproyecto svn://somesvnserver.com/miproyecto/trunk -m "Inicio de proyecto"


En el servidor SVN debe de estar configurado un repositorio con el nombre de "miproyecto"

Para extraer un proyecto

svn co svn://somesvnserver.com/miproyecto/trunk miproyecto


Para guardar los cambios
svn ci -m "Resolviendo error de dependencias"

*siempre es bueno poner un comentario corto cada vez

Para agregar un archivo o directorio

svn add nuevo.jsp otro.jsp algo.java


Este minitutorial está incompleto y poco a poco lo iré terminando

viernes, abril 04, 2008

Appfuse 2


Appfuse 2 es una herramienta muy útil para desarrollar proyectos. Conserva las dependencias de las librerías usadas comunmente en los desarrollos con Java/Hibernate/Spring-MVC.

También ofrece un ambiente de desarrollo y pruebas autónomo, que obliga a los desarrolladores a seguir siempre los mismos pasos para crear nuevos objetos, relaciones y tablas.

Se apoya en Maven para la administración del proyecto usando su modelo POM (project object model) facilitando la compilación integrando un ambiente uniforme para desarrollo independiente de la plataforma (Linux, OSX y Windows), ofreciendo información técnica del proyecto (librerías de las que depende con versiones; parámetros de compilación para pruebas y despliegue) y promoviendo la aplicación de mejores prácticas (best practices).

Appfuse crea toda la estructura básica para iniciar un nuevo proyecto. Después de esto puede también crear las configuraciones necesarias para utilizar el IDE de preferencia. Soporta Eclipse, IntelliJIDEA y Netbeans.