我正在使用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有效。
答案 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
提供类似的设置。