2017-02-03 15 views
7

Temelde "eklentisi" komut, Rhino veya Nashorn ya aracılığıyla Javascript kullanarak JRE kullanıcı yüklediğini bağlı bir dizi çalışan bir sistem Java var.ekleyin ve JavaScript (Rhino/Nashorn) içinden Jar dosyaları ve sınıfları kaldırmak

Ayrıca, Java ortamında, çalışma zamanında ek .JAR dosyalarının takılmasını sağlayan bir sistemim var.

Her şey yolunda ve iyi. Ancak şimdi biraz daha farklı bir şey istiyorum bir durum rastlamak: Ben içinde Rhino/Nashorn motor örneği gelen sınıf yolunda bir .JAR dosyasını yüklemek istiyorum, bu yüzden sınıflar o örneğe bulabilirsiniz (ve yalnızca bu örneği) ve , motor çalıştırmayı bitirdiğinde bunları kaldırın.

.JAR dosyasının URL'sini JavaScript ile yüklemek için mevcut Java rutinimi kolayca arayabileceğimi biliyorum, ancak sınıflar daha sonra kalıcı olarak yüklenir ve bunlardan kurtulmam.

Sorun, kullanıcının aynı .JAR dosyasının farklı sürümleriyle birden çok eklentiye sahip olabilmesi gerçeğinden kaynaklanmaktadır (bu, üçüncü taraflarca sağlanır ve farklı şekillerde farklı eklentiler için kullanılır) ve eklentilere ihtiyacım var Doğru olanı yükleyebilmeli ve sonradan atlayabilecektir.

My mevcut URL yükleyici geçerli:

public static void addURL(URL u) { 
    final Class[] parameters = new Class[]{URL.class}; 
    URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
    Class sysclass = URLClassLoader.class; 

    try { 
     Method method = sysclass.getDeclaredMethod("addURL", parameters); 
     method.setAccessible(true); 
     method.invoke(sysloader, new Object[]{u}); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

Şimdi ben aslında bunun nasıl bir ipucu çoğunu yok - Tam bir güç Java programcısı (C/C++ yapmak çoğunlukla) değilim. URLClassLoader'dan bir URL'yi "kaldıramayacağınızı" biliyorum, bu yüzden bunu sormuyorum. En iyisi ne olurdu, sanırım .JAR dosyasını bir "geçici" URLClassLoader'a ekleyebilmem için bir yol olsaydı, o zaman idam sonunda çektim. Ya da bir şekilde sınıfları doğrudan ana Java ClassPath yerine betik motoruna yükleyebilirim.

ben sadece JavaScript dan diyebiliriz şey varsa doğrudan bu harika olurdu, ama gerekirse işi yapmak için bazı Java yöntemleri uygulamak, hatta bir şekilde komut dosyası altyapısı uzanan umursamıyorum.

cevap

5

Eklenti belirli sınıfları ayırmak için, ayrı (özel) sınıf bir loader örneği oluşturup java script motoruna iletmeniz gerekebilir. Belirli bir sınıf yükleyici tarafından yüklenen herhangi bir sınıf, sadece belirli bir java script motoru tarafından görülebilir.

I ScriptEngine bağlamında Sınıf yükleyicisi tarif this answer bulundu.

Umarım bu, doğru yönde ilerlemenize yardımcı olur.

İlgili konular