使用Simple Build Tool制作独立jar

时间:2010-05-22 09:59:37

标签: scala sbt

有没有办法告诉sbt将所有需要的库(scala-library.jar)打包到主包中,所以它是独立的? (静态?)

5 个答案:

答案 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)

使用sbt-assembly

的最简单示例
  1. 使用文件assembly.sbt(包括

    )在主项目目录中创建目录项目

    addSbtPlugin(“com.eed3si9n”%“sbt-assembly”%“0.11.2”)

  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目录中。每个提取的库都需要进入其顶级目录。