Rob Harrop

校友
博客文章作者Rob Harrop

使用 SpringSource Slices 构建模块化 Web 应用程序

工程 | 2009 年 6 月 22 日 | ...

更新:为 Git 添加了子模块说明。

我过去曾谈到过为真正模块化的应用程序提供支持,我很高兴地宣布您现在可以访问SpringSource Slices的早期原型代码。

构建和安装

您可以从我们的 Git 存储库访问源代码

git clone git://git.springsource.org/slices/slices.git
git submodule init
git submodule update

要构建 Slices 的打包版本,只需从build-slices目录运行ant clean jar package

cd slices/build-slices
ant clean jar package

这将在target/artifacts中生成一个 zip 文件,其中包含 Slices 子系统,然后可以将其安装在 dm Server 2.0 之上

安装 Slices 只需将新子系统添加到 dm Server,然后更新 dmServer 的配置文件以启动新子系统即可。Slices 应该适用于任何最新的dm Server 2.0 快照构建。在这里,我使用的是 2.0.0.CI-R326-B274,我已经将其下载并解压缩到我的桌面上

 unzip target/artifacts/springsource-slices-BUILD-20090622083953.zip -d ~/Desktop/springsource-dm-server-2.0.0.CI-R326-B274

接下来,必须更新 dm Server 的kernel.properties配置以包含新的 slices 子系统。打开 dm Server 安装的config/kernel.properties文件,并编辑“配置文件”部分以列出 slices 子系统并为配置文件提供合适的名称(我将其命名为 slices)

#######################
# Profile Configuration
#######################
profile.name=slices…

OSGi Web 容器对 dm Server 的意义

工程 | 2009 年 6 月 1 日 | ...

在我之前的文章中,许多人一直在询问转向 OSGi Web 容器将对 dm Server 产生什么影响。最常见的问题是

  • 添加了什么?
  • 什么保持不变?
  • 什么在改变?
  • 如何保持最新?

我将分别解决这些问题。如果您有任何其他问题,请随时发表评论。

添加了什么?

与 Web 容器 RI 集成将使 dm Server 能够访问 OSGi Web 容器标准的所有功能。这包括处理 WAR 的标准模型,对webbundle URL 方案的支持以及对 Web 容器扩展程序的支持。

我正在探索 RI 的一些不错的增值功能,包括使用 ConfigAdmin 进行动态配置,一个全面的 MBean 接口来内省已部署的 Web 捆绑包以及 EventAdmin 集成以监视生命周期事件。所有这些功能都将添加到 dm Server 以及 RI 中。

什么保持不变?

您会很高兴地知道,您在 dm Server 中了解到的关于 Web 应用程序的大部分内容都保持不变。

使用 dm Server 部署程序

除了支持webbundle URL 之外,仍然可以使用 dm Server 部署程序部署 WAR 文件。所有路径都支持部署程序,包括拾取目录、部署程序 MBean 和管理控制台。

在使用 dm Server 部署程序部署时,WAR 文件依赖项将自动从配置的存储库链中可用的捆绑包中安装。

WAR 部署模式

程序员指南中提到的所有 WAR 类型都保留了下来——事实上,它们是 Web 容器标准的一部分。

系统包导入

使用 dm Server 部署的 WAR 将自动导入所有配置的系统包,即使此功能未包含在标准中。如果使用webbundle URL 进行部署,则可以使用 URL 参数触发系统包导入。我希望规范将在这一领域包含一些标准行为

什么在改变?

我们的目标是保持 dm Server 中的大多数功能不变,但转向 Web 容器确实需要进行一些更改。同时,我们正在利用代码重构来集成我们从用户那里看到的更受欢迎的功能请求。

Web 模块将被删除

最大的变化是删除了Web 模块。我们更倾向于支持基于标准的方法,现在我们已经能够与 OSGi 联盟合作,为 OSGi 上的 Web 应用程序创建基于标准的方法,我们更倾向于使用它而不是 dm Server 特定的解决方案。

对于今天正在使用 Web 模块的您,我真的很想知道您最喜欢的功能是什么,以及您会为失去哪些功能感到难过。没有理由不能在 Web 容器 Web 捆绑包之上重新构建重要的 Web 模块功能。

切换到 Tomcat 配置格式

