SpringSource Tool Suite 发布

工程 | Christian Dupuis | 2008 年 3 月 20 日 | ...

今年的 EclipseCon 是我们公司首次参加。我们举办了许多讲座,都受到了热烈欢迎,并且宣布了针对 SpringSource Tool SuiteBeta 项目。总的来说,我们度过了非常愉快的时光,并从 Eclipse 社区获得了关于 Spring Portfolio 项目,特别是我们在 Web 领域所做工作的许多反馈。我将在接下来的几周内确保将所有反馈转达给项目负责人。由于 EclipseCon 今天即将结束,我终于有时间坐下来写写我们在大会上推出的内容。

周一,我们在 BoF 会议上发布了个人使用版 SpringSource Tool Suite (STS),并且我花费了大量时间与人们交流它带来的额外价值。在这篇博客中,我将更详细地概述 SpringSource Tool Suite 的功能。首先,我听到了很多次人们认为 SpringSource Tool Suite 的发布意味着我们将停止改进和塑造 Spring IDE。请允许我澄清,情况绝非如此;事实上恰恰相反,看看 Spring IDE 的 JIRA 和 Subversion 仓库就知道了。事实上,自从我一月份加入 SpringSource 以来,我在并行开发工具套件的同时,能够增加花在 Spring IDE 上的时间。

SpringSource Tool Suite 的目标是为您提供在 Eclipse 平台上使用 Spring Portfolio 进行企业开发的最先进开发工具——这听起来像营销术语,但这正是工具团队的使命宣言。STS 无疑建立在成熟的 Spring IDE 之上,但它与 Eclipse Mylyn 紧密结合,并且已经扩展了这两个开源工具,将企业级扩展带入您的 IDE。为了提供最好的 Spring 工具,我们已经开始并持续向 Spring 核心框架和其他 Spring 项目添加工具相关的特性、钩子和扩展点。

因此,有了这个工具套件,您终于可以获得 Mylyn 面向任务的用户界面(Task-Focused User Interface)在进行 Spring 开发方面的所有好处。在处理 Spring 应用程序蓝图时,您可以获得上下文管理和聚焦。此外,我们将面向任务的 UI 方法提升到了一个新的水平,并引入了一项我们命名为面向任务的教程(Task-Focused Tutorials)的新技术。面向任务的教程扩展了 Eclipse Cheat Sheet 框架,并为教程的每个步骤添加了任务聚焦。通过面向任务的教程,用户——无论是 Spring 新手,还是想学习特定功能或 Spring 项目的人——只需单击一下即可导入正在运行的示例应用程序,并开始探索该示例。每个教程步骤都会解释教程的某个方面,并且只显示与理解和探索该解释相关的 Java 和 Spring 元素。

Task-Focused Tutorials

从上面的截图可以看到在 Eclipse 中是如何呈现的。教程将 PetClinic 示例应用程序导入到 Eclipse 工作区,并聚焦工作区,只显示 @Autowired 注解及其如何应用于应用程序组件。右侧是展开的步骤,解释了何时以及为何应该使用 @Autowired 注解。在教程的最后,用户只需点击一下即可在捆绑的 Tomcat 服务器上启动示例应用程序,该服务器会自动安装和配置。

我们认为这种介绍新功能和产品的方式是一种非常强大的方法,它让人们可以轻松探索 Spring Portfolio。开发者入门所需的一切都恰好在其应在的位置:IDE 内部。当您下载个人使用版 Beta 时,您将立即获得大约 20 个教程,这些教程均由项目负责人或直接与客户合作的经验丰富的顾问创建。最值得注意的是 Adrian Colyer 花时间创建了 7 个教程,介绍了 OSGi 概念、Equinox 和 Spring Dynamic Modules。如果您现在想搭上 OSGi 的列车,这些教程非常棒。该工具套件包含一个自动 OSGi Bundle 更新/刷新机制,最终允许在应用程序上工作并基于 OSGi 运行时获得即时重新部署语义(您用 EJB 尝试过吗?我试过)。

