繁体   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