使用SBT或gradle将scala编译为装配罐 [英] compile scala to assembly jar with SBT or gradle
问题描述
我昨天问过这个问题,但是没有重复.
I asked about it yesterday, but this one is not duplicated.
我可以使用sbt或gradle来编译helloworld,但是当涉及到其他对象时,我遇到了新的问题.以下是我所做的事情,谁能告诉我该如何解决?
I can use sbt or gradle to compile helloworld, however when it comes to some other object, I have new problems. Following is what I did can anyone tell me how to fix it?
tong@tong-VirtualBox:/usr/local/jars$ sudo mkdir Log
tong@tong-VirtualBox:/usr/local/jars$ cd Log
tong@tong-VirtualBox:/usr/local/jars/Log$ mkdir -p src/main/scala
tong@tong-VirtualBox:/usr/local/jars/Log$ mkdir -p src/main/resources
tong@tong-VirtualBox:/usr/local/jars/Log$ mkdir -p src/test/scala
tong@tong-VirtualBox:/usr/local/jars/Log$ mkdir -p src/test/resources
tong@tong-VirtualBox:/usr/local/jars/Log$ cd src/main/scala
tong@tong-VirtualBox:/usr/local/jars/Log/src/main/scala$ mkdir -p com/tong/gradle
tong@tong-VirtualBox:/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)))
}
}
}
tong@tong-VirtualBox:/usr/local/jars/Log/src/main/scala$ cd ../../..
tong@tong-VirtualBox:/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'
}
tong@tong-VirtualBox:/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进行操作,它也很棒,谢谢!
Or its also great if you can tell me how to do it in SBT Thanks!
推荐答案
版本版本.为了简单起见,我将Log.scala
类更改为:
Gradle version. For the sake of simplicity I've changed Log.scala
class to:
package com.tong.gradle
object Log {
def main(args: Array[String]) {
println("Hello, world!")
}
}
build.gradle
中缺少的是repositories
块-gradle无法解析依赖关系,这就是发生此错误的原因:
What was missing in build.gradle
was repositories
block - gradle couldn't resolve the dependencies, that's why this error occurred:
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
,则一切正常,但运行jar:
Now if you run gradle clean build
everything works fine but running the jar:
cd build/libs
java -jar tong-1.0.jar
给予:
线程主"中的异常java.lang.NoClassDefFoundError: scala/Predef $位于com.tong.gradle.Log $ .main(Log.scala:5) com.tong.gradle.Log.main(Log.scala)由以下原因引起: java.lang.ClassNotFoundException:scala.Predef $在 java.net.URLClassLoader $ 1.run(URLClassLoader.java:372)在 java.net.URLClassLoader $ 1.run(URLClassLoader.java:361)在 java.security.AccessController.doPrivileged(本机方法),位于 java.net.URLClassLoader.findClass(URLClassLoader.java:360)在 java.lang.ClassLoader.loadClass(ClassLoader.java:424)在 sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)...还有2个
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的类路径.因此,有必要准备一个所谓的 fat jar ,其中将包含运行时所需的所有依赖项.为此,请在jar
块中添加此魔术线
That is. The classpath for jar isn't configured. So there's a need to prepare so called fat jar that will include all the dependencies required at runtime. To do it add this magic line in jar
block
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
gradle clean build
(注意罐子的大小),然后再次
gradle clean build
(notice the jar size) once again and
cd build/libs
java -jar tong-1.0.jar
,输出为:
你好,世界!
Hello, world!
可以在此处找到演示.
这篇关于使用SBT或gradle将scala编译为装配罐的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!