有没有办法告诉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部署定制的装配任务.你可以根据自己的需要调整它.
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)