如何在编译时不嵌入 .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
更感兴趣
我正在 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
andmodule2-impl.jar
使每个实现依赖于它的API。
Ex:
module1-impl.jar
will depend onmodule1-api.jar
使每个需要的模块依赖于其依赖的API
Ex:
module1-impl.jar
will depend onmodule2-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
更感兴趣