Запуск файла JAR, созданного Leiningen

У меня в файле project.clj есть следующий код:

(defproject pinger "0.0.1-SNAPSHOT"
  :description "A website availability tester"
  :dependencies [[org.clojure/clojure "1.3.0"]]
  :main pinger.core)

(ns pinger.core
  (:import (java.net URL HttpURLConnection))
  (:gen-class))

(defn response-code [address]
  (let [conn ^HttpURLConnection (.openConnection (URL. address))
    code (.getResponseCode conn)]
    (when (< code 400)
      (-> conn .getInputStream .close))
    code))

(defn available? [address]
  (= 200 (response-code address)))

(defn -main []
  (let [addresses '("http://google.com"
            "http://amazon.com"
            "http://google.com/badurl")]
    (while true
      (doseq [address addresses]
    (println (available? address)))
      (Thread/sleep (* 1000 60)))))

Создаю уберджар:

C:\Documents and Settings\vreinpa\My Documents\Books\ProgrammingClojure\code\src
\pinger>lein uberjar
Cleaning up.
Copying 1 file to C:\Documents and Settings\vreinpa\My Documents\Books\Programmi
ngClojure\code\src\pinger\lib
Warning: *classpath* not declared dynamic and thus is not dynamically rebindable
, but its name suggests otherwise. Please either indicate ^:dynamic *classpath*
or change the name.
Copying 1 file to C:\Documents and Settings\vreinpa\My Documents\Books\Programmi
ngClojure\code\src\pinger\lib
Created C:\Documents and Settings\vreinpa\My Documents\Books\ProgrammingClojure\
code\src\pinger/pinger-0.0.1-SNAPSHOT.jar
Including pinger-0.0.1-SNAPSHOT.jar
Including clojure-1.3.0.jar
Created C:\Documents and Settings\vreinpa\My Documents\Books\ProgrammingClojure\
code\src\pinger/pinger-0.0.1-SNAPSHOT-standalone.jar

Затем я пытаюсь запустить этот uberjar и получаю следующую ошибку:

C:\Documents and Settings\vreinpa\My Documents\Books\ProgrammingClojure\code\src
\pinger>java -jar pinger-0.0.1-SNAPSHOT-standalone.jar
Exception in thread "main" java.lang.NoClassDefFoundError: pinger/core
Caused by: java.lang.ClassNotFoundException: pinger.core
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: pinger.core. Program will exit.

Что я здесь делаю не так?


person Paul Reiners    schedule 26.01.2012    source источник


Ответы (1)


Как я уже сказал, в ответ на ваш другой вопрос, файл project.clj не место для размещения исходного кода code - project.clj загружается leiningen для настройки конфигурации вашего проекта, и размещение произвольного кода там не гарантирует работы вообще и, безусловно, испортит загрузку пространств имен, которые вы там определили. следуйте соглашениям для исходных библиотек и поместите файлы в каталог src в дереве проекта.

person Joost Diepenmaat    schedule 26.01.2012
comment
Это пример из книги «Программирование на Clojure», в которой неявно говорится о необходимости поместить код в project.clj. Думаю, при написании этой главы авторы не особо старались. - person RocketR; 01.04.2013