我一直在研究如何开发一个可以加载插件的应用程序。到目前为止,我已经看到,这可以通过定义一个接口并让插件实现来实现。
然而,我目前的问题是当插件被打包在罐子里时如何加载它们。有“最好”的方法吗?
我现在考虑的逻辑是让每个插件在它们的Jar中寻找实现接口的类。但我不知道怎么做这样的查找。我认为这个逻辑可能不是一个好的逻辑,但我找不到任何关于这个特定主题的有用信息。
**编辑1:**添加更多信息:预期的插件将是包含在主应用程序的Jar所在的子目录中的Jar文件,如下所示:
应用程序文件夹
|-主应用程序。jar
|-插件
等等
我希望应用程序能够在运行时加载文件夹中的所有插件。所以在代码中,它只知道插件的文件夹应该存在,并且在这样的文件夹中应该有JAR。
假设我有一个插件接口,如下所示:
interface Plugin
{
public void run();
}
插件将由实现此类接口的类标识,如下所示
class Plugin1 implements Plugin
{
//attributes and other methods
@override
public void run()
{
//something happens here
}
}
class Plugin2 implements Plugin
{
//attributes and other methods
@override
public void run()
{
//something happens here
}
}
应用程序应该只编译一次,并且在执行时能够加载添加到文件夹中的任何插件。为了让应用程序能够加载任何插件,我是否需要建立Jar内容的规则,比如包名和实现接口的类?或者,实现插件接口的类可能位于Jar中的任何包中,并且有任何名称?
这是我想用这种插件做的更通用的方法。简而言之,我计划构建一个有标签的应用程序,每个插件将提供每个标签的界面和功能。我之所以这样做,是因为我希望能够单独维护每个选项卡,而不希望重新编译整个应用程序,因为只有一个组件中的更改不会影响其他组件。
很老的问题,但如果有人搜索。。除了公认的答案,
获取插件jar列表:
File[] jars = new File("Plugins").listFiles();
然后,使用这个答案中关于从JAR文件加载所有类的代码,但对jars
中名称以“.JAR”
结尾的每个文件运行一次。在环体底部,在
Class c = cl.loadClass(className);
继续
if (Plugin.class.isAssignableFrom(c)) {
Plugin plugin = (Plugin) c.newInstance();
// And then, do something with the plugin here
}
我和@Mifeet一样担心安全性——你可能想使用SecurityManager来限制插件代码的功能。
我的应用程序不支持下一代java插件,但在我的一个文档中,我看到了调试此应用程序的步骤,以设置jvm运行时参数为-Xdebug-Xrunjdwp:传输=dt_socket,地址=8000,服务器=y,挂起=y。 现在的问题是与此参数Internet Explorer是不是崩溃或挂起没有加载任何东西。一旦删除此参数解决了这个问题,应用程序运行正常。 那么,是否可以使用其他参数调试该应用程序?我也尝试
到目前为止,我一直认为容器技术(例如:docker)提供了所需的隔离和操作系统级虚拟化。在容器中运行的应用程序受到名称空间、cgroup、设备/selinux、功能的限制,他们无法弄清楚自己所处的主机环境。但是这种理解似乎不是100%正确的。 与wiki-OS级虚拟化一样 操作系统级虚拟化是一种操作系统范例,其中内核允许存在多个独立的用户空间实例。这些实例称为容器(LXC、Solaris容器、Do
null null 在我的Alpine Linux安装上有什么建议来解决这个问题吗?
由于我使用多个环境,我计划将App Insights检测键作为azure portal APP_SETTING的系统属性传递(值作为)。 我添加了所需的Maven依赖项,并且我的的App Insight instrumentation键引用为: 但不管用。当我直接硬编码密钥时,它起作用了。 在Spring中有没有具体的方法来引用系统属性以获取应用程序的洞察?
对于hibernate,我在耳边添加了以下jar:hibernate-commons-annotations-4.0.5.final.jar、hibernate-core-4.3.11.final.jar和hibernate-entitymanager-4.3.11.final.jar。 对于seam,我包含了seam jar:jboss-seam.jar、jboss-seam-debug.jar
我正在试用Play 2.6引入的新PlayService sbt插件(我的确切Play版本是2.6.20),我想将下面链接中提到的应用程序的停止挂钩用于这个基于PlayService插件的Play项目。 https://www.playframework.com/documentation/2.6.x/JavaDependencyInjection#Stopping/cleaning-向上 我的代