clojure classnotfoundexception leiningen

Aplicación independiente de clojure



classnotfoundexception leiningen (4)

Soy un principiante con clojure, empezando ayer.

He reunido que una forma sencilla de crear una aplicación independiente es con leiningen lein new foo .

Intenté crear un proyecto de prueba hola world con leiningen. Agregué: main y: aot directives to project.clj, agregué: gen-class al archivo core.clj e intenté lein run , pero recibo errores sobre la definición de clase no encontrada.

Exception in thread "main" java.lang.NoClassDefFoundError: Caused by: java.lang.ClassNotFoundException: at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266)

El archivo core.clj

(ns test.core (:gen-class)) (defn -main [& args] (println "Hello main"))

Y el archivo project.clj

(defproject test "1.0.0-SNAPSHOT" :description "FIXME: write description" :main test.core :aot [test.core] :dependencies [[org.clojure/clojure "1.2.1"]])

Edición: después de más pruebas, parece que copiar el proyecto en mi escritorio funciona tal como está, lo cual creo que apunta a que el entorno de mi computadora portátil está mal preparado, pero no sé cómo.

El entorno en el escritorio está cerrado desde repositorios y leiningen desde AUR. En la computadora portátil, el clojure es de clojure.org y el leining es de github.


Lo averigué. Tuve el último leiningen de git, que de alguna manera fue tentado. Revisé la etiqueta 1.6.1 y ejecuté la autoinstalación, y ahora funciona.


Me lo perdí, nombraste tu proyecto de prueba, no puedes hacer eso, cambiar el nombre a otra cosa que funcionará.


Usted dice arriba

lein new foo

lo que quieres decir es

lein new test


[ACTUALIZACIÓN Abril 2013]

Leiningen 2, que ha sido lanzado oficialmente por algún tiempo, incluye el concepto de plantillas de proyecto. De forma predeterminada, Leiningen proporciona una plantilla de app que proporciona lo que necesita de forma inmediata. Tratar:

lein new app my-project

Verás que Leiningen crea la plantilla de proyecto familiar, pero también incluye:

  • El espacio de nombres predeterminado de my-project.core como la entrada :main en su archivo project.clj
  • La forma :gen-class en la declaración de espacio de nombres de my-project.core
  • Una función predeterminada -main en el espacio de nombres my-project.core

Para aquellos que aún no pueden usar Leiningen 2, el nuevo plugin lein-newnew proporciona una experiencia equivalente bajo Leiningen 1.

[/ACTUALIZAR]

Para crear un proyecto que, cuando se ejecuta, imprima "¡Hola mundo!", Haría lo siguiente (revisión de su proceso anterior):

Preparar

lein new my-project cd my-project lein deps

Ahora debería tener una estructura básica en su lugar y el tarro de Clojure en su carpeta lib .

Escribe una función

Ahora edite src/my_project/core.clj con el editor que elija, agregando lo siguiente debajo del formulario (ns ...) :

(defn -main [] (println "Hello World!"))

Esta función está dentro de su espacio de nombres my-project.core . Para garantizar que esto se ejecute como su principal, agreguemos un parámetro gen-class a su definición de espacio de nombres en la parte superior, para que ahora se vea así en la parte superior de core.clj :

(ns my-project.core (:gen-class :main true))

Así que todos juntos, su archivo core.clj ve así:

(ns my-project.core (:gen-class :main true)) (defn -main [] (println "Hello World!"))

Configúralo como la función principal

Una vez que haya editado src/my_project/core.clj como anteriormente, debe indicar a Leiningen (la herramienta de compilación) dónde está la función "principal" para su proyecto. Aquí hay un ejemplo de formulario de proyecto que hace esto:

(defproject my-project "1.0.0-SNAPSHOT" :description "My Project" :dependencies [[org.clojure/clojure "1.2.1"]] :main my-project.core)

Ahora, la función -main en my-project.core convierte en el punto de entrada para su programa.

Ejecutarlo

Ahora puede tener dos opciones para ejecutar este proyecto:

  • Use lein run en la línea de comandos mientras se encuentra en la raíz de su my-project project
  • Cree un archivo jar independiente ejecutando lein uberjar . Luego puede ejecutar el archivo jar resultante ejecutando java -jar my-project-1.0.0-SNAPSHOT-standalone.jar