代码之家  ›  专栏  ›  技术社区  ›  Łukasz Lew

用简单的构建工具制作独立jar

  •  23
  • Łukasz Lew  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  14
  •   Community Mohan Dere    6 年前

    编辑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。
    目前使用的是一个JAR版本0.9.7。这是随插件提供的,不需要单独下载。


    原始答案:

    直接而言,如果不扩展sbt(a custom action "package" sbt action

    GitHub mentions an assembly task ,为码头部署定制。不过,你可以根据自己的需要进行调整。

    code is pretty generic (来自 this post

     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)
     }
    
        2
  •  6
  •   retronym    16 年前

    这需要一点工作,但你也可以使用 Proguard

    我最近做了这个 SBT build for Scalala

        3
  •  0
  •   Leif Wickland    15 年前

    根据@retronym提供的信息,我构建了一个 simple example

        4
  •  0
  •   Arkadiusz Bicz    11 年前

    最简单的例子是 sbt-assembly

    1. 使用文件assembly.sbt在主项目目录中创建目录项目,包括

      添加sbtplugin(“com.eed3si9n“%”sbt assembly“%”0.11.2)

    2. 在文件build.sbt中

      导入AssemblyKeys。\把它放在文件的顶部

      程序集设置

      jarName+=“Mmyjarnameall.jar”

      libraryDependencies++=Seq(“exampleofMyDependency%”mydep“%”0.1“)

      {

      如果s.endsWith(“.class”)=>合并策略.last

      如果s.endsWith(“pom.xml”)=>合并策略.last

      案例x=>旧(x)

        5
  •  0
  •   Rich Oliver    11 年前

    自动创建可运行jar的最简单方法是在windows中使用bash脚本或批处理脚本。

    unmanagedResourceDirectories in Compile := Seq(file("/sdat/bins/ScalaCurrent/lib/scalaClasses"))