使用Simple Build Tool制作独立jar

Łuk*_*Lew 23 scala sbt

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

Von*_*onC 14

编辑2011:
从那以后,retronym(在2010年在这个页面上发布了一个答案),使这个sbt-plugin"sbt-onejar",现在在GitHub上的新地址,更新了SBT 0.12的文档.

使用One-JAR™打包您的项目

onejar-sbt是一个简单的构建工具插件,用于构建包含所有代码和依赖关系作为嵌套JAR的单个可执行JAR.
目前使用的是One-JAR版本0.9.7.这包含在插件中,无需单独下载.


原始答案:

直接地,如果没有扩展sbt(在"package"sbt动作的模型之后的自定义动作),这是不可能的.

GitHub提到了一个为jetty部署定制的装配任务.你可以根据自己的需要调整它.

代码是非常通用的(从这个职位,并且用户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)
 }
Run Code Online (Sandbox Code Playgroud)

  • imho它应该是.我已经成功使用了这个AssemblyProject的略微修改版本几个月了.它将在重复文件上失败(如果你有一个带有子项目的复杂项目,那么需要注意),并且将使用最新版本的hibernate失败(hibernate包含一些导致它悲伤的奇怪的zip条目). (3认同)
  • 有用.但它不应该建立在SBT之中吗? (2认同)

ret*_*nym 6

这需要一些工作,但您也可以在SBT中使用Proguard来创建独立的JAR.

我最近在ScalalaSBT版本中做到了这一点.