如何在编译时不嵌入 .jar 的情况下从 .jar 导入 API 定义?

How to import API definition from .jar without embedding .jar on compliation?

我正在 Java 中构建基于模块的 demo 项目。目的是构建一个超小型核心应用程序,只连接它们之间的模块。模块一旦连接,将通过特定于每个模块的 APIs 直接通信。

每个模块,因为是独立开发的,都必须是自己的jar,只需将模块的.jar放在一起,就可以自己编译集成到Core App中到一个特定的文件夹。然后,核心应用程序将使用 ServiceLoader API.

加载这些模块(如果可能,在启动或运行时)

所有项目都将使用Maven,并在Eclipse中开发。

每个模块都将实现一个 IModule 接口,定义连接模块的基本方法(简单地在它们之间共享实例化模块的引用),并且这个接口在它自己的 .jar.

中定义

此设计模式要求某些模块(比如说模块 1)知道 API 它们将与之通信的其他模块(模块 2)。

如何让 Module1 知道 Module2 的 API 而无需将它们一起编译? 我目前正在考虑将 Module2.jar 添加到 Build Module1的路径,但我不确定这是否会在编译过程中将整个Module2.jar整合到Module1.jar中。如果一旦加载,两个模块将能够通信。

而且 我可以用 "Maven-ess" 的方式做这些事情吗?

请记住,我离成为 Java 专家还很远 (far),这个应用程序将成为 "demo" 应用程序。如果这个演示应用程序的开发进展顺利(因此我证明这个模式适合我的需要),我可能会在现实世界的应用程序中实现它。干杯!

处理模块依赖的常用方法是将接口 (API) 与其实现分离。

就是所谓的Dependency inversion principle (DI) and is one of the SOLID原则。

应用于你的情况会变成:

  • 每个 模块有两个 jar(和两个 maven 子模块)。

    Ex: module1-api.jar, module1-impl.jar, module2-api.jar and module2-impl.jar

  • 使每个实现依赖于它的API。

    Ex: module1-impl.jar will depend on module1-api.jar

  • 使每个需要的模块依赖于其依赖的API

    Ex: module1-impl.jar will depend on module2-api.jar

其中最重要的部分是实现不相互依赖:module1-impl.jar不需要依赖module2-impl.jar

它还支持同一接口的多个实现,并使要求模块轻松地从一种实现“切换”到另一种实现成为可能。

API 应仅包含 Java 接口和 DTO(POJO 仅用于交换数据)。

缺点是需要的实现在编译时需要 API (*-api.jar)。

Maven 考虑因素

您可以在 multi-module maven project.

中定义所有模块

例如,您可以使用以下 maven 目录配置:

parent               (main multi-module parent, type:pom)
 |- core-application (type:jar)
 |- module1-api      (type:jar)
 |- module1-impl     (type:jar)
 |- module2-api      (type:jar)
 \- module2-imp      (type:jar)

或者:

parent               (main multi-module parent, type:pom)
 |- core-application (type:jar)
 |- module1          (multi-module module1 parent, type:pom)
 |   |- module1-api  (type:jar)
 |   \- module1-impl (type:jar)
 \- module2          (multi-module module2 parent, type:pom)
     |- module2-api  (type:jar)
     \- module2-imp  (type:jar

编辑:

如果您需要对模块生命周期进行精细控制(start/stop),您可能对OSGi

更感兴趣