【问题标题】:Writing modular Java applications编写模块化 Java 应用程序
【发布时间】:2015-05-09 13:48:21
【问题描述】:

我有一个具有以下结构的项目:

+---main
|   \pom.xml
+---module1
|   \pom.xml
+---module2
|   \pom.xml
+---module3
|   \pom.xml
+---module4
|   \pom.xml
+---pom.xml

模块使用ServiceLoader 机制来注册它们的服务。主类位于main 模块中,该模块还负责使用ServiceLoader 机制在类路径中加载服务。问题是main 模块不知道module1module2module3module4,因为它们是由用户独立安装的。我想要的是在启动程序时将这些模块中的所有类添加到类路径中,以便 ServiceLoader 能够知道这些模块中的服务。

目前,我在运行时从 main 模块加载这些模块,但这似乎不是解决此问题的好方法,因为 IDE 不知道这些模块,而且似乎需要更多是时候在运行时加载这些模块了。我已经研究过像 Elasticsearch 和 PrestoDB 这样的模块化 Java 项目是如何处理这个问题的,但似乎它们都在运行时加载了已安装的模块。

在开发模块化 Java 应用程序时,您如何处理这个问题?假设我有一个名为 plugins 的目录,其中包含用户安装的模块的 jar 文件,有没有办法使用 maven 插件使用包含该目录中所有 jar 的类路径启动应用程序?还是我必须在运行时加载这些 jar?

【问题讨论】:

  • 这听起来可能太简单了,在这种情况下我没有正确理解您的问题:如果运行应用程序时存在 jar 文件/类,那么只需将文件夹添加到类路径( -cp 文件夹/*)?

标签: java maven classpath classloader serviceloader


【解决方案1】:

通常用户将从脚本启动应用程序(或在带有一些可配置的 java exe 启动器的窗口中)。 在脚本中,您可以简单地将插件文件夹添加到您的类路径中,如下所示:

java -cp plugin/* -jar app.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2015-11-02
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2012-10-12
    相关资源
    最近更新 更多