簡體   English   中英

在運行時將jar文件下載並添加到classpath而不進行反射

[英]Downloading and adding jar files to classpath at runtime without reflection

我們有一個獨立的Java應用程序。 該應用程序具有很多功能,但是大多數客戶只使用其中的一小部分。 我們只希望使用最少“正常”的第三方jar文件來分發應用程序。 在eclipse項目中,所有外部jar文件都在類路徑中。 因此,無需使用反射來實例化類。 因此,當用戶要使用更高級的功能(例如,拍攝網絡攝像頭照片)時,我們將下載所有javacv jar文件,然后以某種方式將這些文件添加到classpath / classloader中,然后再調用需要拍照的類。 這可能嗎? 我已經為一個非常小的模塊准備了一個可行的解決方案,該模塊可以動態下載一些jar文件並將其添加到自定義的類加載器中,但是我不得不痛苦地實例化每個類並通過反射來調用每個方法。 例如:

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文件?

無需反思。 嘗試在類路徑中沒有javacv jar文件的情況下運行應用程序。 如果您從未接觸過網絡攝像頭功能,並且還沒有以整體的方式編寫應用程序,那么您應該不會有任何問題,因為Java不會嘗試加載類,除非並且直到其他類在代碼中引用了它為止(或繼承自它,或在方法簽名中或作為字段類型使用它)。

至於按需下載.jar文件,請考慮使用Java Web Start並使它們成為.jnlp文件中的惰性組件:

<!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下載/安裝Web Start應用程序。 實際上,您可以使用執行javaws -codebase file:/path/to/media -import OurStandAloneApp.jnlp的安裝介質上的快捷方式或腳本,將其打包到CD或閃存驅動器上。 有關詳細信息,請參見此處 (為什么不為Java 6和更高版本刪除該頁面,所以它很有價值。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM