我已经将基于Java EE的Web应用程序开发为Open Source Project。
现在,一些贡献者like to add additional functionality通过插入Web应用程序的模块来完成。
能否请您说明如何实现这一目标或将我引向参考文献。
答案 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和其他在线资源中找到示例和说明。
Trouble understanding the whole OSGi web eco system
Introduction to 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.
,但是可以根据您的需要进行简化。它可以在春季启动时工作,但似乎不适用于企业应用程序。一个简单的例子是这样的:
您的应用程序的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更有意义。