2014-08-28 81 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