[英]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.