有没有办法告诉sbt将所有需要的库(scala-library.jar)打包到主包中,所以它是独立的? (静态?)
答案 0 :(得分:14)
编辑2011:
从那时起,retronym(发布了answer in this page back in 2010),sbt-plugin "sbt-onejar",现在位于new address on GitHub,其中包含针对SBT 0.12更新的文档。
使用One-JAR™
打包您的项目
onejar-sbt
是一个简单的构建工具插件,用于构建包含所有代码和依赖关系作为嵌套JAR的单个可执行JAR。 目前使用的是One-JAR版本0.9.7。这包含在插件中,无需单独下载。
原始答案:
直接地,如果没有在custom action的模型之后扩展sbt("package" sbt action),这是不可能的。
GitHub mentions an assembly task,为码头部署而定制。你可以根据自己的需要调整它。
code is pretty generic(来自this post和用户Rio):
project / build / AssemblyProject.scala
import sbt._
trait AssemblyProject extends BasicScalaProject
{
def assemblyExclude(base: PathFinder) = base / "META-INF" ** "*"
def assemblyOutputPath = outputPath / assemblyJarName
def assemblyJarName = artifactID + "-assembly-" + version + ".jar"
def assemblyTemporaryPath = outputPath / "assembly-libs"
def assemblyClasspath = runClasspath
def assemblyExtraJars = mainDependencies.scalaJars
def assemblyPaths(tempDir: Path, classpath: PathFinder, extraJars: PathFinder, exclude: PathFinder => PathFinder) =
{
val (libs, directories) = classpath.get.toList.partition(ClasspathUtilities.isArchive)
for(jar <- extraJars.get ++ libs) FileUtilities.unzip(jar, tempDir, log).left.foreach(error)
val base = (Path.lazyPathFinder(tempDir :: directories) ##)
(descendents(base, "*") --- exclude(base)).get
}
lazy val assembly = assemblyTask(assemblyTemporaryPath, assemblyClasspath, assemblyExtraJars, assemblyExclude) dependsOn(compile)
def assemblyTask(tempDir: Path, classpath: PathFinder, extraJars: PathFinder, exclude: PathFinder => PathFinder) =
packageTask(Path.lazyPathFinder(assemblyPaths(tempDir, classpath, extraJars, exclude)), assemblyOutputPath, packageOptions)
}
答案 1 :(得分:6)
这需要一些工作,但您也可以在SBT中使用Proguard来创建一个独立的JAR。
我最近在SBT build for Scalala中做了这个。
答案 2 :(得分:0)
使用上面提供的@retronym,我构建了一个simple example,它构建了一个独立的jar,其中包含使用Proguard和sbt的Scala库(即scala-library.jar)。谢谢,反义词。
答案 3 :(得分:0)
使用文件assembly.sbt(包括
)在主项目目录中创建目录项目addSbtPlugin(“com.eed3si9n”%“sbt-assembly”%“0.11.2”)
在文件build.sbt
中导入AssemblyKeys._ //将其放在文件的顶部
assemblySettings
jarName + =“Mmyjarnameall.jar”
libraryDependencies ++ = Seq(“exmpleofmydependency%”mydep“%”0.1“)
汇编中的mergeStrategy&lt;&lt; =(汇编中的mergeStrategy){(旧)=&gt;
{
案例s如果s.endsWith(“。class”)=&gt; MergeStrategy.last
案例s如果s.endsWith(“pom.xml”)=&gt; MergeStrategy.last
案例s如果s.endsWith(“pom.properties”)=&gt; MergeStrategy.last
案例x =&gt;旧的(x)的
}
}
答案 4 :(得分:0)
最简单的方法就是从命令行创建jar。如果您不知道如何做到这一点,我强烈建议您这样做。自动化很有用,但如果您知道自动化正在做什么,那就更好了。
自动创建可运行jar的最简单方法是在windows中使用bash脚本或批处理脚本。
sbt中最简单的方法就是将所需的Scala库添加到资源目录中:
unmanagedResourceDirectories in Compile := Seq(file("/sdat/bins/ScalaCurrent/lib/scalaClasses"))
因此在我的环境中,ScalaCurrent是当前Scala库的链接。 2.11.4撰写本文时。关键是我提取Scala库但将其放在ScalaClassses目录中。每个提取的库都需要进入其顶级目录。