在 1.0.x 系列中,嵌入在 dm Server 中的 Tomcat 实例使用 JSON 配置文件格式进行配置。我们的许多用户都要求我们切换回使用 Tomcat 的 XML 格式。Web 容器 RI 使用标准的 Tomcat 格式,当 dm Server 切换到 Web 容器时,它也将切换配置文件格式。

我仍在最终确定配置文件将存储在何处的具体细节。我希望能够使用占位符参数化 Tomcat 配置文件,这些占位符可以从 ConfigAdmin 中填充

如何保持最新?

保持了解最新进展的最简单方法是跟踪 Web 容器和 dm Server Web 的 SVN 存储库。您可以在以下 URL 访问这些存储库

我将定期在此处发布博客文章,您也可以使用#osgi#dmserver在 Twitter 上关注进度。

OSGi Web 容器简介

工程 | 2009 年 5 月 27 日 | ...

更新:为 Git 添加了版本控制说明。

在过去的几个月里,我一直在与来自 OSGi 企业专家组的 Subbarao Meduri、Graham Charters、Hal Hildebrand 和其他人一起研究 RFC66 Web 容器规范。Web 容器规范定义了如何以标准方式在 OSGi 服务平台上部署 WAR 文件。

这对我们来说非常有趣,因为 dm Server 现在已经支持 WAR 文件将近 18 个月了,我们很高兴能够朝着标准模型努力。作为最终用户,您将能够在 OSGi 上部署 WAR 文件,而无需……

宣布 dm Server 2.0 M1

工程 | 2009 年 4 月 2 日 | ...

dm Server 2.0 的开发工作已经进行了一段时间了,我很高兴地宣布第一个里程碑版本可以下载了。下载可从我们的主页获取。您可以在我的上一篇文章中找到有关此版本和即将发布的版本中功能的更多信息。

在这篇博文中,我将概述

  • 2.0 M1 中的新功能
  • 直接从 SVN 构建 dm Server

我们正在使用 Scrum

对于 2.0 版本的开发,dm Server 团队采用了 Scrum。您可以在我们的JIRA中查看我们当前的 sprint 和发布积压工作。一如既往,dm Server 的开发是由我们用户的需求驱动的。如果您在……

SpringSource dm Server 路线图

工程 | 2009 年 4 月 1 日 | ...

我们收到 dm Server 用户提出的许多关于在未来几个版本中可以期待什么的问题。在这篇博文中,我将概述我们路线图上的主要功能。我们正在遵循 Scrum 实践,因此您可以预期会看到来自我们 sprint 的相当频繁的里程碑,并且我们在处理新需求和优先级变化方面很灵活。

共享存储库

共享存储库允许您拥有一个集中位置来管理可用于安装在 dm Server 实例中的工件。然后,可以将这些共享存储库添加到 dm Server 配置中……

宣布 dm Server 入门指南

工程 | 2009 年 3 月 30 日 | ...

在过去的几个月里,社区对 dm Server 表现出了极大的兴趣。论坛非常活跃,我们在参加会议时总是会进行有益的讨论。我们注意到,当用户开始为 dm Server 开发他们的第一个应用程序时,会出现很多相同的问题,因此我们编写了一个入门指南,以帮助您更快地入门。

通过阅读入门指南和学习随附的示例,您将学习以下最佳实践:

  • 安装 dm Server
  • 使用 dm Server Eclipse 工具设置有效的开发环境
  • 为表示逻辑创建 Web 模块
  • 使用单独的中层和数据访问模块构建应用程序
  • 创建和管理共享服务(例如数据源)
  • 创建单元和集成测试
  • 使用 Maven 构建 dm Server 应用程序

该指南以HTMLPDF格式提供,示例应用程序的完整代码可在此处找到这里……

我们构建 OSGi 应用程序的计划

工程 | 2009 年 3 月 18 日

| ...

近几周,我们看到越来越多的人对基于 OSGi bundle 的应用程序构建解决方案的未来表示兴趣。由于我们深度参与了 OSGi,这对于我们来说意义重大,我们也花费了大量时间研究客户需求以及满足这些需求的解决方案。在本篇博文中,我将概述我们识别出的需求,并介绍我们认为的解决方案。

