编写模块化Java应用程序

时间:2015-05-09 13:48:22

标签: java maven classpath classloader serviceloader

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

+---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?

1 个答案:

答案 0 :(得分:0)

通常,用户将从脚本(或带有一些可配置的java exe启动器的窗口)启动应用程序。 在脚本中,您只需以类似于此的方式将插件文件夹添加到类路径中:

java -cp plugin/* -jar app.jar