调试 DSLD 脚本

工程 | Andrew Eisenberg | 2011 年 8 月 2 日 | ...

不久前,我介绍了 DSL 描述符 (DSLD) 用于 Groovy-Eclipse。DSLD 是 Groovy 脚本,为 Eclipse 工作区中的 Groovy 项目提供了丰富的编辑支持(内容辅助、导航等)。由于 DSLD 只能在正在运行的 Eclipse 进程中执行,因此调试不像启动 Eclipse 调试器并单步执行 Groovy 脚本那样简单。在这篇文章中,我将描述一些简单和更复杂的技术,您可以使用这些技术来调试您的 DSLD。

要使所有这些都能正常工作,您需要最新的开发版本

简单粗暴

调试 DSLD 最简单粗暴的方法是使用 println。这会将表达式打印到正在运行的 Eclipse 进程的标准输出,如果您从命令行启动 Eclipse,则可以看到。但是,我建议改为使用 log 语句。这会将日志信息打印到 Groovy 事件控制台

使用 Scala 进行 Spring Security 配置

工程 | Luke Taylor | 2011 年 8 月 1 日 | ...

在之前的文章 Spring Security 命名空间背后的故事 中,我谈到了 Spring Security 命名空间如何在提供普通 Spring Bean 配置的简单替代方案方面取得了巨大成功,但也谈到了当您想要开始自定义其行为时仍然存在较陡峭的学习曲线。在 XML 元素和属性的背后,创建并连接了各种过滤器和帮助器策略,但是,除了阅读处理 XML 解析的代码之外,没有简单的方法来确定哪些类参与其中或它们如何交互的详细信息。

有一段时间,我们一直在尝试使用 Spring 的 @Configuration 提出基于 Java 的替代解决方案,该解决方案保留了 XML 命名空间的简单性,但也使底层行为更透明且更易于自定义。虽然理论上可行,但似乎没有基于 Java 的解决方案能够满足…

微调 Spring Data 存储库

工程 | Oliver Drotbohm | 2011 年 7 月 27 日 | ...

我们发布 Spring Data JPA 1.0 GA 仅仅几天,这是 Spring Data 项目的第一个主要版本,它在我们的 Spring Data Commons 模块中提供了一个存储库抽象的实现。存储库抽象包含三个主要部分:定义存储库接口、公开 CRUD 方法以及添加查询方法。在 第一篇 Spring Data JPA 博客文章 中详细讨论了添加查询方法。但是,定义存储库接口和公开 CRUD 方法在早期的博客文章中引发了许多问题。这就是为什么我们将要有一个…

本周 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 项目附带一个 CacheManager 实现,该实现委托给 GemFire。这个新的 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…

社交编码:拉取请求 - 遇到复杂情况时该怎么办

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

场景:您想为托管在 GitHub 等公共 Git 存储库服务上的开源项目贡献一些代码。很多人向我参与的项目发送拉取请求,而且很多时候,它们的合并比需要的时间更复杂,这在一定程度上减缓了流程。基本工作流程在概念上很简单

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

并且 Keith Donald 的一篇博客 中对这个基本工作流程进行了很好的描述。

当您分叉它与您发送拉取请求之间的时间间隔内主代码库发生更改时,或者(更糟糕的是)您想要为不同的功能或错误修复发送多个拉取请求,并且需要将它们分开以便项目所有者可以单独处理它们时,就会出现复杂情况。本教程旨在帮助您使用 Git 应对这些复杂情况。

此处的描述使用 GitHub 领域语言(“拉取请求”、“分叉”、“合并”等),但相同的原则也适用于其他公共 Git 服务。出于本教程的目的,我们假设公共项目在其 master 分支上接受拉取请求。大多数 Spring 项目都是这样工作的,但其他一些公共项目并非如此。您可以用正确的分支名称替换下面的“master”一词,所有相同的示例都应该大致正确。

为了帮助您了解本地发生了什么,以下以“$”开头的 shell 命令可以提取到脚本中并按出现的顺序运行。端点应该是名为“work”的目录中的本地存储库,该存储库具有链接到其 master 分支的 origin(模拟远程公共项目)以及私有分叉上的两个分支。这两个分支在头部具有相同的内容,但提交历史记录不同(根据底部的 ASCII 图)。

两个远程存储库

如果您要发送拉取请求,则混合了两个远程存储库:主公共项目和您推送更改的分叉。

在某种程度上,这是一个品味问题,但我喜欢将主项目作为我的工作副本的远程“origin”,并将我的分叉用作名为“fork”的第二个远程。这使得跟踪主项目中发生的事情变得很容易,因为我只需执行

# git fetch origin

所有更改都可以在本地获得。这也意味着我永远不会在执行我的自然 git 工作流时感到困惑

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

这始终使我了解主项目。我只需在从 master 拉取后执行此操作,即可使我的分叉与主项目保持同步

# 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`)

(那里的最后一个检出是为了使存储库处于分离头状态,以便我们稍后可以从克隆中推送到它。)从现在起,假设“repo”是公共 GitHub 项目(例如 git://github.com/SpringSource/repo.git)。

在此克隆命令中的“fork”URL 将类似于 [email protected]/myuserid/repo.git。现在我们将创建分叉。这相当于当您要求 GitHub 分叉存储库时 GitHub 所执行的操作

$ 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"

并将它推送到你的fork仓库,使用新的分支名称(而不是master)

$ 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来简化操作。

在你的分支上重写历史

如果你没有与任何人合作开发你的分支,那么应该绝对可以将它重新定位到远程仓库的最新更改,并强制推送

# 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包含两个提交,我们可以按原样推送它

$ git checkout mypullrequest
$ git push fork

端点看起来像这样

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

或者我们可以将其重新定位以将提交压缩在一起并强制推送,示意如下

# 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文件应该使用……链接到HTML页面。

本周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圣何塞大会上全力以赴,我们还将在7月的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通讯

通过Spring通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部