我非常乐意听到任何有额外需求的人,或者认为我们提出的需求不合理的人的意见,以及……

SpringOne Americas 2008 演讲和演示

工程 | 2008年12月11日 | ...

正如我向参加我演讲的各位承诺的那样,这里是我关于 dm Server 和并发主题的演讲内容。

dm Server 简介

本演示的幻灯片和演示代码已附加到我之前的文章中:SpringSource dm Server 入门

在会议期间,我遇到了来自 Spring by Example 的 David Winterfeldt,他向我推荐了他的一个很棒的 dm Server 教程

高级并发

高级并发演讲的幻灯片可以在 这里 找到,演示代码在 这里。去年的并发演讲幻灯片可以在 这里 找到。

诊断 OSGi uses 冲突

工程 | 2008年11月22日 | ...

在 Glyn 的 最近的博文 中,他介绍了 OSGi 的“uses”指令。在本篇博文中,我想更深入地探讨 uses 约束冲突的原因,并提供一些诊断应用程序中 uses 问题的技巧。

对于大多数示例,我将使用原始的 Equinox,而不是 dm Server。这样做的原因是 uses 约束并非特定于 dm Server,而是与所有 OSGi 用户相关。在本篇博文的最后,我将演示 dm Server 中内置的一些智能约束失败诊断功能。

依赖约束不匹配

uses 冲突最常见的原因是依赖约束之一或多个不匹配。例如,考虑以下三个清单

Manifest-Version: 1.0
Bundle-Name: Spring Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: spring
Bundle-Version: 2.5.5
Export-Package: spring.orm.hibernate;version="2.5.5";uses:="eclipselink"
Import-Package: eclipselink;version="[1.0, 2.0)"

Manifest-Version: 1.0
Bundle-Name: EclipseLink 1 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: eclipselink
Bundle-Version: 1
Export-Package: eclipselink;version="1.0.0"

Manifest-Version: 1.0
Bundle-Name: EclipseLink 2 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: eclipselink
Bundle-Version: 2
Export-Package: eclipselink;version="2.0.0"

这里您可以看到一个 spring bundle 和两个 eclipselink bundle。显然,这些不是真正的 bundle。 spring bundle 对 eclipselink 包的导入范围为 [1.0, 2.0)。显然,只有 eclipselink_1 bundle 可以满足此约束。现在,考虑来自两个不同应用程序的以下清单

Manifest-Version: 1.0
Bundle-Name: App1 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: app1
Bundle-Version: 1.0.0
Import-Package: spring.orm.hibernate,eclipselink;version="[1.0, 1.0]"

Manifest-Version: 1.0
Bundle-Name: App2 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: app2
Bundle-Version: 1.0.0
Import-Package: spring.orm.hibernate,eclipselink;version="[2.0, 2.0]"

在这里,我们可以看到 app1 导入 eclipselink 的范围是 [1.0, 1.0],而 app2 导入 eclipselink 的范围是 [2.0, 2.0]。如果我将这些 bundle 安装到 Equinox 中,然后尝试启动 app bundle,控制台将显示如下内容

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
2       RESOLVED    spring_2.5.5
3       RESOLVED    eclipselink_1.0.0
4       RESOLVED    eclipselink_2.0.0
5       ACTIVE      app1_1.0.0
6       INSTALLED   app2_1.0.0

在这里,我们可以看到 springeclipselink bundle 都已解析。 app1 bundle 已启动,但 app2 bundle 无法启动。要找出原因,我们可以使用 diag 命令

osgi> diag app2
file:/Users/robharrop/dev/resdiag/uses/app2/bin [6]
  Package uses conflict: Import-Package: spring.orm.hibernate; version="0.0.0"

在这里,我们可以看到 app2 bundle 无法解析,因为它对 spring.orm.hibernate 的导入存在包 uses 冲突。这意味着 app2 中对 spring.orm.hibernate 的导入无法满足,因为它的另一个导入与可以提供 spring.orm.hibernate 的 bundle 上的 uses 约束冲突——在本例中为 spring bundle。

诊断此问题的第一步是找出 spring.orm.hibernate bundle 的可能提供者。我们从用例中知道,唯一的可能提供者是 spring bundle,但如果您不知道提供者,可以使用 packages 命令找到它们

