2012-01-20 18 views
8

Bir OSGi ortamında (Scala 2.9.1) çalışma zamanında şablonları derlemek için bir Scala şablonu motoru (Scalate) kullanıyorum. Şablonlar, dinamik olarak oluşturuldukları için önceden derlenemezler.Bir OSGi çalışma zamanında çalışmak için scala derleyicisini alma

Bunun çalışması için, Scala derleyicisinin OSGi ortamında çalışması gerekir. Ancak, Scala derleyicisi giriş olarak bir classloader alamıyor, bu kutunun dışında çalışmaz. Benim araştırma

, iki genel çözüm yaklaşımları olduğu görülmektedir.

1) skala derleyici eklenti (there is one started here ama 2009 yılından beri dokunulmaz değildir ve messages on the scala list in 2009 üretim kullanıma hazır değildi belirtti

2) Scala derleyicisinin kullanabileceği, paket bağlamının üstünde bir sanal dosya sistemi oluşturmak. Görünüşe göre Apache sling adamları, bu yaklaşımı Scala'nın eski bir sürümünde successfully kullanıyor.

Şablonları dinamik olarak derlemek için Scalate, Scala 2.9.1 ve OSGi'yi birlikte çalışmak isteyen var mı?

+1

Apache Sling'in Scala komut dosyası motoru https://github.com/guggla/guggla adresindeki kendi evine taşındı. Şu anda Scala 2.9'da bulunuyor, ancak 2.9.1 ile çalışması çok zor olmamalı. Daha fazla bilgi için oturum slaytlarım http://people.apache.org/~mduerig/scala4sling/ ve http://people.apache.org/~mduerig/scala4scripting/ – michid

+0

'a bakın. Michid: Mükemmel, bağlantılar için teşekkürler. Daha fazla araştırır. – Raman

cevap

3

Ekibim şimdi, OSGi içinde Scalate için Scala derleme ve yürütme işlemine sahip.

Genel olarak, ScalaCompiler ayarlarının, ilgili OSGi paketlerine karşılık gelen bir dizi AbstractFile nesnesi bulunmalıdır. Bu, @michid tarafından referans olarak Guggla tarafından desteklenmektedir. Ancak Guggla, AbstractFile katmanını sağlarken, bir OSGi ortamında SoyutDosya örneklerinin nasıl oluşturulacağı konusunda henüz bir örnek veya kod sağlamamaktadır. Bunu yapmak için örnek kod, Sling projesinde (Guggla'nın menşeinin kendisi) ve Scalate projesinde bulunabilir (bkz. ScalaCompiler).

ServiceMix projesinden OSGi-ified scala demetleri (compiler ve library) seçtik. Scala-derleyici paketindeki issue SMX-1048 (with patch).

Asıl amacımız Scalate'de çalışmayı sağlamaktı ve bu cevabın geri kalanı bu projeye özgüdür.

Scalate kodunda, derleyici sınıf yolunun yanı sıra sanal AbstractFile katmanı da dahil olmak üzere OSGi ortamında çalışmak için gereken mantığın çoğu zaten vardı.

1) ScalaCompiler sınıfının OsgiCompiler geçersiz kılma düzgün etkinleştirilen değildi ve bu yüzden derleyicisi sınıf yolu girdi olarak algılanan değildi paket ve

: Ancak Çalıştırmak için ( https://github.com/scalate/scalate/pull/16) Scalate yama gerekli

2) Şablon yürütme (çalışma zamanı) sınıf yükleyicisi, skalat-çekirdek paketinin sınıf yükleyicisine ayarlandı, bu da çalışma zamanında CNFE'ye neden oldu.

Yukarıdaki istek talebi, çalışma zamanında iş parçacığı sınıf yükleyicisine varsayılan olarak bir OSGi ortamında Scalate yapılandırır. Bu, arayanın açıkça enjekte etmesi gerekmeden arayanın sınıf yükleyicisine bir referans almanın en kolay yolu gibi görünmektedir (örneğin, bir şablon hizmeti veren bir Spring-DM osgi:service beyanı, otomatik olarak ayarlamak için context-class-loader="service-provider" özniteliğini kullanabilir. Scalate OSGi'nin çalışma zamanı davranışı, zaten TCCL'yi kullanan mevcut derleme zamanı davranışına karşılık gelir. Bu nedenle, bir Scalate arayıcısı, TCCL'yi kendi sınıf yükleyicisine ayarlamalı veya istenen sınıf yükleyiciyi şablon motoruna açıkça enjekte etmelidir. Şablonu yürütmeden önce templateEngine.classLoader = ...

31-Ağustos-2012 Güncelleştirmesi: Scalate master artık bu yazımda belirtilen tüm yamaları içerir.

10-Nisan 2013 Güncelleştirmesi: Scalate 1.6.1, çalışma zamanı şablonu derlemesi ile Scala derleyicisi aracılığıyla OSGi uyumludur. Ayrıca Scala 2.10 ve üstü, yayınlandığı gibi geçerli OSGi paketleridir.

0

Bence buddy ilkesini ayarlamanız gerekiyor. Aşağıdakiler yardımcı olmalıdır. Paketinizdeki olarak http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/misc/bundle_manifest.html

http://www.eclipsezone.com/eclipse/forums/t90282.html

http://wiki.eclipse.org/index.php/Context_Class_Loader_Enhancements#Buddy_Policy

Eğer başka demetiyle aynı sınıf yükleyici kullanmak gerekir söyleyebiliriz.

+0

Sorun, sınıf görünmezliğinden biri değil, bu yüzden bu cevabın alakalı olduğunu düşünmüyorum. – Raman