2009-12-23 7 views
5

Estoy empezando a jugar con Clojure un poco y mi experiencia en Java es bastante limitada. Vengo del dinámico mundo de Ruby y OO, ¡así que el lado funcional de las cosas es muy interesante!¿La manera más fácil de administrar mi CLASSPATH?

De todos modos, cuando descubro las bibliotecas y varias herramientas para su uso (y los archivos tutoriales para el Pragmatic Clojure Book), todo exige típicamente colocar archivos en CLASSPATH para que Clojure pueda ver la biblioteca.

¿Existe algo así como una buena práctica de CLASSPATH? ¿Alguna vez querría tener un CLASSPATH solo con las bibliotecas externas de archivos que necesito o puedo continuar con cualquier biblioteca o archivo que necesite en un directorio y simplemente definirlo como CLASSPATH y solo requerir lo que se necesita?

Si ayuda, soy un usuario de OSX y Emacs (usando slime y swank-clojure).

Respuesta

2

Personalmente, estoy usando una variante de una función elisp clojure-project por Phil Hagelberg, véase la fuente en this post al grupo Clojure. Establece el classpath de forma adecuada para el proyecto en el que trabajará, luego inicia SLIME. (EDIT: Tendrá que cambiar el valor, que se asigna a swank-clojure-jar-path para apuntar a clojure.jar estoy usando (expand-file-name "~/.clojure/clojure.jar") como predeterminado..)

Para responder a la pregunta acerca de tener todo en la ruta de clase todo el tiempo vs solo arrojando lo que se necesita: a mi leal saber y entender, nada se romperá si tomas el primer acercamiento (sé que lo hago con fines experimentales), pero aparentemente las cosas podrían romperse con el primer enfoque (ver el comentario de cjstehno abajo) y en un proyecto apropiado, encuentro que el segundo es más limpio. En algún momento, será necesario determinar qué bibliotecas se están utilizando (y qué versiones de ellas), aunque solo sea para contarle a leiningen (o maven) sobre esto, ¿por qué no mantener las pestañas sobre la marcha?

+0

En realidad, si pones todo en classpath, puedes tener problemas, especialmente colisiones de cargador de clases o carga de clases errónea. Por lo general, es mejor tener solo lo que necesita en el classpath para su aplicación específica. – cjstehno

+0

Oh, ya veo. Aparentemente tuve suerte hasta ahora, pero lo tendré en cuenta para el futuro. Gracias por el comentario, se editará en consecuencia. –

+0

Ohhh Me gusta la implementación del proyecto clojure de Phil, creo que voy a dar una vuelta e informar en un momento. ¡Gracias! – mwilliams

1

Estamos utilizando Clojure y utilizamos una serie de herramientas de infraestructura, especialmente Eclipse (IDE) (http://en.wikipedia.org/wiki/Eclipse_%28software%29) y maven (http://en.wikipedia.org/wiki/Apache_Maven). maven maneja las bibliotecas y las dependencias de jar, por lo que si tiene varias y es probable que comiencen a usar maven.

En respuesta a su pregunta original, puede simplemente poner sus jarras en un directorio y puede acceder a ellas por su nombre cada vez que corra. Pero se beneficiará de las herramientas ...

Si solo está explorando, entonces Eclipse probablemente administre sus archivos jar con bastante facilidad. Puede agregarlos al proyecto según sea necesario a través de la ruta de compilación -> Configurar ruta de compilación.

A medida que avanza su trabajo, posiblemente desee dividirlo en proyectos compatibles con Eclipse para que pueda agregar su (u otros proyectos) a su ruta de compilación.

Si utiliza bibliotecas Clojure externas, mire si se han empaquetado como proyectos maven (tendrán un archivo pom.xml). El POM dará una lista de dependencias. #

+0

Desafortunadamente, Eclipse no está disponible. Como mencioné, Emacs es lo que estoy usando para Clojure dev. – mwilliams

1

La práctica habitual de CLASSPATH para Java consiste en poner solo los archivos jar necesarios para un proyecto en esta ruta de clase de proyectos, lo que significa tener rutas de clase potencialmente diferentes para proyectos diferentes. Esto generalmente es administrado por el IDE como parte de sus propiedades de proyecto.

Dado que está usando Emacs y probablemente no tenga o use algo así como proyectos, podría ser más conveniente configurar y usar una única ruta de clase global para todas sus cosas relacionadas con clojure o incluso simplemente poner todas los archivos jar necesarios en el directorio java2se/jre/lib/ext de su instalación java.

Los dos problemas principales que pueden surgir al tener archivos jar innecesarios en su ruta de clase son: 1. tiene un impacto negativo menor en el tiempo de inicio de la JVM y 2. se hace más difícil asegurarse de que no están teniendo clases con diferentes versiones en la misma ruta de clase (es decir, diferentes clases con el mismo paquete y nombre en diferentes archivos jar).

1

Desde Java SE 1.6 (o JDK 1.6) puede incluir entradas de ruta de clase por comodín. Si los archivos de clase viven en \ bin y los archivos JAR de biblioteca viven en \ lib, a continuación, en Windows se podría definir la ruta de clase como esta:..

set CLASSPATH=bin;lib\*; 

Esto le permitirá añadir archivos jar en el. \ lib y se agregarán automáticamente a la ruta de clase para nuevas instancias de JRE.

Ver este enlace para obtener más información: Setting the class path

Antes de JDK 1.6 que tenía que agregar cada archivo JAR en la ruta de clase individual.

6

Recomiendo usar leiningen y lein-swank para gestionar esto. Puede iniciar un REPL en el directorio y conectarse desde Emacs.

0

acabo de descubrir este bit, que tengo que dar un tiro:

(setq swank-clojure-extra-classpaths (list "/class/path/1" "/class/path/2" "/class/path/3" "etc"))

0

clojure-contrib/lanzadores/bash/CLJ-env-dir tiene una propiedad interesante que puede apuntar a una directorio y básicamente incluirá cualquier cosa allí. En el pasado, tenía un directorio ~/classpath en el que volcaba cualquier tarro y vinculaba cualquier directorio de uso común y funcionó de maravilla. Manera muy simple de volcar y usar. Ahora tiendo a usar Maven clojure-maven-plugin y eso funciona bien, aunque también puede ser un poco tedioso cuando solo quieres hacer algunas ideas.

Cuestiones relacionadas