2012-01-26 30 views
0
创建一个JAR文件

我已经在文件project.clj下面的代码:运行由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

这是一本“Programming Clojure”书籍的例子,它隐含地告诉把代码放在'project.clj'中。我想,作者在撰写本章时并没有太努力。 – RocketR