Автономное приложение clojure - PullRequest
18 голосов
/ 29 июля 2011

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

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

Я попытался создать тестовый проект hello world с 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"]])

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

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

Ответы [ 4 ]

31 голосов
/ 29 июля 2011

[ОБНОВЛЕНИЕ апреля 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.

[/ UPDATE]

Чтобы создать проект, который при запуске печатает «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 становится точкой входа для вашей программы.

Run It

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

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

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

0 голосов
/ 29 июля 2011

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

0 голосов
/ 29 июля 2011

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

lein new foo

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

lein new test
...