2014-08-28 18 views
5

Uygulamam için bir başlangıç ​​komut dosyası oluşturmak için sbt-native-packager eklentisini kullanıyorum; bu eklenti, tüm kitaplık bağımlılıklarım ile doğru sınıf yolu belirtimi oluşturduğundan çok kullanışlıdır. Bu başvuruyu dağıtmıyorum, bu yüzden tüm şeyi bir tarbota ambalajlamam. Projemin bağlı olduğu tüm jar dosyalarını, hem üçüncü taraf kitaplıklarını hem de kendi sınıf ve kaynak dosyalarımı içeren jar dosyasını içeren sbt-native-packager tarafından oluşturulan lib dizinini kullanıyorum.Sbt-native-packager, kaynaklarımı bir jar dosyasına yerleştirmekten nasıl kaçınır?

Projemin src/main/resources dizininde, tüm yüklemeyi, örneğin yapılandırma dosyalarını yeniden oluşturmak için sbt-native-packager kullanmadan düzenleme yapmak istediğim dosyalarım var. Bu zor çünkü bu dosyalar tüm sınıflarımdaki jar dosyasına sıkıştırılmış.

Soru: Sbt-native-packager'a, kaynak dosyalarımı bir jar-dosyasına koymamayı nasıl söyleyeceğim, yine de başlangıç ​​kaynak kodunun, bu kaynak dosyaların benim uygulama tarafından bulunup okunması için doğru sınıf yoluna sahip olmasını sağlarım Şimdi kavanoz dosyasından mı oldukları? Bu, tüm sınıf dosyalarımı, src/main/resources dosyaları sbt stage yeniden başlatmadan ve başlatma komut dosyası çalıştığında değiştirebildiğim dosyalar olarak kaldığı sürece, ince olan bir jar dosyası dışında kalması anlamına gelir.

+0

Sbt-start komut dosyasının varsayılan davranışı olan https://github.com/sbt/sbt-start-script#about-this-plugin-sbt-start-script –

+2

@ 'in varsayılan davranışı olduğunu düşünüyorum. Jhonny Everson Olabilir, ama beni sbt-native-packager'a götüren bu proje için "README" idi. Söylediği ilk şey (çok büyük bir başlık altında), geliştiricinin bunu korumayı bırakmayı beklediği için onu benimsemenin kötü bir fikri gibi ses çıkarmasını sağlayan sbt-native-packager ile değiştirilebilmesi. Ayrıca sbt-native-packager'ı "daha genel" olarak tanımlar, bu da eklentinin yapabileceği herhangi bir şeyi, sbt-native-paketleyicinin de yapabileceğini gösterir. –

cevap

1

Bu kaynakları filtrelemek mümkün olsa da, bunları farklı bir dizine koyup sınıf yoluna eklemenizi öneririm.

sbt-native-packager tarafından oluşturulan start komut dosyasının değiştirilmesi, com.typesafe.sbt.packager.archetypes.JavaAppBashScript sınıfının, $lib_dir/ ile tüm yolları ön eklediği sınıf olarak biraz hantaldır. En temiz yaklaşım muhtemelen kendi uygulamanızı sağlamak ve bashScriptDefines'u oluşturmak için kullanmak olacaktır.

Daha basit ama hacky yolu sadece senin build.sbt aşağıdaki satırları ekleyin olacaktır:

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) 

Bu başlangıç ​​komut dosyasının sınıf için $lib_dir/../config Önlerine edecektir. Uygulamanızın Windows'da çalışması gerekiyorsa, batScriptDefines için benzer ayarları sağlamalısınız.

+0

Öneriler için teşekkür ederiz; Onları deneyeceğim. Soru: Dosyalarımın (config/resource & bytecode/class) bir kavanoza sıkıştırılmasını önlemek için herhangi bir yol var mı? Sonra sınıf yolu aynı kalacaktı ve başlangıç ​​senaryosunu olduğu gibi bırakabiliyordum. –

+0

Aslında bu, sınıf yolunun (paketli uygulamada) sınıflar olarak değişeceği anlamına gelir, farklı bir konumda bir dizinde yer alır. Diğer bir seçenek, ör. bashScriptExtraDefines + = "" "addJava -Dmy.config.dir =" $ (realpath "$ {app_home} /../ config") "" "" 'yi ayarlayın ve programınızda bunu okuyun fakat bu biraz fazladan çalışmaya ihtiyaç duyacaktır 'run' komutunun bununla güzel çalışmasını sağlamak. – Moritz

+0

"Bu, sınıf yolunun (paketlenmiş uygulamada) sınıflar olarak değişeceği anlamına gelir, farklı bir konumda bir dizinde yer alır." Bunu nasıl yapacağımı bilmek isterdim: tüm dosyalarımı (config plus sınıf dosyaları) herhangi bir jar dosyasının dışına bırakmak. –

İlgili konular