2012-10-22 43 views
1

我想運行一個Clojure的JAR文件時,我得到的錯誤如下:ClassNotFoundException的運行Clojure的罐子

C:\Users\Nahashon>java -jar C:\Users\Nahashon\.m2\repository\org\enclojure\sample\0.0.1\sample-0.0.1.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: com/mode/mdzw 

Caused by: java.lang.ClassNotFoundException: com.mode.mdzw 
    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: com.mode.mdzw. Program will exit. 

Clojure的項目使用的NetBeans 6.9.1行家創建。和Clojure的代碼如下:

(ns com.mode.mdzw 
(:gen-class)) 

(defn -main [] 
(println "Looks like it works!")) 

的POM文件如下:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<properties> 
    <clojure.version>1.1.0</clojure.version> 
</properties> 
<modelVersion>4.0.0</modelVersion> 
<groupId>org.enclojure</groupId> 
<artifactId>sample</artifactId> 
<version>0.0.1</version> 
<name>mdzw</name> 
<description>mdzw</description> 
<build> 
<sourceDirectory>src/main/clojure</sourceDirectory> 
<testSourceDirectory>src/test/clojure</testSourceDirectory> 
    <resources> 
     <resource> 
      <directory>src/main/clojure</directory> 
     </resource> 
     <resource> 
      <directory>src/main/resources</directory> 
     </resource> 
    </resources> 
    <testResources> 
     <testResource> 
      <directory>src/test/clojure</directory> 
     </testResource> 
    </testResources> 
<plugins> 
    <plugin> 
    <groupId>com.theoryinpractise</groupId> 
    <artifactId>clojure-maven-plugin</artifactId> 
    <version>1.3.2</version> 
    <configuration> 
     <sourceDirectories> 
      <sourceDirectory>src/main/clojure</sourceDirectory> 
     </sourceDirectories> 
     <clojureOptions>-Xmx1G</clojureOptions> 
    </configuration> 
    <executions> 
     <execution> 
     <id>compile-clojure</id> 
     <phase>compile</phase> 
     <goals> 
      <goal>compile</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.5</source> 
     <target>1.5</target> 
    </configuration> 
    </plugin> 

    <!-- --> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <addClasspath>true</addClasspath> 
        <mainClass>classes.com.mode.mdzw</mainClass> 
        <classpathPrefix>dependency</classpathPrefix> 
       </manifest> 
      </archive> 
     </configuration> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <executions> 
      <execution> 
       <id>copy-dependencies</id> 
       <phase>package</phase> 
       <goals> 
        <goal>copy-dependencies</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 

</plugins> 
</build> 
<repositories> 
    <repository> 
    <id>central</id> 
    <url>http://repo1.maven.org/maven2</url> 
    </repository> 
<repository> 
    <id>clojure-releases</id> 
    <url>http://build.clojure.org/releases</url> 
</repository> 
<repository> 
    <id>incanter</id> 
    <url>http://repo.incanter.org</url> 
</repository> 
<repository> 
    <id>clojure-snapshots</id> 
    <url>http://build.clojure.org/snapshots</url> 
</repository> 
<repository> 
    <id>clojars</id> 
    <url>http://clojars.org/repo/</url> 
</repository> 
</repositories> 
<dependencies> 
    <dependency> 
    <groupId>org.clojure</groupId> 
    <artifactId>clojure</artifactId> 
    <version>${clojure.version}</version> 
    </dependency> 
    <dependency> 
    <groupId>org.clojure</groupId> 
    <artifactId>clojure-contrib</artifactId> 
    <version>${clojure.version}</version> 
    </dependency> 
    <dependency> 
    <groupId>swank-clojure</groupId> 
    <artifactId>swank-clojure</artifactId> 
    <version>1.1.0-SNAPSHOT</version> 
    <exclusions> 
     <exclusion> 
     <groupId>org.clojure</groupId> 
     <artifactId>clojure</artifactId> 
     </exclusion> 
     <exclusion> 
     <groupId>org.clojure</groupId> 
     <artifactId>clojure-contrib</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 
    </dependencies> 
</project> 

什麼我不這樣做對嗎?

+0

看來,AOT編譯沒有完成..檢查你的jar文件,看看是否有com/mode/mdzw路徑結構,並且應該有一個類文件叫做mdzw.class – Ankur

+0

你是對的Ankur,那裏沒有mdzw.class文件。我怎樣才能做到這一點? – McKibet

+0

你需要在你的clojure project.clj文件中設置':aot:all'然後做'lein jar',然後使用這個新創建的jar – Ankur

回答

1

如果你剛開始使用leiningen,那麼你可以嘗試Ankur's advice above或在project.clj中設置:main

(defproject org.enclojure/sample "0.1.0-SNAPSHOT" 
    :dependencies [[org.clojure/clojure "1.4.0"]] 
    :main com.mode.mdzw) 

然後只需運行lein run即可啓動程序。如果你想要一個jar,你可以執行w/o lein,使用lein uberjar來構建它。

有關更多信息,請參閱leiningen tutorial

如果你想堅持使用maven(我沒有用太多),你應該看看clojure-maven-plugin的文檔,它已經在你的pom中,但可能沒有正確設置。它提供了一個clojure:compile目標,可能會滿足您的需求。

我想一個顯而易見的問題是,在運行java -jar C:\Users\Nahashon\.m2\repository\org\enclojure\sample\0.0.1\sample-0.0.1.jar之前要運行什麼目標?

+0

謝謝杜林。我想我會試試lein。看起來它比cloven的maven要好很多,我在我訪問過的許多博客上看到過這些推薦。 – McKibet

+1

leiningen是簡單的,但有很多的Clojure項目,包括本身的Clojure和(我相信)所有的contrib項目,你在這裏看到https://github.com/clojure這裏http://build.clojure.org/使用Maven,所以如果你想堅持使用Maven,那麼你就是一個好公司。 –

+0

McKibet,如果這是有用的,你可以投票和/或標記爲答案。 –