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