2014-08-28 12 views
5

Sto utilizzando il plug-in sbt-native-packager per generare uno script di avvio per la mia applicazione, il che è molto comodo in quanto questo plugin genera la specifica del classpath corretta con tutte le dipendenze della mia libreria. Non sto distribuendo questa applicazione, quindi non sto impacchettando l'intera cosa in un unico tarball. Io uso solo la directory lib generata da sbt-native-packager che contiene tutti i file jar da cui dipende il mio progetto, sia le librerie di terze parti che il file jar che contiene i miei file di classe e risorse.Come impedire a sbt-native-packager di mettere le mie risorse in un file jar?

Nella directory src/main/resources del mio progetto sono presenti file che desidero essere in grado di modificare senza dover utilizzare sbt-native-packager per rigenerare l'intera installazione, ad esempio i file di configurazione. Questo è difficile perché questi file sono compressi nel file jar con tutte le mie classi.

Domanda: come posso dire a sbt-native-packager di non mettere i miei file di risorse in un file jar, mentre sto ancora generando lo script di inizio con il classpath corretto per quei file di risorse da localizzare e leggere dalla mia applicazione come sono ora all'interno del file jar? Se questo significa lasciare tutti i miei file di classe fuori da un file jar, va bene, purché i file da src/main/resources rimangano come file che posso cambiare senza richiamare sbt stage e finché funziona lo script di avvio.

+0

Credo che si stia cercando di ottenere il comportamento predefinito di sbt-start-script https://github.com/sbt/sbt-start-script#about-this-plugin-sbt-start-script –

+2

@ Jhonny Everson Questo potrebbe essere, ma è stato il "README" per quel progetto che mi ha portato a sbt-native-packager. La prima cosa che dice (sotto un titolo molto grande) è che potrebbe essere sostituito da sbt-native-packager, il che lo rende come se fosse una cattiva idea adottarlo ora poiché lo sviluppatore si aspetta di smetterla di mantenerlo. Descrive anche "packt-native-packager" come "più generale", il che suggerisce che tutto ciò che il plugin può fare, può anche fare sbt-native-packager. –

risposta

1

Mentre è possibile filtrare queste risorse, suggerirei di inserirle in una directory diversa e aggiungerle al classpath.

La modifica dello script di avvio generato da sbt-native-packager è un po 'macchinosa in quanto la classe com.typesafe.sbt.packager.archetypes.JavaAppBashScript che genera il classpath ha come prefisso tutti i percorsi con $lib_dir/. L'approccio più pulito sarebbe probabilmente quello di fornire la propria implementazione e utilizzarla per generare lo bashScriptDefines.

Un modo più semplice, ma hacky sarebbe quella di aggiungere solo le seguenti righe al 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) 

Ciò anteporre $lib_dir/../config al classpath del vostro script di avvio. Se la tua app deve essere eseguita su Windows, dovrai fornire impostazioni simili per lo batScriptDefines.

+0

Grazie per i suggerimenti; Li proverò. Domanda: esiste un modo solo per impedire che i miei file (config/resource & bytecode/class) vengano compressi in un jar? Quindi il classpath rimarrebbe lo stesso e potrei lasciare lo script di avvio così com'è? –

+0

In realtà ciò significherebbe che il classpath cambia (nell'app pacchettizzata) poiché le classi finirebbero in una directory in una posizione diversa. Un'altra opzione potrebbe essere quella di aggiungere una proprietà di sistema, ad es. setting 'bashScriptExtraDefines + =" "" addJava -Dmy.config.dir = "$ (realpath" $ {app_home} /../ config ")" "" "' e lo legge nel tuo programma ma che avrebbe bisogno di un po 'di lavoro extra per far funzionare correttamente il comando 'run'. – Moritz

+0

"significherebbe che le modifiche al percorso di classe (nell'app pacchettizzata) quando le classi finirebbero in una directory in una posizione diversa." Sarei interessato a sapere come farlo: lasciando tutti i miei file (config plus file di classe) da qualsiasi file jar. –

Problemi correlati