2012-01-26 2 views
0

Я следующий код в файле project.clj:Запуск JAR-файл, созданный Leiningen

(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))))) 

Я создаю uberjar:

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. 

Что я здесь делаю неправильно?

ответ

4

Как я уже говорил in response to your other question, файл project.clj не место, чтобы поместить исходный код - project.clj загружается Leiningen для настройки конфигурации проекта и ввода произвольного кода там не гарантировано работать на всех , и, безусловно, испортит загрузку пространств имен, которые вы там определили. следуйте conventions for source libs и поместите файлы в каталог src в дерево проектов.

+0

Это пример из книги «Программирование Clojure», которая неявно говорит, чтобы поставить код в 'project.clj'. Думаю, авторы не слишком старались писать эту главу. – RocketR

Смежные вопросы