Java 如何从.jar导入API定义,而不在compliation上嵌入.jar?
我正在用Java构建一个基于模块的演示项目。其目的是构建一个超小型的核心应用程序,该应用程序将只连接它们之间的模块。模块一旦连接,将通过API直接与每个模块通信 因为每个模块都是独立开发的,所以它必须是自己的jar,并且可以自己编译,只需将模块的.jar放入一个特定的文件夹,就可以集成到核心应用程序中。然后,核心应用程序将使用Java 如何从.jar导入API定义,而不在compliation上嵌入.jar?,java,eclipse,maven,jar,Java,Eclipse,Maven,Jar,我正在用Java构建一个基于模块的演示项目。其目的是构建一个超小型的核心应用程序,该应用程序将只连接它们之间的模块。模块一旦连接,将通过API直接与每个模块通信 因为每个模块都是独立开发的,所以它必须是自己的jar,并且可以自己编译,只需将模块的.jar放入一个特定的文件夹,就可以集成到核心应用程序中。然后,核心应用程序将使用ServiceLoaderAPI加载这些模块(在启动或运行时,如果可能) 所有项目都将使用Maven,并在Eclipse中开发 每个模块都将实现一个IModule接口,该接
ServiceLoader
API加载这些模块(在启动或运行时,如果可能)
所有项目都将使用Maven,并在Eclipse中开发
每个模块都将实现一个IModule接口,该接口定义了连接模块的基本方法(只需在模块之间共享实例模块的引用),该接口在其自己的.jar
中定义
这种设计模式要求一些模块(比如Module1)知道其他模块的API,它们将与之通信(Module2)
我如何让Module1知道Module2的API而不一起编译?我目前正在考虑将Module2.jar
添加到Module1的构建路径中,但我不确定这是否会在编译期间将整个Module2.jar
集成到Module1.jar
中。一旦加载,两个模块将能够通信
而我可以用“专业”的方式做这些事情吗?
请记住,我远不是一个Java专家,这个应用程序将是一个“演示”应用程序。如果这个演示应用程序的开发进展顺利(因此我会证明这个模式适合我的需要),我可能会在现实世界的应用程序中实现它。干杯 处理模块依赖性的常用方法是将接口(API)与其实现解耦 这就是所谓的,也是原则之一 适用于您的情况,将变成:
- 每个模块都有两个jar(和两个maven子模块)
例如:
,module1api.jar
,module1impl.jar
和module2api.jar
module2impl.jar
- 使每个实现依赖于它的API
例如:
将取决于module1impl.jar
module1api.jar
- 使每个需要的模块依赖于其依赖项的API
例如:
将取决于module1impl.jar
module2api.jar
module1 impl.jar
不需要依赖module2 impl.jar
它还支持同一接口的多个实现,并使要求模块从一个实现轻松“切换”到另一个实现成为可能
API应该只包含Java接口和DTO(POJO仅用于交换数据)
缺点是需要的实现在编译时需要API(*-API.jar
)
专业考虑
您可以将所有模块都定义在一个数据库中
例如,您可以使用以下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
编辑:
如果您需要对模块生命周期(开始/停止)进行精细控制,您可能更感兴趣的是OK。这似乎使我的计划复杂了一点,但肯定更干净了。我想没有其他方法可以构建这样一个基于模块的应用程序了吧?例如,让核心应用程序更多地参与模块间的通信?我是一个软件架构的新手,这是我第一次真正尝试它,所以我可能错过了一些文档/模式…我真的不需要“精确”的控制。我的想法是实现一个三层应用程序,一层一层地包含多个模块,并且尽可能干净,因为我知道我将与几个人一起处理一个模块。api和impl的优点是api jar的更改更少。因此,使用maven的版本控制将更加稳定。您还可以拥有一个由所有模块实现的“通信”接口。然后,您的模块只需要依赖于这个“通信”接口。这实际上取决于模块之间需要交换什么。顺便说一句,我在回答中描述的是,这是原则之一。@Rems仅供参考,我们在工作中经常这样做,即使通常只有一个impl by API,它也是有价值的,因为它降低了模块之间链接的复杂性,这是DI的主要目标