Configuración inicial de maven
Configuración de maven
------------------------
Para empezar a trabajar con maven en gvSIG, no necesitamos realizar ninguna configuración especial, aparte de tener un JDK instalado, ya que gvSIG contiene un proyecto *build* con todo lo necesario, incluyendo una instalación de maven.
Si, de todas formas, queremos instalar nosotros maven en nuestro sistema, podemos descargarlo de `la web del proyecto`__ e instalándolo siguiendo `las instrucciones de instalación`__. Hay que tener en cuenta que la versión mínima de maven que requiere el proyecto es la 2.2.1.
También podemos necesitar configurar maven si accedemos a Internet a través de un proxy HTTP, cuya configuración se indica en la página de instalación de maven.
Si usamos la instalación de maven incluida en el proyecto *build*, podemos encontrarlo en la subcarpeta *maven*.
.. note::
las pruebas de maven en gvSIG se hacen con la versión incluida en el proyecto *build*, por lo que con otra versión la construcción del proyecto puede que no funcione correctamente.
Tanto si lo instalamos nosotros, como si vamos a usar la instalación del proyecto *build*, en el subdirectorio *bin* tenemos el script *mvn*, que podemos usar si estamos en linux, mac o cualquier otro unix, y el archivo *mvn.bat* si estamos en windows. Lo más cómodo, para poder usarlo desde consola, es añadirlo al path de ejecución (generalmente añadir el directorio build/maven/bin la variable PATH) y así podremos usarlo desde cualquier lugar.
Más adelante se explicarán algunos objetivos habituales que podremos usar, bien desde una consola, bien desde el propio eclipse mediante el uso de launchers desde el menu de *Herramientas externas*.
__ http://maven.apache.org
__ http://maven.apache.org/run-maven/index.html
Configuración de la plataforma
---------------------------------
gvSIG emplea diversas librerías nativas, que son necesarias tanto en compilación como en ejecución de la aplicación. Al ser nativas, deberemos emplear las que correspondan con nuestra plataforma a la hora de compilar gvSIG.
Para ello deberemos realizar una pequeña configuración que indique a maven los detalles de nuestra plataforma, y así éste pueda cargar las librerías nativas que correspondan. Para ello, en el directorio *home* de nuestro usuario, crearemos un archivo *.gvsig.platform.properties* con el siguiente contenido::
native_platform=linux
native_distribution=all
native_compiler=gcc4
native_arch=i386
native_libraryType=dynamic
export native_classifier=${native_platform}-${native_distribution}-${native_compiler}-${native_arch}-${native_libraryType}
Los valores imprescindibles son los 5 primeros, cuyo significado se explica en el apartado de `compilación de librerías nativas`__
__ ../../gvsig-compilation/jni-compilation
Los valores soportados actualmente, es decir, para los que las librerías nativas están ya compiladas o disponibles, son los siguientes:
.. include-document:: supported-platforms
:rest:
Esta configuración directamente nos permite trabajar con la configuración del proyecto preparada para integrar maven con eclipse en gvSIG. Si vamos a invocar a maven desde linea de órdenes, deberemos hacer llegar estos parámetros a maven de otra forma. Existen dos opciones:
- Incluir el valor de las variables *native-classifier* y *native-platform* en cada invocación a maven. Ej::
mvn -Dnative-classifier=linux-all-gcc4-i386-dynamic -Dnative-platform=linux install
- Definir una variable de entorno *MAVEN_OPTS* incluyendo la variable *native_classifier*. En linux, por ejemplo, bastaría con incluir lo siguiente en el archivo *.bash_rc*::
if [ -f "${HOME}/.gvsig.platform.properties" ] ; then
. ${HOME}/.gvsig.platform.properties
export MAVEN_OPTS="-Xmx256M -XX:MaxPermSize=64m -Dnative-classifier=${native_classifier} -Dnative-platform=${native_platform}"
else
export MAVEN_OPTS="-Xmx256M -XX:MaxPermSize=64m"
fi
Con esto podemos compartir directamente los valores configurados de la plataforma entre maven desde eclipse y maven desde consola. Desde cualquier otro sistema operativo podemos dar valor directamente al *native_classifier* en la definición de la variable de entorno, aunque tendremos que acordarnos, si cambiamos algún valor de la plataforma, de cambiarlo para ambos casos (desde eclipse y desde consola).
Además de las plataformas para las que están disponibles librerías nativas ya compiladas, un desarrollador puede compilarlas para una nueva plataforma siguiendo los pasos indicados en el documento de *compilación de librerías nativas*, además de configurar como toca los parámetros del archivo *.gvsig.platform.properties* o la variable de entorno correspondiente.
Acceso de escritura al repositorio maven de gvSIG
--------------------------------------------------
Si somos los responsables de publicar binarios y fuentes o documentación sobre un proyecto de gvSIG, necesitaremos configurar maven para poder tener acceso de escritura al servidor donde se aloja el repositorio de maven de gvSIG, a través de WEBDAV y HTTPS.
Dado que el servidor de gvSIG emplea un certificado digital autofirmado, deberemos instalar antes que nada el certificado de la CA de gvsig en el repositorio de certificados de Java. Los pasos son los siguientes:
#. Descargar el archivo `InstallCert.java `_ [#installcert]_ y compilarlo con la orden::
javac InstallCert.java
.. [#installcert] Este archivo y la información de uso han sido obtenidos desde http://stufftohelpyouout.blogspot.com/2008/10/unable-to-find-valid-certification-path.html y http://nodsw.com/blog/leeland/2006/12/06-no-more-unable-find-valid-certification-path-requested-target. Se le ha realizado una pequeña modificación para que por defecto guarde sobre el almacen de certificados principal de la instalación de java, ahorrando así los pasos de exportar y volver a importar el certificado.
#. A continuación desde consola, lanzar la siguiente orden::
sudo java InstallCert devel.gvsig.org
Loading KeyStore /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/cacerts...
Opening connection to devel.gvsig.org:443...
Starting SSL handshake...
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1649)
...
Server sent 1 certificate(s):
1 Subject CN=devel.gvsig.org
Issuer CN=devel.gvsig.org
sha1 9a 47 0f 0b 1e 41 a9 43 d0 22 0f f2 d3 fd a1 31 5a a8 21 f3
md5 1c d5 19 ea 61 df 5b a4 bf 62 2a 90 09 9d 11 cc
Enter certificate to add to trusted keystore or 'q' to quit: [1]
En Windows usaremos el siguiente comando::
C:\Users\user1\Downloads>%JAVA_HOME%\bin\javac InstallCert.java
C:\Users\user1\Downloads>java InstallCert devel.gvsig.org
Loading KeyStore C:\prog32\jdk6u29\jre\lib\security\cacerts...
Opening connection to devel.gvsig.org:443...
Starting SSL handshake...
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
at InstallCert.main(InstallCert.java:129)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:323)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:217)
at sun.security.validator.Validator.validate(Validator.java:218)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:226)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1198)
... 8 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to
requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)
... 14 more
Server sent 1 certificate(s):
1 Subject EMAILADDRESS=admin@gvsig.org, CN=devel.gvsig.org, OU=gvSIG project, O=gvSIG Association, L=Valencia,
ST=Valencia, C=ES
Issuer EMAILADDRESS=admin@gvsig.org, CN=devel.gvsig.org, OU=gvSIG project, O=gvSIG Association, L=Valencia,
ST=Valencia, C=ES
sha1 73 30 d6 30 6e fb 30 60 09 ac 94 85 36 f9 27 81 e3 f3 c2 fd
md5 59 65 bd 67 2d 59 22 df 8d 8e 0d a6 5e f1 54 2b
Enter certificate to add to trusted keystore or 'q' to quit: [1]
[
[
Version: V3
Subject: EMAILADDRESS=admin@gvsig.org, CN=devel.gvsig.org, OU=gvSIG project, O=gvSIG Association, L=Valencia,
ST=Valencia, C=ES
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
Key: Sun RSA public key, 1024 bits
modulus: 13202240990123857828105832548656908338776238493112050183965274188026349141580065751167773737451990045
10852417463251480195349655822167474112
949140626085069137900739105075962467764174959683911146999883749549039102537440964126002195693809409095128024
250898549304085601766846547755883368884816
20155015717285669413
public exponent: 65537
Validity: [From: Tue Dec 20 13:07:17 CET 2011,
To: Fri Dec 17 13:07:17 CET 2021]
Issuer: EMAILADDRESS=admin@gvsig.org, CN=devel.gvsig.org, OU=gvSIG project, O=gvSIG Association, L=Valencia,
ST=Valencia, C=ES
SerialNumber: [ ea50768a af083070]
Certificate Extensions: 3
[1]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E9 74 E5 C6 4E B2 5E C0 7D 2A 20 CB 29 06 E6 87 .t..N.^..* .)...
0010: 9C 1A D1 86 ....
]
]
[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: E9 74 E5 C6 4E B2 5E C0 7D 2A 20 CB 29 06 E6 87 .t..N.^..* .)...
0010: 9C 1A D1 86 ....
]
[EMAILADDRESS=admin@gvsig.org, CN=devel.gvsig.org, OU=gvSIG project, O=gvSIG Association, L=Valencia, ST=Valencia, C=ES]
SerialNumber: [ ea50768a af083070]
]
[3]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:true
PathLen:2147483647
]
]
Algorithm: [SHA1withRSA]
Signature:
0000: 1B 70 8D 8A F4 A3 87 8E 27 AC 40 41 68 42 DF 67 .p......'.@AhB.g
0010: 49 7D D7 55 BE FF E4 21 7A A3 69 76 B1 6E 23 52 I..U...!z.iv.n#R
0020: 54 4D FE 0B 71 4B E8 28 9B 53 C5 D1 A2 90 BB E2 TM..qK.(.S......
0030: 19 B3 26 E6 36 67 06 7C 2A EE 14 2A E6 7E D6 AE ..&.6g..*..*....
0040: 8F E4 CB 42 43 3B CE 1A 93 03 3C C7 A4 65 A1 F6 ...BC;....<..e..
0050: 6D BB 64 9F B1 71 B8 27 3E 60 0F 91 42 3A 26 00 m.d..q.'>`..B:&.
0060: AB 82 38 60 DA FC C9 99 68 F3 BE CC A3 38 13 1F ..8`....h....8..
0070: 83 15 5E 4A 7D 59 76 E3 75 ED 47 20 2E 15 AB BA ..^J.Yv.u.G ....
]
Added certificate to keystore 'C:\prog32\jdk6u29\jre\lib\security\cacerts' using alias 'devel.gvsig.org-1'
Indicaremos la opción 1, tras lo cuál se añadirá el certificado al keystore de la instalación de java que estamos usando, en concreto en el archivo *$JAVA_HOME/jre/lib/security/cacerts*.
El ejemplo es sobre una instalación de Java sobre Ubuntu, dónde el archivo *cacerts* está ubicado en */usr/lib/jvm/java-6-sun/jre/lib/security*. Hay que tener en cuenta que se importe sobre el repositorio de certificados de la instalación de Java que vayamos a usar para invocar a maven y eclipse.
Además si usamos una instalación de java del sistema, requerirá que invoquemos la orden anterior con permisos de administrador. En el caso de Ubuntu, basta con incluir *sudo* delante de la llamada a java.
A continuación hay que configurar el archivo *settings.xml* de maven con los datos necesarios para acceder al repositorio de maven de gvSIG. Dicho archivo está ubicado en el directorio *USER_HOME/.m2/*, siendo *USER_HOME* el directorio home del usuario, que depende del sistema operativo en el que nos encontremos.
Si es la primera vez que usamos maven 2, deberemos crear a mano esta carpeta y el archivo *settings.xml*.
El archivo deberá tener una entrada para configurar el acceso al servidor de gvSIG, cuyo id es *gvsig-repository*. Como el acceso es por SSH, deberemos incluir el usuario y la clave::
gvsig-repository
[USUARIO]
[CLAVE]
664
774
.. note::
Es importante incluir la configuración de permisos indicada en el ejemplo anterior, ya que los archivos se suben dejando como usuario y grupo el mismo que lo ha subido, lo que evitaría que otro usuario pudiera subir modificaciones sobre un mismo archivo.
Si no queremos incluir la clave de acceso de forma visible en el archivo anterior, a partir de las últimas versiones maven permite encriptar las claves. Para ello, seguiremos los pasos descritos en la documentación de maven, en la página `Password Encryption`__
__ http://maven.apache.org/guides/mini/guide-encryption.html
A modo de resumen, los pasos a seguir son:
#. Creamos una clave maestra con la que encriptar las claves de los servidores, mediante la orden::
mvn --encrypt-master-password
Esto nos devolverá la clave encriptada, algo como::
{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}
#. Guardamos la clave maestra encriptada en el archivo [USER HOME]/.m2/settings-security.xml, que crearemos sino existe, con el siguiente contenido::
[CLAVE MAESTRA ENCRIPTADA]
Usando el ejemplo del paso anterior, quedaría algo como::
{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}
#. Encriptamos la clave de acceso al servidor de OSOR::
mvn --encrypt-password
Que nos devolverá algo como::
{COQLCE6DU6GtcS5P=}
#. Sustituimos la clave en abierto por la clave encriptada en el archivo [USER HOME]/.m2/settings.xml::
gvsig-repository
[USUARIO]
[CLAVE ENCRIPTADA]
Según el ejemplo del paso anterior, quedaría algo como::
gvsig-repository
USER
{COQLCE6DU6GtcS5P=}