osgi> packages spring.orm.hibernate
spring.orm.hibernate; version="2.5.5"<file:/Users/robharrop/dev/resdiag/uses/spring/bin [2]>
  file:/Users/robharrop/dev/resdiag/uses/app1/bin [5] imports

这向我们展示了 spring.orm.hibernate 包由 bundle 2 导出。有了这些信息,我们就可以找出 bundle 2spring.orm.hibernate 包的 uses 指令中列出的哪些包。

osgi> headers 2
Bundle headers:
 Bundle-ManifestVersion = 2
 Bundle-Name = Spring Bundle
 Bundle-SymbolicName = spring
 Bundle-Version = 2.5.5
 Export-Package = spring.orm.hibernate;version="2.5.5";uses:="eclipselink"
 Import-Package = eclipselink;version="[1.0, 2.0)"
 Manifest-Version = 1.0

在这里,我们可以看到 uses 中唯一的包是 eclipselink 包,因此它一定是罪魁祸首。实际上,我们可以看到 Spring bundle 需要 eclipselink 的范围是 [1.0, 2.0),而 app2 需要 eclipselink 的范围是 [2.0, 2.0]——这两个范围是不相交的,这意味着 app2 无法连接到与 spring bundle 相同版本的 eclipselink

如果 uses 列表很长,您可以通过找出其中哪些列出的包有多个提供者来缩小可能的冲突范围。必须存在多个提供者,您才能看到 uses 约束冲突。

版本不匹配并不是依赖约束不匹配的唯一原因。由于属性以及版本,约束可能不匹配。

安装顺序问题

如果我们重新审视前面的示例,并将 spring bundle 的清单更改为可以接受 eclipselink 包的 2.0 版,并放宽 app1 上的范围,使其可以接受 1.0 以上的任何版本,我们应该能够解决此问题

Manifest-Version: 1.0
Bundle-Name: Spring Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: spring
Bundle-Version: 2.5.5
Export-Package: spring.orm.hibernate;version="2.5.5";uses:="eclipselink"
Import-Package: eclipselink;version="[1.0, 2.0]"

Manifest-Version: 1.0
Bundle-Name: App1 Bundle
Bundle-ManifestVersion: 2
Bundle-SymbolicName: app1
Bundle-Version: 1.0.0
Import-Package: spring.orm.hibernate,eclipselink;version="1.0"

安装 bundle 并启动 app bundle 显示此更改产生了很大影响

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
1       RESOLVED    spring_2.5.5
2       RESOLVED    eclipselink_1.0.0
3       RESOLVED    eclipselink_2.0.0
4       ACTIVE      app1_1.0.0
5       ACTIVE      app2_1.0.0

现在这两个 app bundle 都可以启动了。不幸的是,还有一个更微妙的问题在等待着我们。根据安装顺序,这组 bundle 仍然可能无法一起运行。为了说明这一点,让我们将 springeclipselink_1app1 作为一项事务进行安装,并启动 app1

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
1       RESOLVED    spring_2.5.5
2       RESOLVED    eclipselink_1.0.0
3       ACTIVE      app1_1.0.0

现在,让我们安装 eclipselink_2app2

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
1       RESOLVED    spring_2.5.5
2       RESOLVED    eclipselink_1.0.0
3       ACTIVE      app1_1.0.0
4       RESOLVED    eclipselink_2.0.0
5       INSTALLED   app2_1.0.0

app2 bundle 无法启动。 diag 的输出告诉我们原因

osgi> diag app2
file:/Users/robharrop/dev/resdiag/uses/app2/bin [5]
  Package uses conflict: Import-Package: spring.orm.hibernate; version="0.0.0"

uses 约束又回来了。执行上一节中识别的诊断步骤在这里将无济于事,因为不存在依赖约束不匹配——我们知道这是因为第一次这些 bundle 解析得很好。

这里的问题是解析顺序问题。bundle 分成两个不同的块进行安装和解析。第一个块包含 springeclipselink_1app1,第二个块包含 eclipselink_2app2。当第一个块被解析(由于启动 app1 bundle 的结果)时, spring bundle 会连接到 eclipselink_1 bundle 以满足其对 eclipselink 包的导入。这可以使用控制台进行确认

