{"id":64,"date":"2009-10-29T20:21:19","date_gmt":"2009-10-29T18:21:19","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=64"},"modified":"2022-08-20T18:26:12","modified_gmt":"2022-08-20T16:26:12","slug":"jdee-java-development-environment-for-emacs","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=64","title":{"rendered":"JDEE (Java Development Environment for Emacs)"},"content":{"rendered":"<p><strong>JDEE <\/strong>(Java Development Environment for Emacs) es un add-on que permite a Emacs comprender el sistema de creaci\u00f3n, edici\u00f3n, debugging y documentaci\u00f3n del lenguaje Java. Es necesario tener <strong>CEDET <\/strong>instalado (explicado en un art\u00edculo anterior) tambi\u00e9n requiere <strong>elib <\/strong>(Emacs Lisp Library), <strong>JDK <\/strong>(Java Development Kit o herramientas equivalentes; compilador, m\u00e1quina virtual, debugger, librer\u00edas de clases, etc) y un entorno de shell como Bash, tambi\u00e9n es recomendado tener instalado y configurado <strong>ECB <\/strong>(<a href=\"https:\/\/www.blackhats.es\/wordpress\/?p=63\" target=\"_blank\" rel=\"noopener\">explicado en el art\u00edculo anterior<\/a>).<\/p>\n<p>B\u00e1sicamente JDEE incluye:<\/p>\n<ul>\n<li>Un men\u00fa espec\u00edfico para <strong>JDEE <\/strong>(compilar, ejecutar, debuggear, construir, navegaci\u00f3n, proyecto, ayuda).<\/li>\n<li>Highlighting.<\/li>\n<li>Auto indentaci\u00f3n.<\/li>\n<li>Enlaces a c\u00f3digo de los errores de compilaci\u00f3n.<\/li>\n<li>Debugging a nivel de c\u00f3digo fuente.<\/li>\n<li>Navegaci\u00f3n espec\u00edfica para el c\u00f3digo fuente.<\/li>\n<li>Soporte para makefiles.<\/li>\n<li>Generaci\u00f3n de c\u00f3digo autom\u00e1tica.<\/li>\n<li>Int\u00e9rprete de c\u00f3digo fuente en Java.<\/li>\n<\/ul>\n<p>Como la instalaci\u00f3n de <strong>CEDET <\/strong>ya la hemos explicado en <a href=\"https:\/\/www.blackhats.es\/wordpress\/?p=62\" target=\"_blank\" rel=\"noopener\">art\u00edculos anteriores<\/a>, pasaremos a explicar como instalar la <strong>biblioteca ELisp<\/strong>, <strong>Elib <\/strong>(<a href=\"http:\/\/www.math.utah.edu\/docs\/info\/elib_toc.html\" target=\"_blank\" rel=\"noopener\">aqu\u00ed se puede ver la documentaci\u00f3n completa sobre ello<\/a>):<\/p>\n<p>Una vez descargado el fuente debemos ejecutar <strong>make &amp;&amp; make install <\/strong>fij\u00e1ndonos bien donde se instala o bien indic\u00e1ndolo nosotros mismos mediante los modificadores mediante el configure o bien editando directamente el <strong>Makefile <\/strong>tales como:<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"text-decoration: underline;\">Entrada en el makefile \/ Valor t\u00edpico \/ Descripci\u00f3n:<\/span><\/p>\n<ul>\n<li><span style=\"color: #0000ff;\">prefix <\/span>suele tomar el valor <span style=\"color: #ff00ff;\">\/usr\/local<\/span> e indica el directorio donde se encuentra <strong>shared<\/strong>.<\/li>\n<li><span style=\"color: #0000ff;\">datadir <\/span>suele tomar el valor <span style=\"color: #ff00ff;\">$(prefix)\/share<\/span> e indica el directorio principal<strong> donde se encuentra Emacs<\/strong>.<\/li>\n<li><span style=\"color: #0000ff;\">locallisppath <\/span>suele tomar el valor <span style=\"color: #ff00ff;\">$(datadir)\/emacs\/site-lisp<\/span> e indica donde se deben instalar los ficheros <strong>Lisp locales<\/strong>.<\/li>\n<li><span style=\"color: #0000ff;\">ELIBDIR <\/span>suele tomar el valor <span style=\"color: #ff00ff;\">$(locallisppath)\/elib<\/span> e indica donde ir\u00e1n los ficheros Lisp de <strong>Elib<\/strong>.<\/li>\n<li><span style=\"color: #0000ff;\">EMACS <\/span>suele tomar el valor <span style=\"color: #ff00ff;\">\/usr\/bin\/emacs<\/span> e indica cu\u00e1l es el <strong>binario <\/strong>con que se lanza emacs.<\/li>\n<\/ul>\n<p>Una vez instaladas todas las dependencias de emacs para poder usar JDEE, podemos proceder a la instalaci\u00f3n del mismo. A nuestro .emacs ahora debemos a\u00f1adirle las siguientes l\u00edneas:<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\"><em>;; Minimal setup required to run the JDEE<br \/>\n;; Debug option to enable a backtrace when a problem occurs<br \/>\n(setq debug-on-error t)<\/em><\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\"><em>;; Include the path to the JDEE and its required packages<br \/>\n(add-to-list &#8216;load-path (expand-file-name \u00ab\/usr\/local\/emacs\/site-lisp\/jde\/lisp\u00bb))<br \/>\n(add-to-list &#8216;load-path (expand-file-name \u00ab\/usr\/local\/emacs\/site-lisp\/semantic\u00bb))<br \/>\n(add-to-list &#8216;load-path (expand-file-name \u00ab\/usr\/local\/emacs\/site-lisp\/speedbar\u00bb))<br \/>\n(add-to-list &#8216;load-path (expand-file-name \u00ab\/usr\/local\/emacs\/site-lisp\/eieio\u00bb))<br \/>\n(add-to-list &#8216;load-path (expand-file-name \u00ab\/usr\/local\/emacs\/site-lisp\/elib\u00bb))<\/em><\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\"><em>;; Defer loading JDEE until you open a Java file<br \/>\n(setq defer-loading-jde nil)<\/em><\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\"><em>(if defer-loading-jde<\/em><\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #ff6600;\"><em>(progn<\/em><\/span><\/p>\n<p style=\"padding-left: 90px;\"><span style=\"color: #ff6600;\"><em>(autoload &#8216;jde-mode \u00abjde\u00bb \u00abJDE mode.\u00bb t)<\/em><\/span><\/p>\n<p style=\"padding-left: 90px;\"><span style=\"color: #ff6600;\"><em>(setq auto-mode-alist<\/em><\/span><\/p>\n<p style=\"padding-left: 120px;\"><span style=\"color: #ff6600;\"><em>(append<\/em><\/span><\/p>\n<p style=\"padding-left: 150px;\"><span style=\"color: #ff6600;\"><em>&#8216;((\u00ab\\\\.java'\u00bb . jde-mode))<\/em><\/span><\/p>\n<p style=\"padding-left: 120px;\"><span style=\"color: #ff6600;\"><em>auto-mode-alist)))<\/em><\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #ff6600;\"><em>(require &#8216;jde))<\/em><\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\"><em>;; Set basic indentation for Java source files of 2 spaces<br \/>\n(add-hook &#8216;jde-mode-hook &#8216;(lambda () setq c-basic-offset 2)))<\/em><\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #ff6600;\"><em>;; Set up to run bash as its primary shell (important for JDEE env)<br \/>\n(setq shell-file-name \u00abbash\u00bb)<br \/>\n(setq shell-command-switch \u00ab-c\u00bb)<br \/>\n(setq explicit-shell-file-name shell-file-name)<br \/>\n(setenv \u00abSHELL\u00bb shell-file-name)<br \/>\n(setq explicit-sh-args &#8216;(\u00ab-login\u00bb \u00ab-i\u00bb))<br \/>\n(if (boundp &#8216;w32-quote-process-args)<br \/>\n<\/em><\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #ff6600;\"><em>(setq w32-quote-process-args ?\\\u00bb)) ;; Include only for MS Windows<\/em><\/span><\/p>\n<p>A partir de aqu\u00ed la compilaci\u00f3n de los ficheros lisp de <strong>JDEE <\/strong>no es requerida, pero s\u00ed aconsejable para ganar tiempo. Para realizar esto, debemos lanzar emacs y una vez dentro ejecutaremos <strong>M-x jde-compile-jde<\/strong>, s\u00f3lo es necesario compilarlo una vez obviamente.<\/p>\n<p>Registrar las<strong> Java Tools<\/strong> es tambi\u00e9n un paso opcional, pero es interesante para cuando se tienen m\u00faltiples versiones de <strong>JDK <\/strong>instaladas. Para registrar un <strong>JDK <\/strong>ser\u00e1 necesario ejecutar <strong>M-x customize-variable<\/strong> y desde ah\u00ed configurar la variable<strong> jde-jdk-registry<\/strong>, donde podemos seleccionar <strong>INS <\/strong>de <strong>insert <\/strong>para a\u00f1adir un nuevo n\u00famero de versi\u00f3n y <strong>path <\/strong>para el <strong>JDK<\/strong>. Este proceso puede ser repetido tantas veces como <strong>JDK <\/strong>queramos registrar, es importante presionar el boton \u00ab<strong>State<\/strong>\u00bb para guardar los cambios para futuros usos, as\u00ed como presionar el bot\u00f3n \u00ab<strong>Finish<\/strong>\u00ab<strong> <\/strong>para esta primera vez antes de cerrar el buffer. Una vez hayamos registrado las <strong>JDK<\/strong> deseadas podemos cambiar la versi\u00f3n activa mediante <strong>M-x customize-variable<\/strong> y editar la variable <strong>jde-jdk<\/strong>, la cu\u00e1l mostrar\u00e1 un prompt con la lista de <strong>JDK <\/strong>registradas.<\/p>\n<p>Se ha comprobado que en algunos casos las <strong>JDK <\/strong>dan problemas a la hora de compilarla, el problema t\u00edpico suele ser que no se encuentra el fichero <strong>tools.jar<\/strong>, en ese caso deber\u00edamos editar la variable<strong> jde-global-classpath<\/strong> e incluir dicho fichero. Una configuraci\u00f3n t\u00edpica podr\u00eda ser esta (variable valor):<\/p>\n<p style=\"padding-left: 30px;\"><strong>jde-global-classpath<\/strong> \/usr\/local\/j2se:.<\/p>\n<p style=\"padding-left: 30px;\"><strong>jde-jdk-registry<\/strong> Version = 1.4.2<\/p>\n<p style=\"padding-left: 150px;\">Path = \/usr\/local\/j2se<\/p>\n<p>Ahora veamos que keystrokes y utilidades hemos ganado teniendo <strong>JDEE <\/strong>funcionando correctamente: previamente ten\u00edamos comandos soportados por <strong>M-x java-mode<\/strong> tal que:<\/p>\n<p style=\"padding-left: 30px;\"><strong>M-a<\/strong> y <strong>M-e<\/strong>: para moverse por los comandos java.<br \/>\n<strong>M-C-\\<\/strong> : indenta una regi\u00f3n y tienen en cuenta las excepciones para realizar una alineaci\u00f3n especial.<\/p>\n<p>Hay m\u00e1s de ellos, todos relacionados con el <strong>modo c++<\/strong>. Ahora tenemos otras ciertas ventajas, tales como:<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-v C-.<\/strong> : &#8216;<span style=\"color: #0000ff;\">jde-complete<\/span>&#8216;; muestra el listado de posibles opciones (incluida para toda la <strong>API <\/strong>de Java). La lista de opciones es completada mediante la viariable <strong>jde-global-path<\/strong> (que es posible configurar) d\u00e1ndole el valor deseado, sino tomar\u00e1 el del <strong>CLASSPATH<\/strong>.<br \/>\n<strong>(sin keystroke asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">jde-browse-class-at-point<\/span>&#8216;; Lanza el navegador de clases.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"text-decoration: underline;\">Para la generaci\u00f3n de c\u00f3digo tenemos:<\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-v C-l <\/strong>: &#8216;<span style=\"color: #0000ff;\">jde-gen-println<\/span>&#8216; ; muestra un prompt para imprimir el contenido e inserta <strong>System.out.println()<\/strong>.<br \/>\n<strong>C-c C-v C-z<\/strong> : &#8216;<span style=\"color: #0000ff;\">jde-import-find-and-import<\/span>&#8216;; importa automaticamente los imports requeridos al inicio del fichero.<br \/>\n<strong>C-c C-v i <\/strong>: &#8216;<span style=\"color: #0000ff;\">jde-wiz-implement-interface<\/span>&#8216;; muestra un prompt para a\u00f1adir el nombre de la interfaz a implementar, a\u00f1ade los imports necesarios, as\u00ed como los requeridos para los argumentos de los m\u00e9todos. Adem\u00e1s de ello provee de skeletons comentados para cada metodo de la interfaz.<\/p>\n<p style=\"padding-left: 30px;\">Adem\u00e1s de ello permite generar getters y setters mediante la creaci\u00f3n de una lista de atributos y ejecutando el wizard. Tambi\u00e9n se puede usar el wizard para actualizar dichos getters y setters en el caso de que se haya a\u00f1adido o eliminado alguno.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"text-decoration: underline;\">Para la compilaci\u00f3n y ejecuci\u00f3n de programas tenemos:<\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-v C-c<\/strong> ; compila el buffer actual. Si existen errores es posible moverse por dicho buffer de errores, pulsar intro, y el cursor autom\u00e1ticamente saltar\u00e1 al error referido en el c\u00f3digo.<br \/>\n<strong>(sin keystroke asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">jde-ant-build<\/span>&#8216;; compila mediante ant, para m\u00e1s informaci\u00f3n mirar la secci\u00f3n de Help de las variables comenzadas por <strong>jde-ant<\/strong>.<br \/>\n<strong>C-c C-v C-r<\/strong> : \u00bb; ejecuta el buffer actual abriendo un buffer nuevo con cualquier salida (output) que tenga dicho programa.<\/p>\n<p style=\"padding-left: 30px;\">Para ejecutar proyectos grandes es conveniente editar las variables <strong>jde-run-working-directory<\/strong> que indica d\u00f3nde comenzar\u00e1 la ejecuci\u00f3n y <strong>jde-run-applications-class<\/strong> que indica el nombre de la clase que contiene el m\u00e9todo <strong>main() <\/strong>a ejecutar.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"text-decoration: underline;\">Los siguientes keystrokes son \u00fatiles en caso de encontrar <strong>backtraces <\/strong>en el caso de ocurrir alguna excepci\u00f3n:<\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-v C-[ <\/strong>; ir al siguiente m\u00e9todo del stacktrace.<br \/>\n<strong>C-c C-v C-]<\/strong> ; ir al anterior m\u00e9todo del stacktrace.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"text-decoration: underline;\">Los keystrokes referentes a debugging mediante <strong>JDB <\/strong>(Java Debugger) son:<\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keystroke asociada)<\/strong>: &#8216;<span style=\"color: #0000ff;\">jde-jdb<\/span>&#8216;; lanza <strong>jdb<\/strong>.<br \/>\n<strong>C-c C-a C-s<\/strong> ; siguiente paso (comando JDB es <span style=\"color: #008000;\">step<\/span>)<br \/>\n<strong>C-c C-a C-n<\/strong> ; siguiente sentencia (comando JDB es <span style=\"color: #008000;\">next<\/span>)<br \/>\n<strong>C-c C-a C-c<\/strong> ; continua (comando JDB es <span style=\"color: #008000;\">cont<\/span>)<br \/>\n<strong>C-c C-a C-b<\/strong> ; toggle breakpoint (comando JDB es <span style=\"color: #008000;\">stop in<\/span>, <span style=\"color: #008000;\">stop at<\/span>, <span style=\"color: #008000;\">clear<\/span>)<br \/>\n<strong>C-c C-a C-p<\/strong> ; imprime una expresi\u00f3n (comando JDB es <span style=\"color: #008000;\">print<\/span>)<br \/>\n<strong>C-c C-a C-d<\/strong> ; vuelca un objeto (comando JDB es <span style=\"color: #008000;\">dump<\/span>)<\/p>\n<p style=\"padding-left: 30px;\">Las ventajas que nos ofrece JDB desde emacs es que podemos interactuar directamente con el debugger accediendo al buffer <strong>*debug*<\/strong>.<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #ff6600;\">Nota:<\/span><\/strong> se debe tener en cuenta que las clases han debido ser compiladas con soporte para debugging, esto es mediante el par\u00e1metro <strong>-g<\/strong> para el comando <strong>javac<\/strong>, para ello con <strong>JDEE <\/strong>deberemos haber editado la variable <strong>jde-compile-option-debug<\/strong>.<\/p>\n<p><strong>JDEE <\/strong>es inmenso, por lo que si queremos una referencia completa sobre todo el potencial del mismo deberemos acceder a la <a href=\"http:\/\/jdee.sunsite.dk\" target=\"_blank\" rel=\"noopener\">web oficial de JDEE<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>JDEE (Java Development Environment for Emacs) es un add-on que permite a Emacs comprender el sistema de creaci\u00f3n, edici\u00f3n, debugging y documentaci\u00f3n del lenguaje Java. Es necesario tener CEDET instalado (explicado en un art\u00edculo anterior) tambi\u00e9n requiere elib (Emacs Lisp Library), JDK (Java Development Kit o herramientas equivalentes; compilador, m\u00e1quina virtual, debugger, librer\u00edas de clases, [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[97,98,124,67,8,114,105,123],"class_list":["post-64","post","type-post","status-publish","format-standard","hentry","category-basic","tag-cedet","tag-ecb","tag-elib","tag-elisp","tag-emacs","tag-java","tag-jdee","tag-jdk"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/64"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=64"}],"version-history":[{"count":1,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/64\/revisions"}],"predecessor-version":[{"id":778,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/64\/revisions\/778"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=64"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=64"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}