我一直在寻找创建模块化 Web 应用程序的解决方案,从某种意义上说,它是模块化的,用户可以以简单的 jar 形式提供自己的插件,然后将自己的数据提供给我的 Web 应用程序和我的 webapp将负责显示它。
现在的问题是我希望我的 Web 应用程序尽可能通用,而不依赖于 j2ee Web 容器来支持任何东西。即我不能依赖我的 Web 容器来提供 osgi 支持并将 Web 应用程序部署为 osgi 包本身(这确实使事情变得非常简单,例如 glassfish 和 WAS)。
我计划使用 Equinox,目前我看到的唯一解决方案是他们在其官方网站上提供的 servlet 桥,但对我来说,将所有内容委托(delegate)给 servlet 真的很痛苦,而 servlet 又会解释请求并找到一个适当的捆绑类,然后再次以某种方式仅将数据传回 Web 应用程序。
对我来说,如果我的网络应用程序也是一个包,那就太好了。 有什么接近我可以尝试的理想解决方案吗?或者osgi和web应用(容器)这两个relams之间的任何其他通信方式?
最佳答案
OSGi spec详细介绍了 WAB(Web Archive Bundle)格式。
和Pax Web为 WAB/WAR 网络应用程序提供强大的支持(PAX Web 在 Equinox、Felix 等平台上运行良好)
使用 pax web,您可以通过 ServletContext 获取 BundleContext,例如:
BundleContext bundleContext = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext");
对于您提到的用户驱动的可插拔性,我建议您为插件包提供一些服务接口(interface)来实现,并在您的 webapp 中使用 ServiceTracker收听他们的注册(除非您使用的是声明式服务)。您也可以轻松地install bundles来自上传 servlet。
我猜想上传插件的用户必须登录并授权,所以此时会遇到安全问题。
编辑:由于评论字段空间不足而在此处回复评论
抱歉,我想我误解了你的问题 - 你有一个现有的 webapp 容器并且你想部署一个具有 OSGi 功能的 WAR?如果是这种情况,那么要么像其他人提到的那样使用 ServletBridge,要么将 OSGi 框架嵌入到您的 WAR 中(这相对容易,例如参见 this)。
您甚至可以通过尝试从 ServletContext 获取 BundleContext 来使其成为可选的,如果这返回 null,则启动您自己的嵌入式框架。这样它将在 native OSGi 容器(例如 Glassfish)或 Java EE 应用服务器中运行。
否则,PaxWeb 是 HttpService 和 WebApp OSGi 规范的实现,但有很多扩展以使生活更轻松 - 但您将其部署到 OSGi 容器。
关于java - OSGI 创建模块化 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7266412/
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r