【问题标题】:How to add a feature of modularity to a Java web application如何向 Java Web 应用程序添加模块化特性
【发布时间】:2019-11-29 02:49:53
【问题描述】:

我开发了一个基于 Java EE 的 Web 应用程序,名称为 Open Source Project

现在一些贡献者like to add additional functionality 通过插入 Web 应用程序的模块。

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

【问题讨论】:

  • 这取决于你想让你的用户插入的东西。首先,您是在开发者方面(例如通过向 pom.xml 添加依赖项)还是在最终用户方面(例如通过在某个管理屏幕上传文件)寻求模块化?
  • 最终用户从某个管理屏幕。

标签: jakarta-ee modularity


【解决方案1】:

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

What does OSGi solve?

Trouble understanding the whole OSGi web eco system

Introduction to 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");
    }
}

需要META-INF/services 文件夹中的framework.IFrameworkModule 文件

fmodule.Module1

但考虑到您的应用程序的复杂性,我认为使用 OSGi 更有意义。

【讨论】:

  • 在我看来,使用 OSGi 需要非常仔细地设计所有包。能够随意添加和删除它们非常诱人,但如果您是消费者,总是必须能够应对这一点,这会带来巨大的成本。
【解决方案2】:

我的项目ioc-unit 有类似的任务。我希望用户添加独立于基本算法来测试 Mockito-objects、Rest-Services 或 Ejb-Services 的功能,并且只包含那些必要的功能。

我使用的原则是由 oracle(java) 在service-provider-interface 中定义的。

因此,我定义了一个service-interface,它由应该以灵活方式添加的模块在 META-INF/services 中实现和定义。例如:ioc-unit-resteasy 用于测试 rest-webservices 或ioc-unit-mockseasy 在 cdi-tests 中引入 mockito 模拟。

然后使用config-finder 识别当前配置。此查找器将能够调用包含在您的可部署文件中的所有模块(jar)的所有接口。 在 ioc-unit-case 中,分析器使用接口以特殊方式解释找到的类。如果包含 ioc-unit-ejb,则识别 Ejb-Annotations,如果 ioc-unit-mockeasy,则识别 @Mock,如果 ioc-unit-resteasy:@Path 和 @Provider.....

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2018-09-06
    • 2012-03-23
    相关资源
    最近更新 更多