Подтвердить что ты не робот

Автономное приложение clojure

Я начинаю с clojure, только начинаю вчера.

Я понял, что простой способ создать автономное приложение - с leiningen lein new foo.

Я попытался создать приветственный мировой тестовый проект с leiningen. Я добавил: main и: aot директивы для project.clj, добавил: gen-class в файл core.clj и попробовал lein run, но я получаю ошибки в определении класса, которые не найдены.

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)

Файл core.clj

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

И файл 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"]])

Изменить: после дальнейшего тестирования кажется, что копирование проекта на мой рабочий стол работает так, как есть, что, я думаю, указывает на то, что среда на моем ноутбуке каким-то образом сворачивается, но я не знаю, как это сделать.

Среда на рабочем столе clojure из репозиториев и leiningen из AUR. На ноутбуке clojure находится от clojure.org, а leining - от github.

4b9b3361

Ответ 1

Выяснил это. У меня был последний leiningen из git, который каким-то образом был ранен. Я проверил тег 1.6.1 и выполнил самоинсталляцию, и теперь он работает.

Ответ 2

[ОБНОВЛЕНИЕ Апрель 2013]

Leiningen 2, который был официально выпущен на некоторое время, включает концепцию шаблонов проектов. По умолчанию Leiningen предоставляет шаблон app, который обеспечивает то, что вам нужно из коробки. Попробуйте:

lein new app my-project

Вы увидите, что Leiningen создает знакомый шаблон проекта, но также включает в себя:

  • Пространство имен по умолчанию my-project.core как запись :main в файле project.clj
  • Форма :gen-class в объявлении пространства имен my-project.core
  • Функция -main по умолчанию в пространстве имен my-project.core

Для тех, кто еще не может использовать Leiningen 2, плагин lein-newnew обеспечивает эквивалентный опыт в Leiningen 1.

[/ОБНОВЛЕНИЕ]

Чтобы создать проект, который при запуске печатает "Hello World!", вы бы сделали следующее (пересмотр вашего процесса выше):

Настройка

lein new my-project
cd my-project
lein deps

Теперь вы должны иметь базовую структуру и банку Clojure в папке lib.

Записать функцию

Теперь отредактируйте src/my_project/core.clj с помощью вашего редактора, добавив ниже форму (ns ...):

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

Эта функция находится внутри вашего пространства имен my-project.core. Чтобы убедиться, что это запускается в качестве основного, добавьте параметр gen-class в определение пространства имен вверху, чтобы он теперь выглядел как вверху core.clj:

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

Итак, ваш файл core.clj выглядит следующим образом:

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

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

Настроить его как основную функцию

Как только вы отредактируете src/my_project/core.clj, как указано выше, вам нужно указать Leiningen (инструмент построения), где живет "основная" функция для вашего проекта. Вот пример формы defproject, который делает следующее:

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

Теперь функция -main внутри my-project.core становится точкой входа для вашей программы.

Запустить его

Теперь у вас есть два варианта запуска этого проекта:

  • Используйте lein run в командной строке, а в корневом каталоге проекта my-project
  • Создайте автономный файл jar, запустив lein uberjar. Затем вы можете запустить результирующий файл jar, запустив java -jar my-project-1.0.0-SNAPSHOT-standalone.jar

Ответ 3

Вы говорите выше

lein new foo

что вы имеете в виду

lein new test

Ответ 4

Я пропустил его, вы назвали свой проектный тест, вы не можете сделать это, измените имя на что-то еще, что он будет работать.