Archive

Archive for May, 2010

淘宝Maven培训小记

May 27th, 2010 7 comments

linux_china之邀,本周再次前往了杭州为淘宝进行了一场Maven培训(上一次是去年11月份了)。我对国内到底有多少公司在使用Maven没有明确的概念,不过淘宝已经在很大程度上使用Maven构建这个在全中国拥有数以亿计用户的应用。这也再一次证明了Maven的优秀。从另一个方面来说,当公司变得很大,机构层次越来越多的时候,采用新技术往往会遇到很多障碍,而淘宝虽然规模很大,却还是能很轻盈地接受并拥抱变化,这是很难得的。

“上有天堂,下有苏杭”,作为土生土长的苏州人,我亦然抑制不住对杭州这个城市的喜爱,干净且不拥挤的街道、富有文化底蕴的各类景点、以及大量生机勃勃的软件公司,较上海、北京更适合生活,较苏州又能提供更多的职业机会。

提前一晚到达杭州,稍作安顿,和同学吃过晚饭,本想去附近的贝塔咖啡坐坐,无奈颇感劳累,为了第二天的状态,早早休息。第二天早上再次体验了下淘宝大楼的电梯(排队到洗手间,foursqure上有人警告过),再与linux_china见面,并赶到他们新的培训中心。

整个培训过程大概持续了5个小时,其中上午2个小时介绍了Maven的一些核心概念,下午1个小时演示了mvn、nexus、m2eclipse,另外两个小时介绍Maven的高级特性。从讲师的角度,我觉得整个过程还是比较流畅的,基本上我把我觉得重要的内容都一一做了解释,同学们的一些疑问也做了解答。让我比较开心的是,除了中午偶尔几个同学打瞌睡之外,大家都很认真,我提的一些问题大家也都能回答出来。唯一感觉有点奇怪的是,这次大家在培训过程中提出的疑问比较少,可能是因为同学们经验相对丰富?

如果你有Maven培训的需求,可以给我发邮件:

题外话:当天还体验了一下linux_china的iPad,用来读电子书非常的棒,我也打算入手一台啦。


原创文章,转载请注明出处, 本文地址: http://www.juvenxu.com/2010/05/27/taobao-maven-training/

Categories: 培训 Tags: , ,

使用m2eclipse的七大理由

May 12th, 2010 5 comments

Eclipse无疑是目前最流行的Java IDE,因此很多刚开始接触Maven的人会想要了解Maven如何与Eclipse集成。Sonatype公司的m2eclipse便是一个在Eclipse中集成Maven的插件。本文基于我自身的使用体验总结了m2eclipse的7个最有用的特性,如果你没用过m2eclipse,可以从以下内容获得一个基本的了解,如果你正在使用m2eclipse,也许你能够发现一些以前未曾注意的特性。

1. 导入Maven项目

使用m2eclipse可以快速地导入Maven项目至Eclipse工作区,在日常工作中我经常使用两种方式导入Maven项目。

第一种方式是导入本地文件系统的Maven项目,m2eclipse能够自动解析多模块Maven项目。

从本地文件系统导入Maven项目

第二种方式是从Subversion服务器导入Maven项目,只要一个svn地址,m2eclipse就能自动帮你把项目导入到Eclipse工作区中。

从Subversion服务器导入Maven项目

2. 快速运行mvn命令

你可以运行使用m2eclipse预置的mvn命令,也可以快速的自定义mvn命令。

运行mvn命令

m2eclipse也提供了一个Maven Console,你可以看到详细的mvn构建输出信息。

Maven控制台

Maven控制台

3. 可视化的依赖分析

这是我最喜欢的 m2eclipse特性,该特性能让项目的所有依赖的状态一目了然。

依赖层次(Dependency Hierarchy)能告诉我们项目被最终解析得到的依赖列表,以及每个依赖是通过什么依赖路径被引入的。

项目依赖层次

项目依赖图(Dependency Graph)则详细展现了所有依赖直接错综复杂的关系:

项目依赖图

4. 有效POM (Effective POM)

项目的有效POM是指一个包含了所有集成POM元素的完整的POM,通过有效POM,我们能够得到最完整的POM配置,m2eclipse能让你一键获得项目的有效POM:

项目的有效POM

5. 自动下载Sources

Maven能够自动下载并使用依赖的源码包,当你需要探究第三方开源依赖的细节或者调试应用的时候,这个特性非常得有用!

自动下载构件源码

自动下载构件源码

6. 便捷的构件搜索

m2eclipse能够构建本地仓库索引,或者下载远程仓库的索引,基于这些索引,你可以快速地从海量构件中搜索你需要的依赖:

搜索依赖

7. 浏览Maven仓库

m2eclipse还提供了一个仓库视图,使用该视图,你可以浏览本地和远程仓库的内容:

浏览Maven仓库

想了解更多?

m2eclipse目前最新的版本为0.10.0,你可以访问以下链接了解如何安装:

http://m2eclipse.sonatype.org/installing-m2eclipse.html

此外,m2eclipse为用户提供了完备的文档,请访问:

http://www.sonatype.com/books/m2eclipse-book/reference/


原创文章,转载请注明出处, 本文地址: http://www.juvenxu.com/2010/05/12/seven-reasons-to-use-m2eclipse/

Categories: m2eclipse Tags: ,

Maven构建的可重现性

May 7th, 2010 5 comments

可重现性(Reproducibility)在维基百科中的解释是:

可重现性是科学方法的主要原则之一,它是指一个测试或试验,能够由其它独立工作的个人准确重现或复制的能力。

在谈Maven构建的可重现性之前,先看一个简单的POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.juvenxu</groupId>
  <artifactId>test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <url>http://www.juvenxu.com</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

这个POM仅仅就是声明了一个JUnit依赖,然后配置了maven-javadoc-plugin来生成项目的Javadoc文档。初看起来没有什么问题,但是如果你用Maven 3构建该项目,你会看到一段 WARNING 输出,如:

[WARNING] Some problems were encountered while building the effective model for
com.juvenxu:test:jar:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-javadoc-plugin
is missing. @
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability
of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building
such malformed projects.

大致意思就是警告你说,maven-javadoc-plugin没有声明版本,这种配置会威胁你项目构建的稳定性,请修复该问题。

然而,如果你在使用Maven 2,那么你就不会看到这样的警告信息。因此这里实际上涉及到了一个Maven 3 对Maven 2 的改进。对于未声明版本的插件,Maven 2 会自动解析所有仓库中的最新版本(包括SNAPSHOT),Maven 3 会自动解析所有仓库中的最新RELEASE版本,同时给用户发出警告。Maven 3 这么做是为了帮助用户提高构建的可重现性。

有不少的Maven 2用户抱怨Maven插件系统的不稳定,一个项目,同样的源码,同样的POM,昨天构建还是成功的,今天就莫名其妙的失败了,这是怎么回事呢?这其中的原因往往就是因为他们使用某些插件的时候没有声明插件版本,这时可能发生的情况是:昨天Maven解析到插件X的最新版本为1.2.0,该版本与项目兼容得很好;可是今天Maven解析到X的最新版本为1.3.0-SNAPSHOT,由于是快照版且与1.2.0版本差异很大,该版本的插件就与项目出现了兼容性问题,导致了构建失败。

Maven 3 的一个改进地方在于,它在自动解析插件版本的时候,会无视 SNAPSHOT,也就是说,昨天的1.2.0版本今天不可能变成1.3.0-SNAPSHOT,只可能成为1.2.1这样的RELEASE版本,避开快照版本就意味着避开了很大程度的不稳定性。此外,Maven 3还给出警告,推荐用户声明插件的版本,为什么呢?

我们都知道 ,Maven 的行为是由插件决定的,可重现性就意味着基于同样的源码,同样的POM,Maven 的行为不应该发生变化。不幸的是,Maven 的插件版本自动解析机制在方便用户的同时也可能在不同的时间引入不同版本的插件,从而导致 Maven 构建行为的微妙差异,而这种差异是隐式地引入的,因此当出现问题时很难发现根源因素。所以 Maven 3要给出警告,Maven 用户在使用插件的时候应该一直显式地声明插件版本

需要补充的一点是,Maven 在超级POM中为一些核心的插件声明了版本,如 maven-compiler-plugin,maven-surefire-plugin 等都在其列,因此在使用这些插件的时候你就不再需要担心版本不确定的问题。

基于可重现性原则,我们可以得到以下几条使用 Maven 的最佳实践:

  1. 使用插件的使用显式声明版本。原因已在本文论述。
  2. 配置依赖的时候显式声明版本。如果依赖声明没有版本,Maven也会自动去解析,但不能保证版本的稳定性,而依赖版本的变化也可能导致构建失败。
  3. 除项目内部依赖外,不要依赖其它 SNAPSHOT。项目外部的 SNAPSHOT 依赖随时可能发生变化,且不受你控制,因此不应该使用。

