本周 Spring:2011 年 7 月 26 日

工程 | Josh Long | 2011 年 7 月 26 日 | ...

欢迎回到“本周 Spring”的又一期!本周 @springsource 将参加在俄勒冈州波特兰举行的 OSCON(以及 OSCON Java 和 OSCON Data)大会。如果您在这里,请莅临我们在展厅的展位,或查看日程安排,了解众多 Spring 演讲!

如果您错过了 OSCON,或者只是想获得更好的 Spring 体验,请务必 注册参加 SpringOne 2GX 2011,这是 Spring、Grails 和 CloudFoundry 开发者的盛会。SpringOne 2GX 是一个独一无二的会议,面向开发业务应用程序、创建支持多设备感知 Web 应用程序、设计云架构以及管理高性能基础设施的应用程序开发者、解决方案架构师、Web 运营和 IT 团队。会议专门为使用非常受欢迎的开源 Spring 技术、Groovy & Grails 和 Tomcat 的开发者量身定制。无论您是构建和运行关键业务应用程序,还是设计下一个杀手级云应用程序,SpringOne 2GX 都将使您及时了解最新的企业技术。

  1. OSCON 很棒,但我将花一个小时观看网络研讨会《Spring Data Redis 入门》,分别面向 北美欧洲
    You should too: <a href="https://redis.ac.cn/">Redis</a> is an open source, advanced key-value store known for its excellent performance, its small footprint and embed-ability. <a href="http://www.springsource.org/spring-data/redis">The Spring Data</a> project makes it easier to build Spring-powered applications that use new data access technologies such as non-relational "NOSQL" databases and cloud based data services. Check it out!  </li>
    
  2. <a href= "http://www.springsource.org/node/3189">Spring Data Graph 1.1.0.RC1 with Neo4j support Released</a>
    The key changes in the Spring Data Graph 1.1.…

本周 Spring:2011 年 7 月 19 日

工程 | Josh Long | 2011 年 7 月 20 日 | ...

欢迎回到“本周 Spring”的又一期。有很多好东西要介绍,让我们开始吧。

  1. Grails 推广大使 Peter Ledbrook 的网络研讨会“调整您的 Grails 应用程序”的视频已 在此提供。对 Web 开发者(尤其是 Grails 开发者)来说,有很多精彩的内容。请务必查看 SpringSource YouTube 频道上的其他精彩内容。
  2. OSCON 即将到来,SpringSource 将盛装出席!来听听本人(Josh Long)、Steve Mayzak、Ezra Zygmuntowicz、Derek Collison、Bruce Snyder、David McCrory、James Watters 等人在 OSCON(以及 OSCON Java 和 OSCON Data!)上谈论 Spring、CloudFoundry 等内容。此外,欢迎光临我们的展位,我们将很乐意回答您的问题,向您介绍新技术,并与您见面交流。您将前往吗?请告知我们,请在 Twitter 上给我们发送消息至 @SpringSource
  3. Spring Data Redis 1.0.0.M4 已发布。新版本包含多项改进。我最喜欢的是什么?一个使用 Redis 的 Spring 3.1 CacheManager 实现!开箱即用,Spring 3.1 的缓存抽象支持一个基于 java.util.Map<K,V> 接口的 CacheManager 实现,以及一个 Ehcache 实现。Spring Gemfire 项目附带一个委托给 GemFire 的 CacheManager 实现。这个新的 Redis 实现为已有的各种选项增添了更多选择,而 Spring 3.1 甚至还没有 GA(通用可用)!
  4. 说到 Redis,请关注即将举行的网络研讨会《Spring Data Redis 入门》。该研讨会的描述是:“本次网络研讨会将介绍 Redis、其数据结构、其基本概念以及 Spring Data 中的 Redis 支持,并将展示如何轻松入门并扩展到像 Cloud Foundry 这样的云环境中。”请务必收听!
  5. 		  <LI> 	<a href="http://www.springsource.org/node/3183">Spring Integration 2.0.5 has just been released.</a>
    				This release addresses 48 issues of which roughly half were bugs and half were improvements. For details <A href="https://jira.springsource.org/secure/ReleaseNote.jspa?projectId=10121&version=12104">see the Release Notes</a>.  </li> 
    <LI>Dr. David Syer, lead of the <a href="http://static.springsource.org/spring-batch/">Spring Batch project,</a> lead of the Spring Hadoop project, committer on just about everything else, and nice guy, all around, has just posted an amazingly clear…

