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或沿着這些線路。
無論如何,只是爲了驗證:我的設置有什麼問題?
我肯定錯過了這一點的設置。 – tutuca
mmm ...現在看起來不是從環境中選擇正確的路徑:https://dpaste.de/yThN – tutuca
您需要將正確的類路徑傳遞給'java'命令('-cp ... ')。至少,類路徑將需要包含Scala和Scalding Jar(s)。 Gradle的''application'插件將爲您處理這個問題。 'java'命令對'SCALA_LIBRARY_PATH'沒有任何瞭解。 (也許'scala'命令可以,但是你仍然需要提供Scalding Jar,還有可能還有其他Jars。)如果你想創建一個自包含的可執行文件Jar,請查看'gradle-one-jar '插件。 –