2013-09-27 3 views
4

작은 자바 웹 프레임 워크 인 http://www.sparkjava.com/으로 시작하려고합니다. 지시 사항은 Maven 종속성 (완료)으로 추가하도록 알려주지 만, mvn package 일 때 spark/Route에 대해 클래스 정의를 찾을 수 없습니다.스파크 자바와 클래스 패스

나는 Spark에서 내 classpath에없는 것으로 가정합니다. 어떻게 추가 할 수 있습니까? 그것은 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> 

편집이 : (홈페이지에서 예) 소스 aaaand

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

추적 :

λ 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 추가 공유하시기 바랍니다 가서

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

귀하의 응용 프로그램을 실행하는 데 실행할 수 있습니다! – 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 이름으로 답변을 업데이트했습니다 (현재 스파크 의존성 현재). – Will

10

는 실행 만들려면 : Heroku가에 응용 프로그램을 배포하려고 할 때 저도 같은 문제에 직면했다

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

. 내 POM.xml에 다음을 추가했습니다. 이 플러그인은 응용 프로그램에 종속 변수가 복사되도록합니다.

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

이 후에는