Friday, 27 January 2012 22:01

Creación de un proyecto Lift con SBT e IntelliJ Idea Community Edition (usando Git o Mercurial)

Juan José Olivera
IntelliJ IntelliJ http://4.bp.blogspot.com/-3xZEYt81Xqw/TkbcLFdvLuI/AAAAAAAAAIc/8eQ09qfg9vY/s1600/Intellij-plugins.png

Voy a tratar de escribir un pequeño instructivo de como iniciar y poner a punto un proyecto Liftweb usando sbt e IntelliJ Idea, usando postgres como DBMS y Squeryl Record como ORM.

Lo primero que debemos hacer es bajarnos la última versión de Liftweb 2.4-M5una vez descargada, procedemos a descompromirla y veremos que existen 2 carpetas: scala_28 y scala_29 que son las que contienen las distintas variantes de proyectos base con las que podemos iniciar un proyecto nuevo según la versión de Scala que queramos usar, scala_28 para Scala 2.8 y scala_29 para Scala 2.9. En este caso vamos a usar Scala 2.9 asi que ingresamos a la carpeta scala_29.

Dentro de la carpeta scala_29, tenemos nuevamente varias carpetas:

  • lift_basic: contiene una clase User, y algunas hojas de estilo, y html5
  • lift_blank: es un proyecto vacio, contiene lo esencial, nada de hojas de estilo ni html(a parte del index y los templates base de lift)
  • lift_mvc: es para aquellos que quieren usar el patrón MVC en lugar de View First
  • lift_xhtml: igual que lift_basic solo que este usa xhtml

En nuestro caso crearemos un proyecto usando lift_blank.

  1. Creamos un directorio para nuestro proyecto(en este caso liftidea):
  2. Copiamos los archivos de la carpeta lift_blank a nuestro nuevo proyecto
  3. Iniciamos el nuevo repositorio con hg init o git init segun sea la herramienta que queramos usar, en este caso vamos a usar mercurial(hg).
  4. Y agregamos los archivos al proyecto con hg add
  5. Hacemos un commit a nuestro repositorio local con hg commit -u usuario -m "Commit inicial"
