如何让sbt-native-packager避免将我的资源放入jar文件中?

时间:2014-08-28 23:39:54

标签: scala classpath sbt-native-packager

我正在使用sbt-native-packager插件为我的应用程序生成一个启动脚本,这非常方便,因为这个插件生成了包含所有库依赖项的正确类路径规范。我没有分发这个应用程序,因此我没有把整个东西打包成一个tarball。我只使用sbt-native-packager生成的lib目录,其中包含我的项目所依赖的所有jar文件,包括第三方库以及包含我自己的类和资源文件的jar文件

在我的项目的src/main/resources目录中,我有一些文件,我希望能够编辑而无需使用sbt-native-packager重新生成整个安装,例如配置文件。这很困难,因为这些文件都是在我的所有类的jar文件中压缩的。

问题:如何告诉sbt-native-packager不要将我的资源文件放入jar文件,同时仍然生成具有正确类路径的启动脚本,以便我的应用程序找到并读取这些资源文件它们现在来自jar文件?如果这意味着将所有类文件保留在一个很好的jar文件之外,只要src/main/resources中的文件保留为我可以更改的文件,而无需重新调用sbt stage并且只要开始-script有效。

1 个答案:

答案 0 :(得分:1)

虽然可以过滤这些资源,但我建议将它们放入不同的目录并将它们添加到类路径中。

修改sbt-native-packager生成的启动脚本有点麻烦,因为生成类路径的类com.typesafe.sbt.packager.archetypes.JavaAppBashScript在所有路径前加$lib_dir/。最干净的方法可能是提供您自己的实现并使用它来生成bashScriptDefines

一种更简单但更黑巧的方法是将以下几行添加到build.sbt

packageArchetype.java_server

// add your config files to the classpath for running inside sbt
unmanagedClasspath in Compile += Attributed.blank(sourceDirectory.value/"main"/"config")

// map all files in src/main/config to config in the packaged app
mappings in Universal ++= {
  val configDir = sourceDirectory.value/"main"/"config"
  for {
    file <- (configDir ** AllPassFilter).get
    relative <- file.relativeTo(configDir.getParentFile)
    mapping = file -> relative.getPath
  } yield mapping
}

scriptClasspath ~= (cp => "../config" +: cp)

这会将$lib_dir/../config添加到启动脚本的类路径中。如果您的应用必须在Windows上运行,则必须为batScriptDefines提供类似的设置。