我想谈论的下一个功能叫做运行时错误分析(Runtime Error Analysis):SpringSource Tool Suite 能够通过分析 Java 堆栈跟踪来提供解决运行时问题的信息。为了实现这一点,我们创建了一个在线知识库,该知识库集成到套件中,并且可以在 Eclipse IDE 内部直接查询。该知识库对所有使用该工具的人开放,我们甚至鼓励人们使用内置的富编辑功能贡献自己的分析。请看下面的截图。

Runtime Error Analysis

使用这个工具套件,您不仅可以获得分析运行时错误的支持,工具还会帮助您查找常见陷阱违反 Spring 最佳实践的情况。特别是在处理 XML bean 定义文件时,此功能非常方便,因为它会在 XML 编辑器内直接通知开发者文件中可能需要修改的地方。例如,在某些情况下,该工具会检测并推荐使用 bean 继承。它还会推荐使用不断改进的命名空间元素,而不是传统的 bean 定义方式。这里有一个例子

Runtime Error Analysis

那么我们来看看我们有哪些功能

  • Spring 开发工具
  • Mylyn 的面向任务用户界面(Task-Focused User Interface),适用于 Java、资源和 Spring 应用程序蓝图
  • 面向任务的教程(Task-Focused Tutorials)
  • 运行时错误分析(Runtime Error Analysis)
  • 最佳实践和架构评审工具

还有一些我没有提及的功能。你看到这些功能列表中的主题了吗?最后列出的三个功能为开发强大的基于 Spring 的应用程序提供了宝贵的帮助。在内部,我们开始使用一个比喻来形容这套功能:盒子里的顾问(Consultant in a Box)。通过 SpringSource Tool Suite,我们希望让您能够获得 SpringSource 的知识,就好像有位顾问坐在您旁边一样!

我鼓励大家前往 Beta 注册页面 试用 Tool Suite。最后,我还要感谢所有已经提交反馈、问题和建议的人。一旦 EclipseCon 这忙碌的一周结束,我就会回复大家。

Spring 依赖注入与 Java 5(包含幻灯片和代码)

工程 | Alef Arendsen | 2008 年 3 月 18 日 | ...

我正在前往开罗的路上写下这些。我们正飞过意大利西部,我能清晰地看到意大利海岸线,那里海水湛蓝,海浪温柔地涌向岸边。现在那里一定很美。我正前往开罗参加由 Ahmed Hashim 组织的 埃及用户组会议,毫无疑问,他一定会做得非常出色,我对此深信不疑。我将进行关于 Spring 的演讲,这次的主题是依赖注入、类型安全和 Java 5。昨天(也就是 3 月 14 日),我在荷兰 Loenen 的 Profict 冬令营为听众做了几乎相同的演讲……

Spring Batch 1.0.0.rc1 发布

发布 | Ben Hale | 2008 年 3 月 17 日 | ...

我很高兴宣布 Spring Batch 1.0.0.rc1 已发布。  您可以通过 Spring Maven Milestone Repository (浏览) 或 下载页面 获取此版本。

这是 Spring Batch 1.0.0 版本的第一个候选发布版(release candidate),预计最终版本将于 3 月 28 日发布。  此版本的主要变化包括

  • 参考文档的改进
  • spring-batch-infrastructure 和 spring-batch-core 的包结构重组
  • spring-batch-core 和 spring-batch-execution 模块的合并

详情请参阅更新日志

Ben Hale
Spring Batch 技术…

Spring Web Flow 2.0 M4 发布

发布 | Keith Donald | 2008 年 3 月 11 日 | ...

亲爱的 Spring 社区成员们,

我们很高兴宣布 Spring Web Flow 2.0 M4 现已可用。  下载 | 文档

此版本巩固了 Web Flow 2 的架构模型,包括 SWF 2 如何与 Spring MVC、JavaServerFaces 和 Ajax 集成。它还引入了许多新功能和改进,包括

