我有两个java应用程序,我需要能够相互通信 - 如果安装了第二个。这两个应用程序/框架都很广泛,核心代码不在我的控制之下,但我可以扩展我需要使用的部分,我只是不能重写已有的部分。
我的第一个应用程序是一组基于Eclipse的插件。从这里开始,我需要连接到第二个应用程序以从中提取数据。
我的第二个应用程序是基于客户端 - 服务器的应用程序,如果客户端应用程序安装在同一台机器上,我需要能够创建与服务器的无头连接(代替客户端)。有适合这样做的Java API,我在Dev环境中有这些API,但它们可能会或可能不会部署在用户的计算机上。
我无法捆绑第二个应用程序中的JAR并将其与第一个应用程序一起交付,因为这绝对是侵犯版权等。所以我需要能够允许第一个应用程序的用户指定第二个应用程序的安装目录(如果已安装)。
我希望能够做的是让第一个应用程序的用户指定第二个应用程序的安装目录,并从该位置加载我需要的任何类,而不必进行太多的微配置。
编辑:到目前为止我所做的是创建了2个OSGI插件。第一个应用程序的User允许第一个应用程序的用户指定第二个应用程序的工作目录。如果设置了此路径,那么我尝试使用反射来加载第二个插件,该插件引用了第二个应用程序所需的类。但试图反映这个类 - 我似乎无法在类路径等中找到它。我试过的是
Class<?> c = Class.forName("com.package.impl.Activator");
和
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
Class<?> c = classloader.loadClass("com.package.impl.Activator")
我还尝试使用
查看Classpath中的其他类来尝试和帮助ImmutableSet<ClassPath.ClassInfo> paths = ClassPath.from(Thread.currentThread().getContextClassLoader()).getAllClasses();
但是这并没有返回任何预期的插件类,只包含框架类,例如
com.sun.crypto.provider.AESCipher
com.sun.crypto.provider.TlsRsaPremasterSecretGenerator
com.sun.crypto.provider.ai
com.sun.java.accessibility.AccessBridge
com.sun.java.accessibility._AccessibleState
com.sun.java.accessibility.util.AWTEventMonitor
com.sun.java.accessibility.util.java.awt.ButtonTranslator
com.sun.java.accessibility.util.java.awt.TextComponentTranslator
etc...
我不确定在设置类路径方面缺少什么,使用反射找到我的插件类。任何想法?
PS两个应用程序都在Windows桌面上运行。
答案 0 :(得分:2)
我想说以你尝试的方式动态加载类是一个死胡同。我看到两个选择:
如果客户端API 是在捆绑包中提供的(意思是:它可以作为捆绑包加载到您的OSGi框架中),解决方案是加载客户端来自您的第一个插件的API包使用BundleContext
和Bundle
(BundleContext.installBundle
和Bundle.start
)的标准OSGi API。这应该是可能的,因为您在用户输入安装位置后知道客户端API jar的位置。之后,您可以对依赖于这些客户端API的第二个捆绑包执行相同的操作。这应该会显示所有用于执行功能的软件。
如果客户端API是在普通的jar 和中提供的,那么你无法说服供应商为你创建一个捆绑罐,情况会有点复杂。首选的解决方案是将客户端API jar动态包装到bundle jar中。已经存在执行此操作的软件(bnd,pax,eclipse,各种框架)。包装完成后,您将回到第一个解决方案。但问题是,鉴于许可条款是否允许这样做。
如果上述所有方法都失败了,我想没有其他解决方案可以在插件环境之外创建软件,通过某种RPC解决方案弥补差距:您需要编写一些使用客户端jar的非插件代码。这部分在自己的JVM中运行,并通过远程方法调用与OSGi框架中的插件进行通信。
希望这会有所帮助,或者这个答案会导致一些后续行动提供更好的解决方案。