j2@luthien:~$ mkdir liftidea  
j2@luthien:~$ cp -r lift/scala_29/lift_blank/* liftidea/  
j2@luthien:~$ cd liftidea/  
j2@luthien:~$ hg init  
j2@luthien:~$ hg add  
j2@luthien:~$ hg commit -u usuario -m "Commit inicial"  


Seguidamente creamos un archivo .hgignore con el siguiente contenido:

# use glob syntax.  
syntax: glob  
*.ser  
 *.class  
 *~  
 *.bak  
 *.off  
 *.old  
 .DS_Store  
 project/boot/* 
 project/plugins/lib_managed/* 
 project/plugins/project/* 
 project/plugins/src_managed/* 
 project/plugins/target/* 
  
 # logs 
 derby.log 
  
 # eclipse conf file 
 .settings 
 .classpath 
 .project 
 .manager 
  
 # building 
 target 
 build 
 null 
 tmp* 
 dist 
 test-output 
  
 # sbt 
 target 
 lib_managed 
 src_managed 
 */project/boot  
 */*/project/boot  
   
 # db  
 lift_proto*  
   
 # other scm  
 .svn  
 .CVS  
 .hg*  
   
 # switch to regexp syntax.  
 #  syntax: regexp  
 #  ^\.pc/  
   
 # IntelliJ  
 *.iml  
 *.ipr  
 *.iws  
 .idea  
   
 # Pax Runner (for easy OSGi launching) runner   


Posteriormente debemos editar el archivo project/build/LiftProject.scala, primero hacemos que la clase del proyecto herede de IdeaProject, esto lo hacemos poniendo with IdeaProject  justo después de extends DefaultWebProject(info) y antecitos del { , posteriormente agregamos las siguientes lineas justo despues de la linea que dice lazy val JavaNet...:

val lift_postgresql = "postgresql" % "postgresql" % "8.4-701.jdbc4"  
override def managedStyle = ManagedStyle.Maven  
override def jettyWebappPath = webappPath  
override def scanDirectories = Nil  


Las tres últimas lineas son importantes porque permiten que cuando ejecutemos el proyecto desde sbt, los cambios a los archivos estáticos:html, css, js, imágenes sean reflejados en la aplicación que se ejecuta sin tener que reiniciar la ejecución de la aplicación(con lo que solo será necesario reiniciar la aplicación cuando cambiemos cosas en el código Scala). En el mismo archivo dentro del método libraryDependencies justo despues de la línea:

"net.liftweb" %% "lift-webkit" % liftVersion.value.toString % "compile",  

Agregamos:

 

"net.liftweb" %% "lift-record" % liftVersion.value.toString % "compile",  
"net.liftweb" %% "lift-squeryl-record" % liftVersion.value.toString % "compile",  

A continuación creamos un archivo llamado Plugins.scala dentro de project/plugins, que nos sirve para poder generar un archivo de configuración para Idea a partir de nuestro proyecto sbt, el contenido del archivo es el que sigue:

import sbt._  
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {  
  val sbtIdeaRepo = "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"  
  val sbtIdea = "com.github.mpeltonen" % "sbt-idea-plugin" % "0.4.0"  
}  

El siguiente archivo a editar(aunque no es necesario, me imagino que la mayoria lo hará) es: project/build.properties, este archivo contiene el nombre de la organización a la que pertence el proyecto, el nombre del proyecto, la versión del proyecto y otros datos relativos a Sbt, Lift y Scala.

Una vez editados todos estos archivos, procedemos a ejecutar sbt, hacer un update y crear los archivos de configuración para IntelliJ Ide con el comando idea dentro de la consolta sbt:

j2@luthien:~/liftidea$ ./sbt  
  
  
...  
  
  
> update  
  
  
...  
  
  
> idea  

Esto genera un archivo .iml dentro de la carpeta raiz del proyecto, con este archivo generado ejecutamos Idea, una vez en Idea nos vamos a File > Open project, y seleccionamos la carpeta donde creamos nuestro proyecto(se puede ver que esa carpeta sale con el loguito de IntelliJ Idea), va a tardar un poco en importar el proyecto.(Nota: deben tener instalados  los plugins de sbt y scala para IntelliJ Idea antes de importar el proyecto). Debido a que estamos usando la versión Comunnity Idea de IntelliJ va a salir un mensaje que dice Error Loading Project, Cannot load facet.., hacemos click en details, y le damos click a yes(esto eliminara este facet del proyecto).

Lo siguiente que necesitamos es configurar o crear una configuración de ejecución de Idea para eso nos vamos a: Run > Edit configurations, hacemos click en el + -Add New Configuration (Insertar)-, selecionamos Scala console, le asignamos un nombre(name), tickeamos Run Sbt Action, hacemos click en los puntos suspensivos, y escribimos jetty dentro de la caja de texto que aparece, hacemos nuevamente click en Ok, click en Apply, click en Ok.

Una vez se cierre el dialogo de configuración, para ejecutar la aplicación hacemos click en la flechita verde (Run) o presionamos Mayúsculas + F10, podemos ver que abajo en las consolas inferiores la pestaña que dice Sbt empieza a mostrar algo, una vez muestre:

[info] Waiting... (press any key to interrupt)  

Significa que todo esta bien, en caso contrario en algo nos hemos equivocado :p, si todo esta bien vamos al navegador y escribimos http://localhost:8080, y veremos ya la aplicacion Lift ejecutandose, claro bien feita pues no tiene nada :p todavia.

PD: las lineas del archivo .hgignore no deben tener espacios delante, si no no ignorara los archivos temporales o que no tienen nada que ver con el proyecto en si.

Notas extra de aclaracion:

  1. El proyecto no posee los templates html (default.html) adecuados para trabajar con html5, por lo que hay que cambiar a uso de selectores css los binds de este archivo y agregar el soporte de html5 en el archivo Boot.scala
  2. Use sbt 0.7



1 Comment

  • Comment Link Andrea Wednesday, 15 February 2012 19:20 posted by Andrea

    Felicidades, todos los pasos me funcionaron a la prefeccion :)

Leave a comment

Make sure you enter the (*) required information where indicated.
Basic HTML code is allowed.

Copyright © 2009 Genso, inicitavias web All Rights Reserved.
c. Ladislao Cabrera N° E-0280, 2do piso • 591-4-4505438 • info@genso.com.bo
Cochabamba - Bolivia