2014-08-28 6 views
5

Ich verwende das sbt-native-packager Plugin, um ein Startskript für meine Anwendung zu generieren, was sehr praktisch ist, da dieses Plugin die korrekte Classpath-Spezifikation mit all meinen Bibliotheksabhängigkeiten generiert. Ich verteile diese Anwendung nicht, deshalb verpacke ich das Ganze nicht in einen Tarball. Ich verwende einfach das Verzeichnis lib, das von sbt-native-packager generiert wurde und alle JAR-Dateien enthält, von denen mein Projekt abhängig ist, sowohl Bibliotheken von Drittanbietern als auch die JAR-Datei, die meine eigenen Klassen- und Ressourcendateien enthält.Wie kann ich dafür sorgen, dass sbt-native-packager meine Ressourcen nicht in eine JAR-Datei legt?

In meinem Projekt src/main/resources Verzeichnis Ich habe Dateien, die ich bearbeiten können, ohne sbt-native-Packager zu verwenden, um die gesamte Installation, z. B. Konfigurationsdateien neu zu generieren. Dies ist schwierig, da diese Dateien in der JAR-Datei mit allen meinen Klassen gezippt sind.

Frage: Wie kann ich dem sbt-native-packager mitteilen, meine Ressourcendateien nicht in eine JAR-Datei zu schreiben und trotzdem das Startskript mit dem korrekten Klassenpfad zu erzeugen, damit diese Ressourcendateien von meiner Anwendung gefunden und gelesen werden können wie sie jetzt aus der JAR-Datei sind? Wenn das bedeutet, alle meine Klassendateien aus einer JAR-Datei zu lassen, ist das in Ordnung, solange die Dateien von src/main/resources als Dateien verbleiben, die ich ohne erneutes Aufrufen ändern kann sbt stage und solange das Start-Skript funktioniert.

+0

Ich glaube, dass Sie versuchen zu erreichen, ist das Standardverhalten von sbt-start-Skript https://github.com/sbt/sbt-start-script#about-this-plugin-sbt-start-script –

+2

@ Jhonny Everson Das mag sein, aber es war die 'README' für dieses Projekt, das mich zum sbt-native-packager führte. Das erste, was es sagt (unter einer sehr großen Überschrift) ist, dass es durch sbt-native-packager ersetzt werden kann, was es klingt, als ob es eine schlechte Idee wäre, es jetzt zu übernehmen, da der Entwickler erwartet, es nicht mehr zu behalten. Es beschreibt auch sbt-native-packager als "allgemeiner", was darauf hindeutet, dass alles, was plugin tun kann, sbt-native-packager kann auch tun. –

Antwort

1

Während es möglich ist, diese Ressourcen zu filtern, würde ich vorschlagen, sie in ein anderes Verzeichnis zu setzen und sie dem Klassenpfad hinzuzufügen.

Das Ändern des von sbt-native-packager generierten Startskripts ist etwas umständlich, da die Klasse com.typesafe.sbt.packager.archetypes.JavaAppBashScript, die den Klassenpfad generiert, allen Pfaden $lib_dir/ voranstellt. Der sauberste Ansatz wäre wahrscheinlich, Ihre eigene Implementierung bereitzustellen und diese zu verwenden, um die bashScriptDefines zu generieren.

Ein einfacher, aber hacky Weg wäre, nur die folgenden Zeilen zu Ihrer build.sbt hinzufügen:

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) 

Diese $lib_dir/../config zu Ihrem Startskript des Classpath voranstellen wird. Wenn Ihre App unter Windows ausgeführt werden muss, müssen Sie ähnliche Einstellungen für die batScriptDefines bereitstellen.

+0

Vielen Dank für die Vorschläge; Ich werde sie ausprobieren. Frage: Gibt es einen Weg, nur zu verhindern, dass meine Dateien (config/resource & bytecode/class) in ein jar gezippt werden? Dann würde der Klassenpfad gleich bleiben und ich könnte das Start-Skript so lassen wie es ist? –

+0

Eigentlich würde das bedeuten, dass sich der Klassenpfad ändert (in der gepackten App), da die Klassen in einem Verzeichnis an einem anderen Ort landen würden. Eine andere Option wäre das Hinzufügen einer Systemeigenschaft durch z. Einstellung 'bashScriptExtraDefines + =" "" addJava -Dmy.config.dir = "$ (realpath" $ {app_home} /../ config ")" "" "und lesen Sie das in Ihrem Programm, aber das würde etwas zusätzliche Arbeit benötigen damit der Befehl 'run' funktioniert. – Moritz

+0

"das würde bedeuten, dass sich der Klassenpfad ändert (in der gepackten App), da die Klassen in einem Verzeichnis an einem anderen Ort landen würden." Ich wäre daran interessiert zu wissen, wie man das macht: alle meine Dateien (Config plus Class-Dateien) aus einer JAR-Datei. –

Verwandte Themen