首页 > 解决方案 > 如何向 Java Web 应用程序添加模块化特性

问题描述

我开发了一个基于 Java EE 的 Web 应用程序作为开源项目

现在,一些贡献者喜欢通过插入 Web 应用程序的模块来添加额外的功能。

您能否解释一下如何实现这一目标或将我引向源参考。

标签: jakarta-eemodularity

解决方案


我会说 OSGi 是你应该考虑的东西。我没有该领域的专业知识,但您可以在 stackoverflow 和其他在线资源中找到示例和描述。

OSGi 解决了什么问题?

无法理解整个 OSGi web 生态系统

OSGi 简介教程使用Apache FelixApache 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 更有意义。


推荐阅读