社交编码:Pull Requests - 遇到复杂情况怎么办

工程 | Dave Syer | 2011年7月18日 | ...

场景:您想向托管在公共 Git 仓库服务(如 GitHub)上的开源项目贡献代码。我参与的许多项目都有很多人提交 pull request,但很多时候合并起来比预期的要复杂,这会稍微减慢过程。基本工作流程在概念上很简单:

  1. Fork 一个公共开源项目
  2. 在本地对其进行一些更改,并将它们推送到您自己的远程 Fork
  3. 请项目负责人将您的更改合并到主代码库

并且 Keith Donald 的博客 对这个基本工作流程有精彩的介绍。

当您 Fork 主代码库之后到发送 pull request 之间,主代码库发生了变化,或者(更糟糕的是)您想为不同的功能或 bug 修复发送多个 pull request,并且需要将它们分开,以便项目所有者能够单独处理,这时就会出现复杂情况。本教程旨在帮助您使用 Git 应对这些复杂情况。

这里的描述使用 GitHub 的领域语言(“pull request”、“fork”、“merge” 等),但相同的原则适用于其他公共 Git 服务。在本教程中,我们假设公共项目接受对其 master 分支的 pull request。大多数 Spring 项目都是这样工作的,但一些其他公共项目不是。您可以在下面的内容中用正确的 branch 名称替换“master”一词,相同的示例应该大致正确。

为了帮助您跟踪本地发生的情况,下面以“$”开头的 shell 命令可以提取到一个脚本中并按出现的顺序运行。终端应该是一个名为“work”的目录中的本地仓库,该仓库有一个指向其 master 分支的 origin(模拟远程公共项目)以及私有 Fork 上的两个分支。这两个分支的 HEAD 内容相同,但提交历史不同(如底部的 ASCII 图所示)。

两个远程仓库

如果您要发送 pull request,则涉及两个远程仓库:主公共项目和您推送更改的 Fork。

在某种程度上,这取决于个人喜好,但我喜欢做的是将主项目设置为我工作副本的远程“origin”,并将我的 Fork 用作第二个名为“fork”的远程。这使得跟踪主项目中的情况变得容易,因为我只需要:

# git fetch origin

这样就可以在本地获得所有更改。这也意味着,在执行我的常规 Git 工作流程时,我永远不会感到困惑:

# git checkout master
# git pull --rebase
... build, test, install etc ...

这总能让我与主项目保持同步。我可以通过在从 master 拉取后执行此操作来使我的 Fork 与主项目保持同步:

# git push fork

初始设置

让我们在一个沙盒中创建一个简单的“远程”仓库供您使用。我们不使用 Git 服务提供商,而是在文件系统本地进行(以 UN*X 命令为例)。

$ rm -rf repo fork work
$ git init repo
$ (cd repo; echo foo > foo; git add .; git commit -m "initial"; git checkout `git rev-parse HEAD`)

