如何在另一个模块上添加运行时依赖项?

利沃马

我正在为一个包含几个Maven模块的库编写扩展。我需要在一个模块的顶部添加一些功能,但不想添加不必要的依赖关系,以防有人想在没有我的扩展的情况下使用该模块(典型的用例)。

我能想到的一个解决方案是使用扩展名创建另一个模块,并尝试使用反射从其类中调用方法。会有这样的检查:

try {
    Class.forName("my.package.Foo", false, getClass().getClassLoader());
    // extension will be enabled and some method will be called using reflection
} catch(ClassNotFoundException e) {
    // extension will be disabled
}

并且仅当该类在classpath上时才调用该方法。如果您在其模块上添加了Maven依赖关系(除了对其扩展模块的依赖关系),那么可以激活该扩展。

但这听起来并不是最好的方法。有没有更优雅的解决方案来解决这个问题?

vsminkov

一种方法是使用内置的服务提供商接口(SPI)

基本思想是使您的可选库提供某些接口(“服务”)的实现,这些接口可以在主应用程序中轻松找到。看这个例子

// scan classpath for all registered 
// implementations of Module interface
ServiceLoader<Module> loader = ServiceLoader.load(Module.class);
for (Module module : loader) {
    module.doSomething();
}

一旦您的可选依赖项在类路径中,服务加载程序便会找到它。

Oracle的“创建可扩展的应用程序”教程中,您可以找到许多有关如何制作它的示例

另一种方法是使用依赖注入框架,例如springgoogle guice这些框架还提供了用于自动组件发现的类路径扫描机制。这种解决方案比更加灵活,但更重SPI

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在另一个模块上添加运行时依赖项?

来自分类Dev

如何在运行时访问另一个项目中的类

来自分类Dev

如何在另一个声音运行时停止声音?

来自分类Dev

如何在另一个进程运行时更改 tkinter 标签?

来自分类Dev

如何在gradle中将本地jar依赖项添加到另一个依赖项中?

来自分类Dev

如何在gradle中将本地jar依赖项添加到另一个依赖项中?

来自分类Dev

如何在主线程仍在运行时使用线程运行另一个 JFrame

来自分类Dev

当另一个在同一元素上运行时如何应用新的变换动画

来自分类Dev

如何在另一个Tokio运行时中创建Tokio运行时而不会收到错误“无法从运行时中启动运行时”?

来自分类Dev

如何从模块依赖项(另一个模块)调用函数

来自分类Dev

如何从模块依赖项(另一个模块)调用函数

来自分类Dev

Gradle-将依赖项添加到另一个模块的测试中

来自分类Dev

如何将图像从工作簿上复制到运行时生成的另一个

来自分类Dev

如何在使用pyqt5的运行时中用另一个图像替换原始图像?

来自分类Dev

在相对布局中,如何在另一个textview下方显示运行时textview?

来自分类Dev

如何在 npm 包中添加依赖项以下载另一个 npm 包?

来自分类Dev

如何防止Skype在另一个实例已经运行时启动它?

来自分类Dev

当另一个正在运行时,如何打开子进程?

来自分类Dev

如何防止Skype在另一个实例已经运行时启动它?

来自分类Dev

当任务在android中的另一个线程中运行时,如何更新UI?

来自分类Dev

如何在运行时从一个应用程序切换到另一个应用程序

来自分类Dev

如何使用Android Webview运行依赖于另一个库/模块的javascript

来自分类Dev

如何使用gradle将依赖项正确添加到另一个项目?

来自分类Dev

如何在另一个任务之后运行gradle任务,即使最后一个任务也有失败的依赖项

来自分类Dev

如何在另一个任务之后运行gradle任务,即使最后一个任务也有失败的依赖项

来自分类Dev

在angularjs中添加另一个模块依赖项,应用程序停止工作

来自分类Dev

在angularjs中添加另一个模块依赖项,应用程序停止工作

来自分类Dev

从另一个 UserControl 创建 UserControl 并在运行时添加到父容器

来自分类Dev

如何将一个SBT项目添加为另一个项目的依赖项?

Related 相关文章

  1. 1

    如何在另一个模块上添加运行时依赖项?

  2. 2

    如何在运行时访问另一个项目中的类

  3. 3

    如何在另一个声音运行时停止声音?

  4. 4

    如何在另一个进程运行时更改 tkinter 标签?

  5. 5

    如何在gradle中将本地jar依赖项添加到另一个依赖项中?

  6. 6

    如何在gradle中将本地jar依赖项添加到另一个依赖项中?

  7. 7

    如何在主线程仍在运行时使用线程运行另一个 JFrame

  8. 8

    当另一个在同一元素上运行时如何应用新的变换动画

  9. 9

    如何在另一个Tokio运行时中创建Tokio运行时而不会收到错误“无法从运行时中启动运行时”?

  10. 10

    如何从模块依赖项(另一个模块)调用函数

  11. 11

    如何从模块依赖项(另一个模块)调用函数

  12. 12

    Gradle-将依赖项添加到另一个模块的测试中

  13. 13

    如何将图像从工作簿上复制到运行时生成的另一个

  14. 14

    如何在使用pyqt5的运行时中用另一个图像替换原始图像?

  15. 15

    在相对布局中,如何在另一个textview下方显示运行时textview?

  16. 16

    如何在 npm 包中添加依赖项以下载另一个 npm 包?

  17. 17

    如何防止Skype在另一个实例已经运行时启动它?

  18. 18

    当另一个正在运行时,如何打开子进程?

  19. 19

    如何防止Skype在另一个实例已经运行时启动它?

  20. 20

    当任务在android中的另一个线程中运行时,如何更新UI?

  21. 21

    如何在运行时从一个应用程序切换到另一个应用程序

  22. 22

    如何使用Android Webview运行依赖于另一个库/模块的javascript

  23. 23

    如何使用gradle将依赖项正确添加到另一个项目?

  24. 24

    如何在另一个任务之后运行gradle任务,即使最后一个任务也有失败的依赖项

  25. 25

    如何在另一个任务之后运行gradle任务,即使最后一个任务也有失败的依赖项

  26. 26

    在angularjs中添加另一个模块依赖项,应用程序停止工作

  27. 27

    在angularjs中添加另一个模块依赖项,应用程序停止工作

  28. 28

    从另一个 UserControl 创建 UserControl 并在运行时添加到父容器

  29. 29

    如何将一个SBT项目添加为另一个项目的依赖项?

热门标签

归档