发现你 Maven 项目的潜在问题了么?现在就动手修复吧。


原创文章,转载请注明出处, 本文地址: http://www.juvenxu.com/2010/05/07/reproducibility-of-maven-build/

Categories: Maven Tags:

Pomodoro不只是番茄

May 4th, 2010 3 comments

Pomodoro这个词来源于意大利语,意思是番茄。你可以认为它是水果,或者是蔬菜,但你可能想不到他会和软件行业的敏捷开发联系起来。这个世界本来就充满了各种趣味,软件开发也并非一定要是非常严肃的工作。本文我会介绍一本名为Pomodoro Technique Illustrated的书,它能教你如何使用一个番茄定时器高效地管理时间。

你的工作效率有多高?

在我介绍Pomodoro这一技术及相关的书籍之前,不妨先问你几个问题:

  • 你有能力在同一时间段内游刃有余地同时处理多个问题么?
  • 你能否保持25分钟的完全专注?除了当前的工作不考虑其它,不受内部或者外部的干扰?
  • 你一天的保持专注的工作时间有多少?真的有8个小时么?

什么是番茄技巧?

如果你仔细考虑了上面的几个问题,你可能会惊讶于自己工作效率之低。这并不奇怪,作为一个人,我们都不善于同时处理多个任务,因为任务上下文的切换非常耗时耗力,而且会打消我们的激情。25分钟的专注听起来很容易,但实际做到往往比想象的难,你往往会在做某件事情的时候想到其他可能更重要的事情,或者接个电话、回封电子邮件,甚至不自觉的打开微博等等…,如果做一个统计,你会发现8小时的工作时间中你真正专注工作的时间可能小于5个小时,或者更少。(既然8个小时都没利用好,要加班做什么?)

番茄技巧是FRANCESCO CIRILLO在1992年发明的一项旨在帮助团队或个人用更少时间做更多事情的实践。这种方法异常的简单,其步骤如下:

  • 维护一份Activity Inventory列表,在里面记录所有你需要完成的任务。并且以番茄为单位(25分钟)大致估算每个任务的量。
  • 每天工作之前建立一份To Do Today列面,从Activity Inventory中选择那些今天需要完成的任务,放到To Do Today中。这个列表必须是具有高度可行性的,例如所有任务的番茄量之和不大于16个(6小时40分钟的完全专注时间)。
  • 从To Do Today中选择一个任务开始执行,同时开启番茄定时器(我使用自己HTC Hero自带的定时器),在定时器鸣叫之前,不考虑该任务之外的任何事情。
  • 定时器鸣叫后,立刻停止手头的工作,休息5分钟。起来走走,倒杯水,总之别做工作相关的事情。完成4个番茄后,休息约20分钟。
  • 一天工作完成后,记录当天完成的任务数量,完成的番茄数量至Records列表。自我回顾,总结,并找到可以提高的地方。

番茄技巧的核心是专注,在一个番茄周期里,你必须全身心地投入到工作中去,尽可能地排除任何外界的干扰。同时,为了保持专注的质量,你也必须周期性的休息,根据人身固有的节奏调节自己。

延伸阅读

  • Pomodoro Technique Illustrated这本书由著名的Pragmatic Bookshelf出版,它的每一页都配了一张彩色铅笔画,令这项本来就简单的技术显得更加妙趣横生。我在看过电子版之后,还是忍不住从Amazon买回纸质版收藏。好消息是,最近得知该书中文版已经由图灵引进,已在翻译过程中。
  • FRANCESCO CIRILLO编写了一本官方的The Pomodoro Technique Book,没有上一本生动,但提供了足够的细节,而且该书可以免费下载得到。
  • Pomodoro Technique Illustrated的作者Staffan Nöteberg维护了一个以Pomodoro为主题的博客
  • Pomodoro技术的官方站点也有很多资源等你发现。

最后我想说的是,软件开发没有银弹,自我管理也没有,方法终究只是一个辅助的手段而已。一切方法的前提都是我们需要有足够的自控能力。另外,方法只有在你信任它时才会发挥足够的效果。我是番茄技巧的Fans,希望本文能让你也成为番茄团的一员。


原创文章,转载请注明出处, 本文地址: http://www.juvenxu.com/2010/05/04/pomodoro-not-just-tomto/

Categories: 敏捷 Tags: , , ,