2014-08-28 31 views
5

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

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

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

+0

我相信你试图实现的是sbt-start-script的默认行为https://github.com/sbt/sbt-start-script#about-this-plugin-sbt-start-script – 2014-08-29 00:32:11

+2

@ Jhonny Everson这可能是,但是这个项目的'README'使我成为了sbt-native-packager。它说的第一件事(在一个非常大的标题下)是它可能被sbt-native-packager取代,这听起来好像现在采用它是一个坏主意,因为开发人员希望停止维护它。它还将sbt-native-packager描述为“更一般”,这表明插件可以做的任何事情,sbt-native-packager也可以做到。 – 2014-08-29 01:30:25

回答

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提供类似的设置。

+0

谢谢你的建议;我会试试看。问题:有没有什么办法可以防止我的文件(config/resource&bytecode/class)被压缩到jar中?那么类路径将保持不变,我可以保持原始脚本原样? – 2014-08-31 23:20:28

+0

实际上,这意味着类路径会改变(在打包的应用程序中),因为这些类将最终位于不同位置的目录中。另一种选择是通过例如添加系统属性。设置'bashScriptExtraDefines + =“”“addJava -Dmy.config.dir =”$(realpath“$ {app_home} /../ config”)“”“”'并在程序中读取它,但这需要一些额外的工作使“运行”命令可以很好地工作。 – Moritz 2014-08-31 23:42:04

+0

“,这意味着类路径会改变(在打包的应用程序中),因为这些类最终会位于不同位置的目录中。” 我会对如何做到这一点感兴趣:将所有文件(config和class文件)从任何jar文件中删除。 – 2014-09-01 03:14:13

相关问题