2.0 M4 新特性和亮点

  • 引入了简化的 XML 流定义语法。  有关新语法的示例,请参阅 Spring Travel 参考应用程序。
    • 使用版本 2 语法可将版本 1 流定义的大小减少多达 50%。  例如,Spring Travel 1.0.5 包含六个工件中的约 200 行流应用程序代码。最新的 2.0 M4 版本包含两个工件中的 93 行代码,减少了 50%,需要维护的文件少了四个。 
    • 节省主要通过更强的表达式语言(EL)集成以及更简单的动作执行和数据映射标签来实现。
  • Spring Security 集成。  提供对保护流、状态和转换的全面支持。
    一个新的 "currentUser" EL 变量使得从流定义或视图模板中引用已认证的主体(Principal)变得容易。
  • 在 Spring MVC 内部灵活支持流异常处理,包括对自动重新启动已结束或已过期的流的默认支持。
  • 支持处理不改变当前页面的 Ajax 事件。  一个新的 "render" 元素允许您在处理 Ajax 事件后选择性地重新渲染页面的片段。
  • 视图变量。  视图变量在其包含的视图状态进入时分配,并在状态退出时超出范围。这些变量提供页面上下文,对于通过同一页面的系列 Ajax 请求更新模型特别有用。
  • @Autowired 流变量。  流变量现在可以通过 Spring 进行 @Autowired 依赖注入,使其能够持有对 Spring 管理的 @Services 的引用。   在变量反序列化后,服务引用会在请求之间自动重新连接。
  • 支持弹出窗口。  将视图状态标记为 popup=true,当客户端启用 Javascript 时,它将在模态弹出对话框中渲染。
  • 从 Web Flow 的 JSF 支持中剥离出一个名为 "Spring Javascript" 的 Javascript 抽象层。  目前,提供了基于 Dojo 和 Ext 的此层实现。  Spring.js 提供
    • 为 Ajax 提供一个通用接口,无论底层使用哪种工具包
    • 一个类似面向切面(aspect-oriented)的 API,用于修饰 HTML DOM 节点,赋予其行为,包括客户端验证行为。
  • 一个小型 JSF 组件库,底层使用 Spring.js 来逐步增强使用 JSF 的 Spring Web 应用程序。  如果客户端未启用 Javascript,此库会降级。  请参阅 Spring Travel 示例以了解演示:关闭 Javascript,并与开启 Javascript 时进行比较。
  • 支持在标准 Spring MVC 环境中渲染 JSF 视图。  这使得普通 Spring MVC 控制器和流都可以渲染 Facelets 模板。

请参阅版本中包含的 Spring Travel 参考应用程序,以实际演示所有这些功能。  这些参考项目可以直接作为 Dynamic Web Projects 导入到 Eclipse 中。

1.x 兼容性

给现有 Web Flow 用户一个特别说明:即将发布的 2.0 RC1 将在版本 2 环境中提供对版本 1 流的支持。  这将允许 1.0.x 流在与版本 2 流相同的应用程序中无需修改即可运行。

更多信息,请参阅完整的 Web Flow 2 更新日志路线图。  我们还鼓励您访问我们的支持论坛和 JIRA 系统,向开发团队提供您对 M4 的反馈。

尽情享用吧!  2.0 最终版即将到来。

Keith Donald
Web Flow 技术负责人
SpringSource

Spring Web Flow 2.0 M4 - 反馈征集

工程 | Keith Donald | 2008 年 3 月 11 日 | ...

Web Flow 团队一直在努力开发 Web Flow 2。我们刚刚达到了第四个里程碑,最早下周将进入候选发布版状态。2.0 最终版本计划于本月底发布。

从现在到 2.0 最终版本之间,我们希望得到您的反馈!如果您是当前使用 Web Flow 1.x 或正在评估 Web Flow 用于您项目的应用程序开发人员,请评估 2.0 M4告诉我们您的想法。如果您是将 Web Flow 引擎集成到您的框架中的 Web 框架提供商,我们鼓励您评估 2.0 M4 中改进的钩子(hooks)和…

Spring Batch 1.0.0.m5 发布

发布 | Dave Syer | 2008 年 3 月 4 日 | ...

