2014-04-16 58 views
1

在工作中,我們在Scalding項目上使用gradle,並且試圖拿出最簡單的工作來將手伸出堆棧。Gradle內置的jar沒有找到我的主類

我的類看起來如下:

package org.playground 

import com.twitter.scalding._ 

class readCsv(args: Args) extends Job(args) { 

    val csv:Csv = Csv(args("input"), ("firstName", "lastName")) 
    println(csv) 
} 

和生活in playground/src/org/playground/readCsv.scala。我的構建腳本是這樣的:

apply plugin: 'scala' 

archivesBaseName = 'playground' 

mainClassName = 'org.playground.readCsv' 

repositories { 
    mavenLocal() 
    mavenCentral() 
    maven{ 
     url 'http://conjars.org/repo/' 
     artifactUrls 'http://clojars.org/repo/‎' 
     artifactUrls 'http://maven.twttr.com/' 
    } 
} 

dependencies { 

    compile 'org.scala-lang:scala-compiler:2.9.2' 
    compile 'org.scala-lang:scala-library:2.9.2' 
    compile 'bixo:bixo-core:0.9.1' 
    compile 'org.apache.hadoop:hadoop-core:1.2.1' 
    compile 'com.twitter:scalding_2.9.2:0.8.1' 
    compile 'cascading:cascading-core:2.1.6' 
    compile 'cascading:cascading-hadoop:2.1.6' 
    testCompile 'org.testng:testng:6.8.7' 
    testCompile 'org.scala-tools.testing:specs:1.6.2.2_1.5.0' 
} 

test { 
    useTestNG() 
} 

jar { 
    description = "Assembles a Hadoop-ready JAR file" 
    manifest { 
    attributes("Main-Class": "org.playground.readCsv") 
    } 
} 

這編譯成功,但嘗試運行jar構建引發此錯誤:

$ java -jar build/libs/playground.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: org/playground/readCsv 
Caused by: java.lang.ClassNotFoundException: org.playground.readCsv 
    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) 

我的猜測是,具有工作從Job延長不符合一些約定,並不像一個有效的主要類,但我不會指望它抱怨沒有找到它。

其他可能性是,運行它爲java -jar jarname是不正確的,我只需要運行hadoop或沿着這些線路。

無論如何,只是爲了驗證:我的設置有什麼問題?

回答

3

源文件位於錯誤的位置。默認情況下,它需要進入src/main/scala/org/playground/readCsv.scala。否則,它甚至不會被編譯。

+0

我肯定錯過了這一點的設置。 – tutuca

+0

mmm ...現在看起來不是從環境中選擇正確的路徑:https://dpaste.de/yThN – tutuca

+0

您需要將正確的類路徑傳遞給'java'命令('-cp ... ')。至少,類路徑將需要包含Scala和Scalding Jar(s)。 Gradle的''application'插件將爲您處理這個問題。 'java'命令對'SCALA_LIBRARY_PATH'沒有任何瞭解。 (也許'scala'命令可以,但是你仍然需要提供Scalding Jar,還有可能還有其他Jars。)如果你想創建一個自包含的可執行文件Jar,請查看'gradle-one-jar '插件。 –