2014-12-23 82 views
0

我們有一個獨立的java應用程序。該應用程序具有許多功能,但大多數客戶只使用這種功能的一小部分。我們希望僅使用「正常」的第三方jar文件來分發應用程序。 在eclipse項目中,所有外部jar文件都在類路徑中。所以沒有反射用於實例化類。因此,當用戶打算使用更高級的功能時,例如拍攝webcamera圖片時,我們將下載所有javacv jar文件,然後在調用我們的需要照片的類之前將它們添加到classpath/classloader中。這可能嗎?我已經爲一個非常小的模塊提供了一個工作解決方案,它可以即時下載一些jar文件並將它們添加到自定義類加載器中,但是我必須痛苦地實例化每個類並通過反射調用每種方法。例如:在運行時下載jar文件並將其添加到classpath中

URLClassLoader loader = new URLClassLoader(urls,w.getClass().getClassLoader()); 
Class grabberClass = Class.forName("org.bytedeco.javacv.FrameGrabber",true,loader); 
Object grabber = grabberClass.getMethod("createDefault", int.class).invoke(null, 0); 
grabberClass.getMethod("start", null).invoke(grabber, null); 
//And so on... 

這不是我們想要的。我們所有的源代碼都很好,我不想通過將它變成反射調用來混淆它。但是,我怎樣才能使用我的舊代碼,並且仍然能夠在運行時添加jar文件?

回答

0

沒有必要反思。嘗試在沒有classpath中的javacv jar文件的情況下運行應用程序。如果您從未觸摸攝像頭功能,並且您沒有以單片方式對應用程序進行編碼,則不應該有任何問題,因爲除非某些其他類在代碼中引用它,否則Java不會嘗試加載類(或從它繼承,或在方法簽名或字段類型中使用它)。

至於下載點播.jar文件,考慮在.jnlp文件使用Java Web Start,使他們懶惰組件:

 
<!DOCTYPE jnlp PUBLIC "-//Sun Microsystems, Inc//DTD JNLP Descriptor 6.0.10//EN" 
         "http://java.sun.com/dtd/JNLP-6.0.10.dtd"> 
<jnlp version="1.6" 
     codebase="http://www.example.com/ourstandaloneapp/" 
     href="OurStandaloneApp.jnlp"> 
    <information> 
     <title>Our Stand-alone App</title> 
     <vendor>Example, Inc.</vendor> 
     <homepage href="http://www.example.com/ourstandaloneapp/"/> 
     <description>A stand-alone application with many capabilities.</description> 
     <icon kind="default" href="standalone.gif"/> 
     <offline-allowed/> 
    </information> 

    <security> 
     <all-permissions/> 
    </security> 

    <resources> 
     <j2se version="1.7+"/> 
     <jar href="OurStandaloneApp.jar" main="true"/> 
     <jar href="http://search.maven.org/remotecontent?filepath=org/bytedeco/javacv/0.10/javacv-0.10.jar" 
      download="lazy"/> 
    </resources> 

    <application-desc/> 
</jnlp> 

一個Web Start的應用程序不必下載/從安裝的網頁。實際上,您可以將其打包到CD或閃存驅動器上,並在執行javaws -codebase file:/path/to/media -import OurStandAloneApp.jnlp的安裝介質上使用快捷方式或腳本。詳情請參閱here。 (爲什麼這個頁面被移除了Java 6以後,我不知道,這很有價值。)

+0

謝謝你的回答。我之前使用過webstart,但不知道懶惰選項。這似乎是做我想要的。聖誕節後我會嘗試這個解決方案。 – runholen

相關問題