Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SBT或gradle将scala编译成程序集jar_Scala_Gradle - Fatal编程技术网

使用SBT或gradle将scala编译成程序集jar

使用SBT或gradle将scala编译成程序集jar,scala,gradle,Scala,Gradle,我昨天问过,但这一次没有重复 我可以使用sbt或gradle编译helloworld,但是当涉及到其他对象时,我遇到了新的问题。下面是我所做的,谁能告诉我如何修复它 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@t

我昨天问过,但这一次没有重复

我可以使用sbt或gradle编译helloworld,但是当涉及到其他对象时,我遇到了新的问题。下面是我所做的,谁能告诉我如何修复它


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-pcom/tong/gradle
tong@tong-VirtualBox:/usr/local/jars/Log/src/main/scala$vi com/tong/gradle/Log.scala 包org.apache.spark.h2o.utils 导入water.fvec.{NewChunk,Frame,Chunk} 进口水_ /**从双向量到对数向量的转换*/ 类日志扩展MRTask[Log]{ 覆盖def映射(c:Chunk,nc:NewChunk):单位={ for(行)找不到org.scala lang:scala library:2.10.4。 要求: :日志:未指定 *尝试: 使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。 构建失败 总时间:6.917秒
sbt版本

$ 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
或者,如果您不需要包含scala库的完整jar,但只想打包代码:

$ sbt package

Gradle版本。为了简单起见,我将
Log.scala
class更改为:

package com.tong.gradle

object Log {
   def main(args: Array[String]) {
      println("Hello, world!")
   }
}
build.gradle
中缺少的是
repositories
block-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
一切正常,但运行jar:

cd build/libs
java -jar tong-1.0.jar
给出:

线程“main”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$at 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)位于 loadClass(ClassLoader.java:424)位于 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)位于 java.lang.ClassLoader.loadClass(ClassLoader.java:357)…还有2个

也就是说,jar的类路径没有配置。因此需要准备所谓的fat jar,它将包含运行时所需的所有依赖项。要做到这一点,请在
jar
块中添加这一神奇的行

from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
gradle clean build
(注意jar大小)再次

cd build/libs
java -jar tong-1.0.jar
输出为:

你好,世界


可以找到演示。

在编译或打包之前的任何步骤中;)也就是说,第一步或在
sbt汇编
/
sbt包
之前。您可以运行
sbt~compile
,在编辑代码时保持编译器运行,这样您就可以立即跟踪代码中的错误。如果您的程序可以自行运行,则只需运行
sbt
。tong@tong-VirtualBox:/usr/local/jars/project$sbt assembly/usr/local/jars/project/build.sbt:4:错误:未找到:程序集中的值assembly mainClass:=Some(“com.tong.gradle.Log”)^[error]表达式中的类型错误项目加载失败:(r)etry,(q)uit,(l)ast或(i)gnore?i[warn]忽略加载失败:未加载项目。[错误]无效命令:assembly[错误]程序集[错误]^我需要导入程序集吗?感谢sbt程序集插件提供了程序集任务,而sbt程序集插件又通过显示在
project/plugins.sbt
中的代码段激活(可能您缺少该程序集)。如果您想构建一个包含类路径的自包含jar,您只需要汇编。如果您只想运行
sbt
,您可以在Compile中使用
mainClass,而不用考虑sbt汇编插件。从您的问题中可以看出,您需要该插件。在我从{configurations.Compile.collect>添加之前{it.isDirectory()?it:zipTree(it)}GradleClean构建进行得很顺利,为我创建了一个jar。但当我添加这一行并再次构建时,我得到了thistong@tong-VirtualBox:/usr/local/jars/Log$gradle clean build:clean:compileJava-update:compileScala:processResources-update:classes:jar使用toString()将类java.util.ArrayList转换为文件方法已被弃用,并计划在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”。您使用的Gradle的哪个版本?Gradle 1.4------------------------------------------------------------Gradle构建时间:2013年9月9日星期一晚上8:44:25 UTC Groovy:1.8.6 Ant:ApacheAnt(TM)版本1.9.3于2014年4月8日编译Ivy:非官方版本JVM:1.7.079(Oracle Corporation 24.79-b02)OS:Linux 3.19.0-30-generic AMD64我已经用Gradle 2.8对其进行了测试。