domingo, 22 de marzo de 2009

javax.persistence.PersistenceException: No Persistence provider for EntityManager.... SOLUCIONADO

El otro día tuve que montar a un compañero un entorno para trabajar con un proyecto. El procedimiento, el de siempre: bajar glassfish, bajar eclipse (Ganymede) y hacer el (SVN) checkout oportuno del proyecto. A los pocos minutos ya estaba todo montado... pero me encontré con un problema incomprensible:




Este mismo proyecto (con el mismo código y librerías) estaba funcionando correctamente en dos máquinas, así que era incomprensible. ¡PersistenceManager informa de que no encuentra alguna de sus propias clases! Obviamente no tenía nada que ver con el código, así que, como uno es perro viejo, pensé que tenía que ser de otros factores diferenciadores. Igualé las versiones de Glasfish: nada. Actualizé el JDK: nada.... La única diferencia era que las otras máquinas donde funcionaba correctamente sin problemas (una de ellas, la mía) eran Linux (Kubuntu, para más señas) y ésta era un Haselfroch. Miré en un foro un post que hablaba algo sobre un directorio con acentos, pero no era el caso. Afortunadamente, uno tiene la suerte de trabajar junto a amables compañeros y buenos profesionales que me ayudaron a echar un vistazo, y comenzó eso que viene a llamarse brainstorming, donde cada uno empieza a decir en alto las cosas que observa o se le pasan por la cabeza. Es un metodo infalible: al poco rato ya teníamos una pista. Mirando en la consola de Glassfish aparecían caraceres multibyte en la ruta donde desplegaba la aplicación debido a que había espacios en dicha ruta.

En resumen: la aplicación se había desplegado usando la integración de Glassfish con eclipse (muy buena por cierto), ya que se comporta como si tuviesemos el tomcat embebido: rápida y cómoda. En una instalación por defecto, el eclipse pone el Workspace en el directorio de usuario, que en Haselfroch es C:\Documents and Settings\usuario\... y las aplicaciones se despliegan en dicho workspace. En definitiva, por algún bug extraño de la implementación en Toplink Essentials, el PersistenceManager no encuentra los persistence providers de marras si hay caracteres mutibyte en el path.

Solución: asegurate que tu aplicación (que usa EntityManager) se despliegue en un directorio sin espacios, acentos o caracteres no ASCII. Si estás usando Eclipse y usas Windoze, cambia el workspace de Eclipse a un directorio sin espacios... o mejor, usa Linux (nunca hay que perder la oportunidad de "evangelizar" ;-).

P.D.: Por cierto que Microsoft debería plantearse de una vez por todas dejar de poner por defecto los datos de usuario en una partición por defecto que se suele formatear una vez al año como mínimo y que además, todo el mundo desaconseja usar y así, tomar ejemplo de sus propios usuarios y crear un sencillo "home" (en lugar de "Documents and Settings") en otra partición... fórmula de eficacia demostrada desde hace decenas de años... pero en fin, sería pedir cosas "razonables", que no se yo....

6 comentarios :

  1. Tienes razón con los problemas de los paths y los acentos, en general es una regla que enseño a mis alumnos de programación válida para cualquier lenguaje:
    "No pongas ni en tu código ni en el path del proyecto, ni acentos, ni eñes ni espacios. Ni siquiera en los comentarios del código pues te ahorrarás muchos problemas"
    Un abrazo Samuel

    ResponderEliminar
  2. Idolo!! estube un montón buscando la solucion.
    Muchas gracias por compartir tus conocimientos =)

    ResponderEliminar
  3. Tu, lo que idea más bien ni puta idea. Microsoft será todo lo que quieras pero el Documents and settings hace años que se puede oner en otra partición, si sabes como... Pero es igual que en linux, hay que leer algún que otro ht!

    ResponderEliminar
  4. Hace varios años que no instalo un Windows, pero la última vez que instalé uno (un 2003 Server creo recordar), no te proponía o sugería en la instalación una partición distinta para el "Document and Settings" por defecto. Los procedimientos de instalación de los sistemas abiertos *nix recomiendan y/o proponen directamente en el procedimiento de instalación por defecto usar varios filesystems diferentes... desde hace más de 30 años. De ahí mi comentario. Gracias por divulgar tus conocimientos con tanta erudición y compartirlos con nosotros.

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Muchísimas gracias!! Llevaba un par de días de parón por esta tontería absurda, jeje

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...
cookieassistant.com