2013-09-27 106 views
4

我試圖用http://www.sparkjava.com/這個小型的Java Web框架啓動。這些指令告訴你將它作爲一個Maven依賴項添加(完成),但當我mvn package時,我得到一個沒有爲spark/Route找到的類def。Spark Java和類路徑

我認爲這是來自Spark類不在我的類路徑。我如何添加它?它會在pom.xml

編輯:對不起,這是我pom.xml

<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"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.bernsteinbear.myapp</groupId> 
    <artifactId>myapp</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>myapp</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.sparkjava</groupId> 
     <artifactId>spark-core</artifactId> 
     <version>1.1</version> 
    </dependency> 
    </dependencies> 
</project> 

編輯:跟蹤

λ chaos myapp → java -cp target/myapp-1.0-SNAPSHOT.jar com.bernsteinbear.myapp.App 
Exception in thread "main" java.lang.NoClassDefFoundError: spark/Route 
Caused by: java.lang.ClassNotFoundException: spark.Route 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

aaaand的來源(例如,從主頁):

λ chaos myapp → cat src/main/java/com/bernsteinbear/myapp/App.java 
/** 
* Hello world! 
* 
*/ 

package com.bernsteinbear.myapp; 
import spark.*; 
import static spark.Spark.*; 

public class App { 

    public static void main(String[] args) { 

    get(new Route("/hello") { 
     @Override 
     public Object handle(Request request, Response response) { 
      return "Hello World!"; 
     } 
     }); 

    } 

} 
+2

請分享加入你的pom.xml – nkukhar

+0

@NKukhar! – tekknolagi

+0

pom.xml從Maven的角度看起來很正確(假設Spark本身沒有錯誤)。你能分享堆棧跟蹤和你的一些源代碼嗎?你有沒有嘗試過來源的例子? – Will

回答

1

好,所以maven package本身並沒有拋出異常;這是執行。 Maven生成的包不能包含運行應用程序所需的所有東西。 (如果你對它包含的內容感到好奇,你可以解壓縮這個jar)。所以現在這是一個包含Maven dependencies到你的打包類路徑的問題(我不一定會推薦這麼麻煩),或者只是包含額外的運行時類路徑中的JAR(對於Unix看起來像-cp a.jar:b.jar:...)。我懷疑spark-dependencies模塊具有所有缺失的依賴關係。 (不幸的是,自述是不是對這個很清楚)

假設火花依賴模塊就足夠了,你只是做:

java -cp target/myapp-1.0-SNAPSHOT.jar:lib/jetty-webapp-7.3.0.v20110203.jar:lib/log4j-1.2.14.jar:lib/slf4j-api-1.6.1.jar:lib/servlet-ap‌​i-3.0.pre4.jar:lib/slf4j-log4j12-1.6.1.jar com.bernsteinbear.myapp.App 

注意,你必須得到的路徑正確。這是假設spark-dependencies zip文件解壓縮到一個lib文件夾。

如果仍然不這樣做,或者需要其他信息或提供反饋,也可以直接ping作者。

+0

嗯。如何找出「jetty-webapp ...」字符串? – tekknolagi

+0

JAR內的火花依賴。只需解壓縮zip文件並看看。我很抱歉 - 我只是糾正了火線依賴關係的鏈接,以防止它阻止你。 – Will

+0

我已經用確切的JAR名稱更新了答案(截至目前的spark-dependencies)。 – Will

10

我什麼工作,使其運行:

mvn package 
mvn exec:java -Dexec.mainClass="com.your.class.with.main.method" 
4

試圖將應用程序部署到Heroku的,當我面臨同樣的問題。我將以下內容添加到我的POM.xml中。這個插件確保將maven依賴關係複製到您的應用程序中。

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals><goal>copy-dependencies</goal></goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

在此之後,你可以繼續運行

java -cp target/classes:"target/dependency/*" com.bernsteinbear.myapp.App 

運行應用程序