Ada*_*ler 5 scala classpath sbt-native-packager
我正在使用sbt-native-packager插件为我的应用程序生成一个启动脚本,这非常方便,因为这个插件生成了包含所有库依赖项的正确类路径规范.我没有分发这个应用程序,因此我没有把整个东西打包成一个tarball.我只使用libsbt-native-packager生成的目录,其中包含我的项目所依赖的所有jar文件,包括第三方库以及包含我自己的类和资源文件的jar文件.
在我的项目src/main/resources目录中,我有一些文件,我希望能够编辑,而不必使用sbt-native-packager重新生成整个安装,例如配置文件.这很困难,因为这些文件在我的所有类的jar文件中都被压缩了.
问题:如何告诉sbt-native-packager不要将我的资源文件放入jar文件中,同时仍然生成具有正确类路径的启动脚本,以便我的应用程序找到并读取这些资源文件,因为它们现在是从jar文件中?如果这意味着将所有类文件保留在一个好的jar文件中,只要文件src/main/resources保留为我可以更改的文件,而无需重新调用sbt stage,只要启动脚本有效.
虽然可以过滤这些资源,但我建议将它们放入不同的目录并将它们添加到类路径中。
修改 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)
Run Code Online (Sandbox Code Playgroud)
这将添加$lib_dir/../config到启动脚本的类路径之前。如果您的应用程序必须在 Windows 上运行,您将必须为batScriptDefines.