(上一次 checkout 的目的是将仓库置于分离 HEAD 状态,以便我们稍后可以从中进行推送。)从现在开始,请假装“repo”是公共 GitHub 项目(例如 git://github.com/SpringSource/repo.git)。

这个 clone 命令中的“fork”URL 类似于 [email protected]/myuserid/repo.git。现在我们来创建 Fork。这等同于 GitHub 在您请求 Fork 仓库时所做的操作。

$ git clone repo fork
$ (cd fork; git checkout `git rev-parse HEAD`)

最后,我们需要设置一个工作目录,在那里进行更改(请记住“repo”= git://github.com/SpringSource/repo.git)。

$ git clone repo work
$ cd work
$ git checkout origin/master

因为我们克隆了主公共仓库,所以它默认是远程“origin”。我们将添加一个新的远程,以便我们可以推送我们的更改。

$ git remote add fork ../fork
$ git fetch fork
$ git push fork

现在,本地仓库中有一个提交,在 gitk(或您喜欢的 Git 可视化工具)中看起来如下:

A (origin/master, fork/master, master)

在此图中,“A”是提交标签,括号中列出了与该提交关联的分支。

获取最新内容

您始终可以使用以下命令从主仓库获取最新内容:

# git checkout master
# git pull --rebase

并将其与 Fork 同步:

# git push fork

如果您以这种方式操作,尽可能使主仓库和您的 Fork 之间的 master 保持同步,并且从不在 master 分支上进行任何本地更改,您将永远不会对世界的现状感到困惑。此外,如果您要向同一个公共项目发送多个 pull request,如果将它们保留在自己的分支上(即不在 master 上),它们就不会相互重叠。

Pull Request

当您想开始处理 pull request 时,从完全更新的 master 分支开始(如上所示),然后创建一个新的本地分支:

$ git checkout -b mynewstuff

进行更改、测试等。

$ echo bar > bar
$ echo myfoo > foo
$ git add .
$ git commit -m "Added bar, edited foo"

并使用新的分支名称(而不是 master)将其推送到您的 Fork 仓库:

$ git push fork mynewstuff

如果没有对 origin 做出任何更改,您可以直接发送 pull request。

如果 Origin 发生变化怎么办?

在本教程中,我们通过以下方式模拟 origin 的更改:

$ cd ../repo
$ git checkout master
$ echo spam > spam; git add .; git commit -m "add spam"
$ git checkout `git rev-parse HEAD`
$ cd ../work

现在我们准备好应对这种变化了。首先,我们将本地 master 更新到最新:

$ git checkout master
$ git pull
$ git push fork

本地仓库现在看起来像这样:

A -- B (mynewstuff, fork/mynewstuff)
 \
  -- D (master, fork/master, origin/master)

请注意,您的新内容没有 origin/master 作为直接祖先(它在另一个分支上)。这使得项目所有者很难合并您的更改。您可以通过在本地完成部分工作,并在发送 pull request 之前将其推送到您的 Fork 来简化此过程。

重写您分支上的历史

如果您没有在您的分支上与任何人协作,那么变基(rebase)到远程仓库的最新更改并强制推送应该完全没问题:

# git checkout mynewstuff
# git rebase master

如果您的更改与远程仓库中发生的事情不兼容,变基可能会失败。您需要修复冲突并提交它们,然后再继续。这会增加您的工作难度,但会使远程项目所有者的工作变得轻松,因为 pull request 保证能够成功合并。

在重写历史时,也许您想将一些提交合并在一起,使补丁更易于阅读,例如:

# git rebase -i HEAD~2
...

无论如何(即使变基顺利进行),如果您已经推送到您的 Fork,您将需要强制推送下一次推送,因为它已经重写了历史(假设远程仓库已更改)。

# git push --force fork mynewstuff

本地仓库现在看起来像这样(B 提交实际上与上一个版本不完全相同,但差异在这里并不重要):

A -- D (master, fork/master, origin/master) -- B (mynewstuff, fork/mynewstuff)

您的新分支有一个直接祖先 origin/master,所以每个人都很高兴。然后,您就可以进入 GitHub UI,从您的分支对 repo:master 发送 pull request 了。

如果我想保留我的本地提交怎么办?

如果您以多个步骤提交了本地更改,也许您想保留所有细小的提交,同时仍将您的 pull request 作为单个提交呈现给远程仓库。这没关系,您可以为此创建一个新分支,然后从该分支发送 pull request。如果您确实与某人协作开发了您的功能分支,并且不想强制推送,这也是一个不错的选择。

首先,我们将新内容推送到 Fork 仓库,以便我们的协作者可以看到它(如果您想将更改保留在本地,则不需要此步骤):

$ git checkout mynewstuff
$ git push fork

然后,我们将创建一个新分支用于合并的 pull request:

$ git checkout master
$ git checkout -b mypullrequest
$ git merge --squash mynewstuff
$ git commit -m "comment for pull request"
$ git push fork mypullrequest

这是本地仓库:

A -- B (mynewstuff, fork/mynewstuff)
 \
  -- D (master, fork/master, origin/master) -- E (mypullrequest, fork/mypullrequest)

您可以使用这个分支,并且您的新分支有一个直接祖先 origin/master,因此合并将非常简单。

如果您没有在 mynewstuff 分支上协作,您甚至可以在此时将其删除。我经常这样做以保持我的 Fork 清洁:

# git branch -D mynewstuff
# git push fork :mynewstuff

这是本地仓库,与两个远程仓库完全同步:

A -- D (master, fork/master, origin/master) -- E (mypullrequest, fork/mypullrequest)

继续处理您的新内容

假设您的 pull request 被拒绝,并且项目所有者希望您进行一些更改,或者新的内容变得更有趣,您需要对其进行更多工作。

如果您上面没有删除它,您可以继续在您的精细分支上工作……

$ git checkout mynewstuff
$ echo yetmore > foo; git commit -am "yet more"
$ git push fork

然后,当您准备好时,将更改转移到 pull request 分支:

$ git rebase --onto mypullrequest master mynewstuff

我们想要的所有更改都已到位,但是分支指向了错误的提交。如下所示,mynewstuff 处于我希望 mypullrequest 所在的位置,并且远程 fork/mynewstuff 没有对应的本地分支。

A -- B -- C (fork/mynewstuff)
 \
  -- D (master, fork/master, origin/master) -- E (mypullrequest, fork/mypullrequest) -- F (mynewstuff)

我们可以使用 git reset 来将两个分支切换到我们想要的位置(如果您愿意,您也可以在图形界面中执行此操作)。

$ git checkout mypullrequest
$ git reset --hard mynewstuff
$ git checkout mynewstuff
$ git reset --hard fork/mynewstuff

新的仓库看起来像这样:

A -- B -- C (mynewstuff, fork/mynewstuff)
 \
  -- D (master, fork/master, origin/master) -- E (fork/mypullrequest) -- F (mypullrequest)

如果我们对 pull request 包含 2 个提交感到满意,我们可以直接推送它:

$ git checkout mypullrequest
$ git push fork

终端看起来像这样:

A -- B -- C(mynewstuff, fork/mynewstuff)
 \
  -- D (master, fork/master, origin/master) -- E -- F (mypullrequest, fork/mypullrequest)

或者,我们可以变基(rebase)它以合并提交,并强制推送,示意图如下:

# git rebase -i HEAD~2
...
# git push --force fork

因为 origin/masterfork/mypullrequest 的直接祖先,所以我知道我的 pull request 将会非常容易合并。

总结

希望本教程能为您提供足够的 Git 工具,以便您可以对您最喜欢的开源项目进行一些更改,并确信合并将很简单。请记住,总有不止一种方法可以做到这一点,而 Git 是一个强大、底层的工具,所以您的体验可能会有所不同,您可能会发现上述方法的一些变体更可取,甚至在某些情况下是必需的,这取决于您的更改。

本周 Spring:2011 年 7 月 12 日

工程 | Josh Long | 2011 年 7 月 13 日 | ...

欢迎回到“本周 Spring”的又一期。今天迎来了新的日出,更重要的是,vSphere 5 发布了,这是 云基础设施的下一步

今天早上的发布活动带来的激动之情至今仍让我回味无穷。
这——以及 vFabric 5 的最新发布——代表了云创新的下一个阶段,也是将您的应用程序迁移到生产环境和云中,与 Spring 协同工作的巨大一步。

    <LI>O'Reilly has published a fantastic roundup on the <a href = "http://radar.oreilly.com/2011/07/7-java-projects.html">seven Java projects that <EM…

Grails 2.0 倒计时:静态资源

工程 | Peter Ledbrook | 2011年6月30日 | ...

Web 应用程序通常严重依赖我们称之为静态资源的资源,例如 Javascript、CSS 和图像文件。在 Grails 应用程序中,它们被放入项目的web-app目录中,然后从 HTML 中引用。例如,

<link rel="stylesheet" href="${resource(dir: 'css', file: 'main.css')}" type="text/css">

将创建指向文件web-app/css/main.css的链接。所有这些都非常简单。您甚至可能认为当前的支持足以满足任何人的需求。您还想做什么?

这是一个很好的观点。答案取决于您的应用程序的复杂性,但让我们从上面的 CSS 链接示例开始。为什么我们必须键入<link rel="..." href=...>?只需查看扩展名,我们就知道该资源是一个 CSS 文件。我们还知道 CSS 文件应该使用…

本周 Spring:2011 年 6 月 28 日

工程 | Josh Long | 2011 年 6 月 29 日 | ...

欢迎回到“本周 Spring”的又一期。

一如既往,本周有很多精彩的内容。当我们编译这份列表时,我们会浏览互联网,寻找有趣的内容,并尝试以摘要的形式在本周的综述中呈现给您。我们经常查看的一些资源包括 TwitterSpringSource 博客CloudFoundry.orgTomcat Expert

我们努力不遗漏任何内容,但有可能遗漏。如果您知道有任何我们遗漏的或认为应该包含的内容,请随时向我们勤劳的编辑们 发送您的建议

虽然 SpringSource 在众多会议和行业活动中拥有强大的影响力,但 Spring 开发者的首要会议仍然是每年在美国举行的 SpringOne 会议。目前正在全力规划最终议程。请查看 SpringOne 2GX 页面,了解即将举行的 SpringOne2GX 会议的新闻和活动,并进行注册。

    <LI><a href="http://www.springsource.org/spring-social/news/1.0.0.rc1-released">Spring Social 1.0.0.RC1</a…

本周 Spring:2011 年 6 月 21 日

工程 | Josh Long | 2011 年 6 月 22 日 | ...

欢迎回到又一期的“本周 Spring”。本周 SpringSource 将盛装出席在圣何塞举行的 JAX 大会,我们将在七月份参加 OSCON。这些活动是我们与用户联系的绝佳途径。一如既往,我们有很多内容要介绍,让我们开始吧!

          <LI>  There has been loads of interest and discussion surrounding last week's <a href="http://blog.springsource.com/2011/06/09/spring-framework-3-1-m2-released/">Spring 3.1 second milestone</a>.  Sam Brannen writes about the <a href="http://blog.springsource.com/2011/06/21/spring-3-1-m…

Spring 3.1 M2: 使用 @Configuration 类和配置文件进行测试

工程 | Sam Brannen | 2011 年 6 月 21 日 | ...

正如 Jürgen Höller 在他宣布 Spring 3.1 M2 发布的帖子中提到的,Spring TestContext Framework(*) 已经过全面改进,为 @Configuration 类和环境配置文件提供了卓越的测试支持。

在这篇文章中,我将首先通过一些示例向您介绍这些新的测试功能。然后,我将介绍 TestContext 框架中使这些新功能成为可能的一些新扩展点。

      请注意:这是我公司博客 www.swiftmind.com 的交叉发布。

背景

在 Spring 2.5 中,我们引入了 Spring TestContext Framework,它提供了注释驱动的集成测试支持,可与 JUnit 或 TestNG 结合使用。本博客中的示例将重点介绍基于 JUnit 的测试,但此处使用的所有功能也适用于 TestNG。

TestContext 框架的核心功能是允许您使用 @ContextConfiguration 注解测试类,以指定用于为测试加载 ApplicationContext 的配置文件。默认情况下,ApplicationContext 使用 GenericXmlContextLoader 加载,该加载器从 XML Spring 配置文件加载上下文。然后,您可以通过使用 @Autowired@Resource@Inject 注解测试类中的字段来从 ApplicationContext 访问 bean…

定义虚拟化和云Java的未来

工程 | Rod Johnson | 2011年6月14日 | ...

今天我很自豪地宣布我们VMware vFabric™应用平台的第五个版本,它定义了面向云和虚拟化执行环境的企业Java的未来。vFabric通过提供现代编程模型与下一代平台服务相结合,开辟了通往新型现代云架构的道路。这条道路没有被前代技术的冗余和复杂性所侵占。通过vFabric 5,VMware确保企业Java已准备好迎接未来严苛、数据密集、大规模可扩展应用的挑战。

vFabric 5继续提供运行Spring应用程序的最佳场所,配备vFabric tc Server,并能够通过vFabric Hyperic以令人难以置信的智能来监控和管理这些生产解决方案。该平台还直接解决了云计算的技术挑战,支持新的数据管理方法,使应用程序能够通过我们的vFabric GemFireRabbitMQ在弹性、地理分布式云架构中扩展…

本周 Spring:2011 年 6 月 14 日

工程 | Josh Long | 2011年6月14日 | ...

欢迎回到“本周 Spring”的又一期,真是精彩的一周!上周发布了 Spring 3.1 M2vFabric 5!有很多令人兴奋的内容要讨论,还有社区的通用新闻,让我们开始吧!

  1. 今天,VMware 宣布发布了 VMware vFabric 5,这是定义企业 Java 在云和虚拟化执行环境的未来的应用程序平台。vFabric 5 包含了 Spring 社区已经熟悉的许多技术,包括 tc ServerHypericGemFireRabbitMQ,但现在还增加了一些新技术。
    • Elastic Memory for Java (EM4J):tc Server 的一项新功能,可在应用程序服务器和底层虚拟机之间提供全新的协调级别。EM4J 利用底层 vSphere 虚拟化来克服 Java 静态内存堆的一些限制。
    • Spring Insight Operations:利用来自 Spring Insight 项目的相同代码级跟踪技术,但将来自多个应用程序服务器的信息汇总到一个控制台中,并提供用于生产系统的汇总视图、钻取和历史比较。
    • SQLFirevFabric SQLFire 利用久经考验的 vFabric GemFire 底层技术,提供内存速度和水平扩展的数据,但 vFabric SQLFire 为该服务增加了熟悉的标准 SQL 和 JDBC 接口。

    Rod Johnson 在他 最新的博客中详细讨论了发布的所有细节。请务必查看最新版本并尝试一下。

  2. Spring 核心负责人 Juergen Hoeller 宣布 Spring 3.1.0 M2 已发布!终于,朝着 Spring 3.1 GA 稳步迈出的下一步!新版本和上一个版本一样功能丰富,包含(但远不止于此!)众多主要新功能,包括改进的 Java 配置支持、无 XML 且无忧的基于 Servlet 3.0 的 Spring MVC 应用程序引导、新的 JPA 和 Hibernate Builder API,以及更多!请在此 查看发布公告,并从您选择的构建依赖管理工具或 下载页面获取相关文件。
  3. <LI> Hot on the heels of the Spring 3.1 release announcement, <a href="http://blog.springsource.com/2011/06/10/spring-3-1-m2-configuration-enhancements/">Chris Beams chimes in</a> on the much-improved Java-centric configuration model in Spring 3.1, M2, even as compared to M1! The features are really starting to come together to make this one of the smoothest, well arranged releases, yet! </LI> 
    
    <lI> 
    

    Spring 3.1 M2 代表了核心 Spring 和 Spring MVC 的显著改进!Rossen Stoyanchev 介绍了众多(您确实需要阅读详细博客才能了解……

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

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

查看所有