jakarta-ee - 如何向 Java Web 应用程序添加模块化特性
问题描述
我开发了一个基于 Java EE 的 Web 应用程序作为开源项目。
现在,一些贡献者喜欢通过插入 Web 应用程序的模块来添加额外的功能。
您能否解释一下如何实现这一目标或将我引向源参考。
解决方案
我会说 OSGi 是你应该考虑的东西。我没有该领域的专业知识,但您可以在 stackoverflow 和其他在线资源中找到示例和描述。
OSGi 简介教程使用Apache Felix和Apache Karaf,并提供了一个看似简单的关于创建服务包的教程。从教程:
Open Service Gateway Initiative 是定义基于 Java 的组件系统的规范。它目前由 OSGi 联盟管理,它的第一个版本可以追溯到 1999 年。从那时起,它被证明是组件系统的一个很好的标准,并且现在被广泛使用。例如,Eclipse IDE 是一个基于 OSGi 的应用程序。
一个看似更复杂的教程可能是OSGi Modularity - Tutorial
ServiceLoader提供A simple service-provider loading facility.
但看起来可以满足您的需求的简化方式。它适用于spring-boot,但似乎不适用于企业应用程序。一个简单的例子是这样的:
您的Framework
应用程序:
public class FrameworkClass {
public static void main(String[] args) {
new FrameworkClass().run();
}
private void run() {
ServiceLoader<IFrameworkModule> modules = ServiceLoader.load(IFrameworkModule.class);
modules.forEach(IFrameworkModule::initialize);
modules.forEach(IFrameworkModule::execute);
}
}
服务模块实现的接口:
public interface IFrameworkModule {
public void initialize();
public void execute();
}
一个模块 - 在一个单独的 jar 中 - 用于应用程序
public class Module1 implements IFrameworkModule {
@Override
public void initialize() {
System.out.println("initialize module1");
}
@Override
public void execute() {
System.out.println("execute module1");
}
}
这需要framework.IFrameworkModule
文件META-INF/services
夹中的文件
fmodule.Module1
但是考虑到应用程序的复杂性,我认为使用 OSGi 更有意义。
推荐阅读
- python - plotly-dash 显示空白网页
- javascript - 使用 sigmajs 绘制大图
- python - mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '127.0.0.1:3306' on Scrapinghub
- r - 在一个观察者中更新多个单选按钮仅适用于第一个单选按钮
- java - 水平扩展的类和数据库设计
- c++ - 读取嵌套缓冲区的可能 ComputeCPP SYCL 错误
- mysql - Mysql2::Error: 指定的键太长;最大密钥长度为 767 字节
- javascript - EXT JS 使用列表显示使用表格的值。在表头中重复所有行
- json - jq:对象不能是 csv 格式,只能是数组
- python - 修改后无法将 makemigrations 应用于模型