2015-10-23 22 views
1

昨天我問了一下,但這個沒有重複。編譯scala到裝有SBT或gradle的裝配罐

我可以使用sbt或gradle編譯helloworld,但是當涉及到其他對象時,我遇到了新問題。以下是我所做的任何人都可以告訴我如何解決它?

[email protected]:/usr/local/jars$ sudo mkdir Log 
 
[email protected]:/usr/local/jars$ cd Log 
 
[email protected]:/usr/local/jars/Log$ mkdir -p src/main/scala 
 
[email protected]:/usr/local/jars/Log$ mkdir -p src/main/resources 
 
[email protected]:/usr/local/jars/Log$ mkdir -p src/test/scala 
 
[email protected]:/usr/local/jars/Log$ mkdir -p src/test/resources 
 
[email protected]:/usr/local/jars/Log$ cd src/main/scala 
 
[email protected]:/usr/local/jars/Log/src/main/scala$ mkdir -p com/tong/gradle 
 
[email protected]:/usr/local/jars/Log/src/main/scala$ vi com/tong/gradle/Log.scala 
 

 
    
 
package org.apache.spark.h2o.utils 
 

 
import water.fvec.{NewChunk, Frame, Chunk} 
 
import water._ 
 

 
/** Transformation from double vector to log vector. */ 
 
class Log extends MRTask[Log] { 
 
    override def map(c: Chunk, nc: NewChunk): Unit = { 
 
    for (row <- 0 until c.len()) { 
 
    nc.addNum(Math.log(c.atd(row))) 
 
    } 
 
    } 
 
} 
 

 
    
 

 
[email protected]:/usr/local/jars/Log/src/main/scala$ cd ../../.. 
 
[email protected]:/usr/local/jars/Log$ vi build.gradle 
 

 
apply plugin: 'scala' 
 
    
 
jar { 
 
     baseName = 'tong' 
 
     version = '1.0' 
 
     manifest { 
 
        attributes 'Main-Class': 'com.tong.gradle.Log' } 
 

 
    } 
 
dependencies { 
 
    compile 'org.scala-lang:scala-library:2.10.4' 
 
} 
 

 
[email protected]:/usr/local/jars/Log$ gradle build 
 
:compileJava UP-TO-DATE 
 
:compileScala 
 

 
FAILURE: Build failed with an exception. 
 

 
* What went wrong: 
 
Could not resolve all dependencies for configuration ':compile'. 
 
> Could not find org.scala-lang:scala-library:2.10.4. 
 
    Required by: 
 
     :Log:unspecified 
 

 
* Try: 
 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 
 

 
BUILD FAILED 
 

 
Total time: 6.917 secs

或其也很大,如果你能告訴我怎麼做,在SBT謝謝!

回答

1

搖籃版本。爲了簡便起見,我改變Log.scala類:

package com.tong.gradle 

object Log { 
    def main(args: Array[String]) { 
     println("Hello, world!") 
    } 
} 

少了什麼在build.gradlerepositories塊 - gradle這個解決不了的依賴,這就是爲什麼發生這個錯誤:

Could not resolve all dependencies for configuration ':compile'. 

所以build.gradle腳本將是:

apply plugin: 'scala' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'org.scala-lang:scala-library:2.10.4' 
} 

jar { 
    baseName = 'tong' 
    version = '1.0' 
    manifest { 
     attributes 'Main-Class': 'com.tong.gradle.Log' 
    } 
} 

現在,如果你運行gradle clean build一切工作正常BU牛逼運行的jar:

cd build/libs 
java -jar tong-1.0.jar 

給出:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef$ at com.tong.gradle.Log$.main(Log.scala:5) at com.tong.gradle.Log.main(Log.scala) Caused by: java.lang.ClassNotFoundException: scala.Predef$ at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 2 more

也就是說。 jar的類路徑未配置。所以需要準備所謂的脂肪罐,它將包含運行時所需的所有依賴關係。要做到這一點在jar塊添加這種神奇的行

from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 

gradle clean build(注意罐子大小)再次和

cd build/libs 
java -jar tong-1.0.jar 

,輸出是:

Hello, world!

演示可以發現here

+0

在我從{configurations.pile.collect {it.isDirectory())添加之前?它:zipTree(it)}} gradle clean build很順利,爲我創建了一個jar。但是當我添加該行並重新構建時,我得到了這個 –

+0

tong @ tong-VirtualBox:/ usr/local/jars/Log $ gradle clean build :clean :compileJava UP-TO-DATE :compileScala :processResources UP- TO-DATE :類 :jar 使用toString()方法將類java.util.ArrayList轉換爲File文件已被棄用,並計劃在Gradle 2.0中刪除。請改用java.io.File,java.lang.String,java.net.URL或java.net.URI。 失敗:生成失敗並出現異常。 *出錯了: 無法將MANIFEST.MF複製到'/usr/local/jars/Log/build/tmp/jar/MANIFEST.MF'。 –

+0

你使用什麼版本的gradle? – Opal

4

sbt version。

$ mkdir project 
$ vi project/build.properties 

sbt.version=0.13.9 

$ vi project/plugins.sbt 

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.0") 

$ vi build.sbt 

name     := "tong" 
version    := "1.0" 
scalaVersion   := "2.10.6" 
mainClass in assembly := Some("com.tong.gradle.Log") 

$ sbt assembly 

或者,如果你不需要完全包含罐子包括斯卡拉庫只是要打包代碼:

$ sbt package 
+0

在哪一步我應該把我的Scala代碼? –

+0

那麼,在編譯或打包之前的任何一步;)也就是,第一步或在'sbt assembly' /'sbt package'之前。在編輯代碼時,您可以運行'sbt〜compile'來保持編譯器的正常運行,以便您可以立即跟蹤代碼中的錯誤。如果你的程序可以獨立運行,你只需要運行'sbt run'。 –

+1

tong @ tong-VirtualBox:/ usr/local/jars/project $ sbt assembly /usr/local/jars/project/build.sbt:4:error:not found:value assembly mainClass in assembly:= Some(「 com.tong.gradle。日誌「) ^ [error]表達式中的類型錯誤 項目加載失敗:(r)etry,(q)uit,(l)ast或(i)gnore?i [警告]忽略加載失敗:加載。 [錯誤]不是有效的命令:程序集 [error]程序集 [error]^ 我需要導入程序集嗎?謝謝 –