Spring Batch 1.0.0.m5 今日通过 s3 里程碑仓库发布(可在此处浏览:http://s3browse.com/explore/maven.springframework.org/milestone/org/springframework/batch)。更多信息,请访问 Spring Batch 下载页面:http://static.springframework.org/spring-batch

从用户的角度来看,m5 的主要变化是通过各种工厂 Bean 配置作业(jobs)、步骤(steps)和启动器环境(launcher environment)。新的 BatchListener 接口组解决了几个关键的用户关注点。API 中的一些关键接口,如 ItemReader 和 ItemWriter,也发生了一些变化,这使得我们能够更好地分离用户和框架之间的关注点。网站上有一节详细描述了如何从 1.0.0.m4 迁移到 1.0.0.m5 (http://static.springframework.org/spring-batch/migration/1.0-m4-m5.html)。

我们对自上次里程碑以来在 Spring Batch 上取得的进展感到非常高兴,现在终于感觉一切都已为最终版本做好准备。按计划,我们现在只剩下发布 rc1 的时间了,如果需要,还可以考虑 rc2,然后就是预期的 3 月 20 日最终发布。

Spring Framework 2.5.2 发布

发布 | Juergen Hoeller | 2008 年 3 月 3 日 | ...

亲爱的 Spring 社区成员们,
 
我很高兴宣布 Spring Framework 2.5.2 已发布。下载 | 文档
 
这是 Spring 2.5 系列的第二个更新版本。它修复了自 2.5.1 以来报告的所有问题,并在整个框架中引入了各种增强功能

  • 恢复了特定扩展点的完整 Spring 2.0 兼容性
  • 扩展了对 MS SQL, MySQL, PostgreSQL 和 Oracle 的 SQL 错误码映射
  • 修订了 JDBC BeanPropertyRowMapper,改进了值提取逻辑
  • 支持将 GlassFish/JBoss JCA WorkManager 作为 TaskExecutor 后端
  • 支持 Eclipse Persistence Services 1.0 M4 (EclipseLink JPA provider)
  • 与 WebSphere JPA provider (源自 OpenJPA) 的兼容性
  • @RequestMapping 支持 "!myParam" 表达式,用于判断参数不存在的情况
  • @RequestMapping 的 "params" 属性也支持在类型级别使用
  • 修订了 JSP CheckboxesTag 和 RadioButtonsTag (以严格遵守 HTML 标准)
详情请参阅更新日志

Spring Integration 1.0 里程碑 2 发布

发布 | Mark Fisher | 2008 年 2 月 28 日 | ...

亲爱的 Spring 社区成员们,

我很高兴宣布 Spring Integration 1.0.0.m2 已发布。
下载 | 参考文档 | JavaDoc

这是 Spring Portfolio 新增功能的第二个里程碑版本。要查看自里程碑 1 以来的新功能和改进列表,请查看更新日志。更多信息,请访问Spring Integration 主页。此外,请继续关注SpringSource 团队博客,下周初将发布 Spring Integration 的更新。

Mark Fisher
Spring Integration 负责人

在 GWT 客户端代码中启用测试驱动开发

工程 | Iwein Fuld | 2008 年 2 月 19 日 | ...

在过去的几个月里,我一直在与各种客户合作使用 Google Web Toolkit [GWT] 的项目。我喜欢 GWT,主要是因为它提供了 Java 到 javascript 的编译器。这是打开大门的关键,让普通 Java 开发者无需学习新语言即可创建 RIA。

我一直是测试驱动开发(TDD)的拥趸,令我失望的是,乍一看似乎 TDD 和 GWT 不太兼容。

测试 GWT 代码有点问题。核心问题在于 GWT 代码在运行之前需要编译成 javascript。在很多情况下,一个 GWT.create() 语句……

创建 OSGi Bundle

工程 | Costin Leau | 2008 年 2 月 18 日 | ...

在接触 OSGi 时,首先需要学习的概念之一就是 bundle 的概念。在这篇文章中,我想仔细看看 bundle 到底是什么,以及一个普通的 jar 文件如何转化为 OSGi bundle。  那么,话不多说,

什么是 bundle?

OSGi 规范将 bundle 描述为“模块化单元”,它“由 Java 类和其他资源组成,它们共同可以为最终用户提供功能”。到目前为止一切顺利,但 bundle 到底是什么?再次引用规范

bundle 是一个 JAR 文件,它

  • 包含 [...] 资源
  • 包含一个清单文件(manifest file),描述 JAR 文件的内容并提供关于 bundle 的信息
  • 可以在 JAR 文件的 OSGI-OPT 目录或其子目录中包含可选文档

简而言之,bundle = jar + OSGi 信息(在 JAR 清单文件 - META-INF/MANIFEST.MF 中指定),不需要额外的文件或预定义的文件夹布局。这意味着从 jar 创建 bundle 所需要做的就是向 JAR 清单中添加一些条目。

OSGi 元数据

OSGi 元数据由清单条目表示,这些条目规定 bundle 向 OSGi 框架提供或/和需要什么。规范指出了大约 20 个清单头部(manifest headers),但我们只看您最可能使用的一些头部。

Export-Package

顾名思义,此头部指示将 bundle 中可用的哪些包导出,以便其他 bundle 可以导入它们。只有头部指定的包会被导出,其余的将是私有的,并且在包含该 bundle 的外部不可见。

Import-Package

Export-Package 类似,此头部指示 bundle 导入的包。同样,只有此头部指定的包才会被导入。默认情况下,导入的包是强制性的——如果导入的包不可用,导入 bundle 将无法启动。

Bundle-SymbolicName
唯一必需的头部,此条目为 bundle 指定一个唯一标识符,基于反向域名约定(Java 包也使用此约定)。
Bundle-Name
为此 bundle 定义一个人类可读的名称,不含空格。建议设置此头部,因为它能提供比 Bundle-SymbolicName 更短、更有意义的 bundle 内容信息。
Bundle-Activator
BundleActivator 是 OSGi 特定的接口,允许 Java 代码在 bundle 被 OSGi 框架启动或停止时收到通知。此头部的值应包含 activator 类的完全限定名,该类必须是公共的且包含一个无参数的公共构造函数。
Bundle-Classpath
当 jar 包含嵌入式库或位于不同文件夹下的类包时,此头部非常方便,它可以扩展默认的 bundle 类路径(默认类路径期望类直接位于 jar 根目录下)。
Bundle-ManifestVersion
这个鲜为人知的头部指示用于读取此 bundle 的 OSGi 规范版本。1 表示 OSGi release 3,而 2 表示 OSGi release 4 及更高版本。由于 1 是默认版本,因此强烈建议指定此头部,因为 OSGi release 4 的 bundle 在 OSGi release 3 下将无法正常工作。

下面是一个示例,取自 Spring 2.5.x 核心 bundle 的清单文件,它使用了上面提到的一些头部

 
Bundle-Name: spring-core 
Bundle-SymbolicName: org.springframework.bundle.spring.core 
Bundle-ManifestVersion: 2 
Export-Package:org.springframework.core.task;uses:="org.springframework.core,org.springframework.util";version=2.5.1 org.springframework.core.type;uses:=org.springframework.core.annotation;version=2.5.1[...] 
Import-Package:org.apache.commons.logging,edu.emory.mathcs.backport.java.util.concurrent;resolution:=optional[...] 

花在 OSGi 元数据上的大部分时间可能都用于 Export/Import 包条目,因为它们描述了 bundle 之间的关系(也就是模块之间的关系)。当涉及到包时,没有任何隐式规则——只有被提及的包才会被导入/导出,其余的则不会。这也适用于子包:导出 org.mypackage 会导出这个包,不会导出其他任何东西(比如 org.mypackage.util)。导入也是如此——即使一个包在 OSGi 空间中可用,除非某个 bundle 明确导入它,否则它不会被该 bundle 看到。

总结一下,如果 bundle A 导出包 org.mypackage,并且 bundle B 想使用它,那么 bundle A 的 META-INF/MANIFEST.MF 文件应该在其 Export-Package 头部中指定该包,而 bundle B 应该在其 Import-Package 条目中包含它。

包的注意事项

虽然导出相当直接,但导入稍微复杂一些。应用程序通过搜索环境寻找特定库并只使用可用的库来平稳降级是常见的做法,或者库包含用户不使用的代码。这类例子包括日志记录(使用 JDK 1.4 或 Log4j)、正则表达式(Jakarta ORO 或 JDK 1.4+)或并发工具(JDK 5 中的 java.util 或适用于 JDK 1.4 的 backport-util-concurrent 库)。

在 OSGi 术语中,根据包的可用性来依赖它,这转化为可选的 Package-Import。您已经在前面的例子中看到了这样一个包

```code Import-Package: [...]edu.emory.mathcs.backport.java.util.concurrent;resolution:=optional ```

由于在 OSGi 中,同一类可以存在多个版本,因此在导出和导入包时都指定类包的版本是最佳实践。这是通过在每个包声明后添加 version 属性来完成的。OSGi 支持的版本格式是 <major>.<minor>.<micro>.<qualifier>,其中 majorminormicro 是数字,qualifier 是字母数字。

版本的含义完全取决于 bundle 提供者,但是建议使用流行的编号方案,例如 Apache APR 项目的方案,其中

  • <major> - 表示重大更新,不保证任何兼容性
  • <minor> - 表示维护与旧次要版本兼容性的更新
  • <micro> - 表示从用户角度来看不重要的更新,向前和向后都完美兼容
  • <qualifier> - 是一个用户定义的字符串 - 它不常用,可以为版本号提供一个额外的标签,例如构建号或目标平台,没有标准化含义

默认版本(如果属性缺失)是 "0.0.0"。

虽然导出的包必须指定一个特定版本,但导入者可以使用数学区间符号指定一个范围 - 例如

[1.0.4, 2.0) 将匹配版本 1.0.42 及更高版本,直到 2.0(不包含)。请注意,只指定一个版本而不是区间将匹配大于或等于指定版本的所有包,即

Import-Package: com.mypackage;version="1.2.3"

等同于

Import-Package: com.mypackage;version="[1.2.3, ∞)"

最后一点提示,指定版本时,无论是范围还是单个版本,请务必始终使用引号。

使用 OSGi 元数据

现在我们对 bundle 有了一些了解,接下来看看我们可以使用哪些工具来将现有的 jar 转化为 OSGi bundle(osgi-fy)

手动

不建议采用这种“自己动手”的方式,因为很容易出现拼写错误和多余空格,导致清单文件无效。即使使用智能编辑器,清单文件格式本身也会带来一些问题,因为它每行限制 72 个字符,如果超过这个限制,可能会导致一些难以理解的问题。手动创建或更新 jar 文件不是个好主意,因为 jar 格式要求 META-INF/MANIFEST.MF 条目必须是归档中的第一个条目——如果不是,即使它存在于 jar 文件中,清单文件也不会被读取。手动方法只建议在没有其他替代方案的情况下使用。

然而,如果确实想/需要直接处理清单文件,那么应该使用可以处理 UNIX/DOS 空格的编辑器,并结合合适的 jar 创建工具(例如 JDK 自带的 jar 工具)来满足所有 MANIFEST 要求。

Bnd

Bnd 是 BuNDle tool 的缩写,是由 Peter Kriens(OSGi 技术官员)创建的一个很棒的工具,它“帮助 […] 创建和诊断 OSGi R4 bundle”。Bnd 解析 Java 类以了解可用和导入的包,从而创建等效的 OSGi 条目。Bnd 提供了一系列指令和选项,可以自定义生成的工件。bnd.jar 本身的好处是它可以在命令行运行,可以通过 Ant 的专用任务运行,也可以作为插件集成到 Eclipse 中。

Bnd 可以从类路径或 Eclipse 项目中的类创建 jar 文件,也可以通过添加所需的 OSGi 工件来将现有 jar 转化为 OSGi bundle。此外,它可以打印和验证给定 jar 的 OSGi 信息,使其成为一个非常强大但易于使用的工具。

首次使用的用户可以使用 Bnd 查看会向普通 jar 文件添加哪些 OSGi 清单信息。让我们选择一个普通 jar 文件,比如 c3p0(一个非常优秀的连接池库),并发出 print 命令

```code java -jar bnd.jar print c3p0-0.9.1.2.jar ```

输出内容相当大,包含几个部分

  1. 通用清单信息
    [MANIFEST c3p0-0.9.1.2.jar]
    Ant…

获取 Spring 电子报

订阅 Spring 电子报,保持联系

订阅

抢先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部