使用SBT或gradle将scala编译为装配罐 [英] compile scala to assembly jar with SBT or gradle

查看:96
本文介绍了使用SBT或gradle将scala编译为装配罐的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我昨天问过这个问题,但是没有重复.

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