osgi> bundle app1
file:/Users/robharrop/dev/resdiag/uses/app1/bin [3]
  Id=3, Status=ACTIVE      Data Root=/opt/springsource-dm-server-1.0.0.RELEASE/lib/configuration/org.eclipse.osgi/bundles/3/data
  No registered services.
  No services in use.
  No exported packages
  Imported packages
    spring.orm.hibernate; version="2.5.5"<file:/Users/robharrop/dev/resdiag/uses/spring/bin [1]>
    eclipselink; version="1.0.0"<file:/Users/robharrop/dev/resdiag/uses/eclipselink1/bin [2]>
  No fragment bundles
  Named class space
    app1; bundle-version="1.0.0"[provided]
  No required bundles

请注意,导入的包部分显示 eclipselink 版本 1.0.0 是从 eclipselink_1 bundle 导入的。当第二个块被安装时, app2 bundle 无法解析,因为它需要 eclipselink 版本 2.0.0,但 spring 已经连接到版本为 1.0.0eclipselink。当所有 bundle 作为一个块安装和解析时,OSGi 解析器将尝试满足所有约束,包括确保 spring.orm.hibernate 上的 uses 约束可以满足。

要解决此问题,我们不需要更改 bundle。相反,我们可以将 bundle 作为一个块重新安装,或者我们可以针对 spring bundle 触发刷新——实际上是要求 OSGi 重新运行解析过程。现在 eclipselink_2 bundle 已安装,我们可以预期它会有不同的结果

osgi> refresh spring

osgi> ss

Framework is launched.

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900
1       RESOLVED    spring_2.5.5
2       RESOLVED    eclipselink_1.0.0
3       ACTIVE      app1_1.0.0
4       RESOLVED    eclipselink_2.0.0
5       ACTIVE      app2_1.0.0

osgi> bundle spring
file:/Users/robharrop/dev/resdiag/uses/spring/bin [1]
  Id=1, Status=RESOLVED    Data Root=/opt/springsource-dm-server-1.0.0.RELEASE/lib/configuration/org.eclipse.osgi/bundles/1/data
  No registered services.
  No services in use.
  Exported packages
    spring.orm.hibernate; version="2.5.5"[exported]
  Imported packages
    eclipselink; version="2.0.0"<file:/Users/robharrop/dev/resdiag/uses/eclipselink2/bin [4]>
  No fragment bundles
  Named class space
    spring; bundle-version="2.5.5"[provided]
  No required bundles

请注意,刷新 spring 导致 app2 bundle 解析。 springeclipselink 包的连接已更改,以满足 eclipselink_2 bundle 中版本为 2.0.0 的导出。

dm Server 中的 Uses 约束

当您在 dm Server 中遇到 uses 约束冲突时,我们已经尝试为您执行一些分析步骤,特别是识别可能不匹配的依赖约束。

Could not satisfy constraints for bundle 'app2' at version '1.0.0'.
 Cannot resolve: app2
  Resolver report:
    Bundle: app2_1.0.0 - Uses Conflict: Import-Package: spring.orm.hibernate; version="0.0.0"
      Possible Supplier: spring_2.5.5 - Export-Package: spring.orm.hibernate; version="2.5.5"
        Possible Conflicts: eclipselink

Uses 约束在企业库中很常见,手动诊断故障可能是一场真正的噩梦。特别是,当导出的包在其 uses 子句中列出了 10 个或更多包时,确定可能的冲突可能非常耗时。因此,自动化诊断是必须的,我希望不断改进 dm Server 中的诊断代码,以便处理常见错误变得微不足道。

在下一个版本中,我们计划将诊断工具直接构建到我们的 dm Server Eclipse 工具中,以便 dm Server 可以自动诊断大多数这些问题。

SpringSource dm Server 入门

工程 | 2008年10月22日 | ...

2008年10月28日更新:添加了最新的示例链接和指向第三个示例的链接

昨晚我在 费城 Spring 用户组 上做了“SpringSource dm Server 简介”的演讲。在此演示中,我创建了一个名为 GreenPages 的小型应用程序,演示了 dm Server 的所有主要方面。我向与会者承诺我会在此处发布该应用程序和幻灯片。

在 dm Server 正式发布以来的几周里,许多人一直在询问开始使用 dm Server 的最佳方法,因此我将使用此条目将所有相关信息收集在一起……

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部