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 的 profile 以启动新子系统。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 文件,编辑 Profile Configuration 部分,列出 slices 子系统并为 profile 指定一个合适的名称(我称之为 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 进行动态配置、用于自省已部署 Web 包的全面 MBean 接口以及 EventAdmin 集成以监控生命周期事件。所有这些特性都将添加到 dm Server 以及 RI 中。

保持不变的是什么?

您会很高兴得知,您在 dm Server 中学到的大部分 Web 应用程序知识保持不变。

使用 dm Server 部署器

除了支持 webbundle URL 外,仍然可以使用 dm Server 部署器部署 WAR 文件。部署器的所有路径都支持,包括 pickup 目录、deployer MBean 和 Admin Console。

使用 dm Server 部署器进行部署时,WAR 文件依赖项将从配置的仓库链中可用的 Bundle 中自动安装。

WAR 部署模式

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

系统包导入

即使此特性未能进入标准,使用 dm Server 部署的 WAR 文件也会自动导入所有配置的系统包。如果使用 webbundle URL 进行部署,您可以使用 URL 参数触发系统包导入。我希望规范能包含这方面的一些标准行为

改变了什么?

我们致力于在 dm Server 中保持大多数特性不变,但迁移到 Web 容器确实需要一些更改。同时,我们正在利用代码重构的机会,整合我们从用户那里看到的一些更受欢迎的特性请求。

Web 模块正在移除

最大的变化是移除了web 模块。我们的偏好是支持基于标准的方法,既然我们已经能够与 OSGi 联盟合作,创建基于标准的 OSGi Web 应用程序方法,我们将转向它,而不是特定于 dm Server 的解决方案。

对于目前正在使用 Web 模块的各位,我非常想了解您最喜欢哪些特性,哪些失去会让您感到遗憾。重要的 Web 模块特性完全可以在 Web 容器 Web Bundle 之上进行重构。

切换到 Tomcat 配置格式

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

我仍在最终确定配置文件的具体存储位置。我希望能够通过占位符来参数化 Tomcat 配置文件,这些占位符可以从 ConfigAdmin 中填充

我如何保持更新?

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

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

OSGi Web 容器简介

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

更新:增加了 Git 的版本控制说明。

在过去的几个月里,我一直在与 Subbarao Meduri、Graham Charters、Hal Hildebrand 以及 OSGi 企业专家组的其他成员一起研究 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 实例中安装的 artifact。然后可以将这些共享仓库添加到 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 为例

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

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 导入了范围为 [1.0, 1.0] 的 eclipselink,而 app2 导入了范围为 [2.0, 2.0]eclipselink。如果我将这些 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(在本例中是 spring bundle)上的 uses 约束发生冲突。

诊断此问题的第一步是找出 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 2uses 指令中列出的 spring.orm.hibernate 包包含哪些包

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 需要范围为 [1.0, 2.0)eclipselink,而 app2 需要范围为 [2.0, 2.0]eclipselink - 这两个范围互斥,这意味着 app2 *不能* 与 spring bundle 连接到相同版本的 eclipselink

uses 列表很长的情况下,您可以通过找出哪些列出的包有多个供应商来缩小可能的冲突范围。必须存在多个供应商才能出现 uses 约束冲突。

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

安装顺序问题

如果我们回到前面的例子,并将 spring bundle 的 manifest 修改为可以接受 2.0 版本的 eclipselink 包,并放宽 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

应用程序 2 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 包连接到 eclipselink_1 Bundle。这可以通过控制台进行确认

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 无法解析,因为它需要版本 2.0.0eclipselink,而 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 GA 发布以来,在过去的几周里,很多人都在询问如何最好地入门 dm Server,所以我用这篇博文来收集所有相关信息...

领先一步

VMware 提供培训和认证,助力您的快速进步。

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看全部