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 archivoproject.clj
- La forma
:gen-class
en la declaración de espacio de nombres demy-project.core
- Una función predeterminada
-main
en el espacio de nombresmy-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 sumy-project
project - Cree un archivo jar independiente ejecutando
lein uberjar
. Luego puede ejecutar el archivo jar resultante ejecutandojava -jar my-project-1.0.0-SNAPSHOT-standalone.jar