Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从.jar导入API定义,而不在compliation上嵌入.jar?_Java_Eclipse_Maven_Jar - Fatal编程技术网

Java 如何从.jar导入API定义,而不在compliation上嵌入.jar?

Java 如何从.jar导入API定义,而不在compliation上嵌入.jar?,java,eclipse,maven,jar,Java,Eclipse,Maven,Jar,我正在用Java构建一个基于模块的演示项目。其目的是构建一个超小型的核心应用程序,该应用程序将只连接它们之间的模块。模块一旦连接,将通过API直接与每个模块通信 因为每个模块都是独立开发的,所以它必须是自己的jar,并且可以自己编译,只需将模块的.jar放入一个特定的文件夹,就可以集成到核心应用程序中。然后,核心应用程序将使用ServiceLoaderAPI加载这些模块(在启动或运行时,如果可能) 所有项目都将使用Maven,并在Eclipse中开发 每个模块都将实现一个IModule接口,该接

我正在用Java构建一个基于模块的演示项目。其目的是构建一个超小型的核心应用程序,该应用程序将只连接它们之间的模块。模块一旦连接,将通过API直接与每个模块通信

因为每个模块都是独立开发的,所以它必须是自己的jar,并且可以自己编译,只需将模块的.jar放入一个特定的文件夹,就可以集成到核心应用程序中。然后,核心应用程序将使用
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的主要目标