如何向Java Web应用程序添加模块化功能

时间:2019-07-20 10:23:13

标签: java-ee modularity

我已经将基于Java EE的Web应用程序开发为Open Source Project

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

能否请您说明如何实现这一目标或将我引向参考文献。

2 个答案:

答案 0 :(得分:0)

我的项目ioc-unit遇到类似的问题。我希望用户添加独立于基本算法的测试Mockito对象,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识别当前配置。该查找程序将能够调用可部署程序中包含的所有模块(罐)的所有接口。 在ioc-unit-case中,分析器使用该接口以特殊方式解释找到的类。如果包含了ioc-unit-ejb,则可以识别Ejb-批注;如果是ioc-unit-mockeasy,则可以识别@Mock;如果是ioc-unit-resteasy:@Path和@Provider .....

答案 1 :(得分:0)

我想说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.,但是可以根据您的需要进行简化。它可以在春季启动时工作,但似乎不适用于企业应用程序。一个简单的例子是这样的:

您的应用程序的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更有意义。