ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品18久久久久久久久久久久,久久综合九色综合欧美98,欧美日韩abhttp://www.aygfsteel.com/jiangshachina/category/35488.html同是Java爱好者,盔R€¢ä½•必曾相识åQ?lt;br>    a cup of Java, cheers!zh-cnThu, 23 Jan 2014 23:37:12 GMTThu, 23 Jan 2014 23:37:12 GMT60使用Gradle构徏Java Web应用(è¯?http://www.aygfsteel.com/jiangshachina/archive/2014/01/23/409285.htmlSha JiangSha JiangThu, 23 Jan 2014 13:22:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2014/01/23/409285.htmlhttp://www.aygfsteel.com/jiangshachina/comments/409285.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2014/01/23/409285.html#Feedback1http://www.aygfsteel.com/jiangshachina/comments/commentRss/409285.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/409285.html
使用Gradle构徏Java Web应用
本文是发布在java.net上的一½‹‡æ‘˜è‡ªäºŽ<Gradle in Action>一书中çš?a >节é€?/a>åQŒä»‹¾läº†ä½¿ç”¨Gradle构徏Java Web应用的过½E‹ã€‚刚刚接触GradleåQŒçœ‹åˆîCº†˜q™ç¯‡ž®æ–‡åQŒéšæ‰‹è¯‘了出æ?-) (2014.01.23最后更æ–?

当今世界åQŒä¸€‹z„¡¹å¿™ã€‚在职业生æ„Ó和私人生‹zÖM¸­åQŒæˆ‘ä»¬ä¸­é—´çš„è®¸å¤šäºø™¦åŒæ—¶½Ž¡ç†å¤šä¸ª™å¹ç›®ã€‚ä½ å¯èƒ½å¸¸å¸¸å‘çŽ°è‡ªå·±å¤„äºŽä¸çŸ¥æ‰€æŽªåŠå¤±æŽ§çš„çŠ¶æ€ã€‚ä¿æŒè§„æ•´åÆˆä¸“æ³¨äºŽä­h值的关键是一个维护良好的工作清单。当ç„Óž¼Œä½ å¯èƒ½æ€ÀL˜¯æŠŠä½ çš„ä“QåŠ¡å†™åœ¨ä¸€å¼ çº¸ä¸Šï¼Œä½†æ˜¯ä½ ä¹Ÿè®æ€¸å¯èƒ½åœ¨ä½ æ‰€å¤„çš„ä»ÖM½•地方都可方便地获得这些工作条目?对互联网的访问几乎是无处不在的,无论是通过你的¿UÕdŠ¨ç”µè¯åQŒè¿˜æ˜¯å…¬å…Þqš„¾|‘络接入炏V€‚在<Gradle in Action>一书中åQŒå¦‚å›?所½Cºçš„说明性示例是一个很有吸引力的可视化Web应用ã€?/span>

å›? To Do应用可以通过互联¾|‘进行访问,òq¶ä‹É用它åŽÈ®¡ç†æ•°æ®å­˜å‚¨ä¸­çš„工作条ç›?/strong>


Gradle插äšg表现的如同一个ä‹É能器åQŒå®ƒä¼šè‡ªåŠ¨åœ°æ‰§è¡Œ˜q™äº›ä»ÕdŠ¡ã€‚ä¸€ä¸ªæ’ä»‰™€šè¿‡å¼•入特定领域的规范以及对¾~ºçœå€¼æ•æ„Ÿçš„ä»ÕdŠ¡åŽÕd¯¹å·¥ç¨‹˜q›è¡Œæ‰©å±•。随Gradle发布的插件之一ž®±æ˜¯Java插äšg。该Java插äšg¾lä¸ä»…仅是提供了源码¾~–译和打包这æ ïLš„基础功能。它为工½E‹å¾ç«‹äº†ä¸€æ•´å¥—标准的目录布局åQŒå®ƒä¼šç¡®ä¿ä»¥æ­£ç¡®çš„顺序去执行ä»ÕdŠ¡åQŒè¿™æ øP¼Œ˜q™äº›ä»ÕdŠ¡åœ¨Javaå·¥ç¨‹çŽ¯å¢ƒä¸­æ‰æ˜¯æœ‰æ„ä¹‰çš„ã€‚çŽ°åœ¨æ˜¯æ—¶å€™äØ“æˆ‘ä»¬çš„åº”ç”¨åŽ»åˆ›å¾ä¸€ä¸ªæž„å»ø™„šæœ¬åÆˆåŽÖM‹É用这个Java插äšg了ã€?/span>

构徏Java应用
一开始,每个Gradle工程都会创徏一个名为build.gradleçš„æž„å»ø™„šæœ¬ã€‚äØ“äº†åˆ›å»ø™¯¥è„šæœ¬åQŒåƈ告诉该工½E‹ä‹É用Java插äšgåQŒåº”该像˜q™æ ·åŽÕdšåQ?/span>
apply plugin: 'java'
ä¸ÞZº†æž„徏你的Java代码åQŒä¸€è¡Œä»£ç å°±å¤Ÿäº†ã€‚但Gradle怎么知道åŽÕd“ªå„¿æ‰¾ä½ çš„æºæ–‡ä»¶å‘¢åQŸè¯¥Java插äšg引入的规范之一ž®±æ˜¯æºä»£ç çš„路径。默认地åQŒè¯¥æ’äšg会到目录src/main/java中搜å¯ÖMñ”品的源代码ã€?/span>

构徏Web应用
通过War插äšgåQŒGradle也提供了构徏Web应用的扩展支持。War插äšg扩展了Java插äšgåQŒå®ƒåŠ å…¥äº†é’ˆå¯¹Web应用½E‹åºå¼€å‘的规范åQŒåƈ支持归集WARæ–‡äšg。让我们也在˜q™ä¸ªå·¥ç¨‹ä¸­ç”¨ç”¨War插äšgåQ?/span>
apply plugin: 'war'
Web应用源文件的默认路径是src/main/webapp。假设你已经明确了该应用所必要的Java¾c…R€‚那么要使äñ”品的全部源代码和Web资源文äšg处于正确路径下,该工½E‹çš„ç›®å½•å¸ƒå±€åº”è¯¥åƒä¸‹é¢è¿™æ øP¼š
.
├── build.gradle
└── src
    └── main
        ├── java
        │   └── com
        │       └── manning
        │           └── gia
        │               └── todo
        │                   ├── model
        │                   │   └── ToDoItem.java
        │                   ├── repository
        │                   │   ├── InMemoryToDoRepository.java
        │                   │   └── ToDoRepository.java
        │                   └── web
        │                       └── ToDoServlet.java
        └── webapp                                               #A
            ├── WEB-INF
            │   └── web.xml                                      #B
            ├── css                                              #C
            │   ├── base.css
            │   └── bg.png
            └── jsp                                              #D
                ├── index.jsp
                └── todo-list.jsp

#A Web源文仉™»˜è®¤ç›®å½?br /> #B Web应用描述½W¦æ–‡ä»?br /> #C å­˜å‚¨æè¿°å¦‚何展现HTML元素的样式单文äšg的目å½?br /> #D å­˜æ”¾JSP形式的动态脚本化视图¾l„äšg

声明外部依赖
在实现这个Web应用的过½E‹ï¼Œæˆ‘们使用的一些类åQŒä¾‹å¦‚javax.servlet.HttpServletåQŒåƈ非Java标准ç‰?Java SE)的一部分。在构徏工程之前åQŒæˆ‘们需要确保已¾lå£°æ˜Žäº†˜q™äº›å¤–部依赖。在Java¾pȝ»Ÿä¸­ï¼Œä¾èµ–¾cÕdº“是以JARæ–‡äšgçš„åŞ式去发布和ä‹É用的。许多类库可以从仓库åQŒå¦‚一个文件系¾lŸæˆ–ä¸­å¤®æœåŠ¡å™¨ï¼Œä¸­èŽ·å¾—ã€‚äØ“äº†ä‹É用依赖,Gradle要求你至ž®‘定义一个仓库。出于一些考虑åQŒæˆ‘们将使用公共的可通过互联¾|‘进行访问的Maven Central仓库ã€?/span>
repositories {
   mavenCentral()                   #A
}
#A é€šè¿‡http://repo1.maven.org/maven2讉K—®Maven2中央仓库的简短标è®?/span>
在Gradle中,依赖是通过配置™åÒŽ¥˜q›è¡Œåˆ†ç»„的。我们将来Servlet依赖使用的配¾|®é¡¹æ˜¯providedCompile。该配置™å¹ç”¨äºŽé‚£äº›åœ¨¾~–译时而非˜qè¡Œæ—¶æ‰€éœ€çš„依赖。像JSTL˜q™æ ·çš„运行时依赖åQŒåœ¨¾~–译时不会被用到åQŒä½†åœ¨è¿è¡Œæ—¶åˆ™ä¼šè¢«ç”¨åˆ°ã€‚它们都会成为WARæ–‡äšg的一部分。下面的配置语句块声明了我们应用所需的外部类库:
dependencies {
   providedCompile 'javax.servlet:servlet-api:2.5'
   runtime 'javax.servlet:jstl:1.1.2'
}

构徏工程
æˆ‘ä»¬å·²ç»å‡†å¤‡å¥½æž„å»ø™¿™ä¸ªå·¥½E‹äº†ã€‚另到工½E‹ä¸­çš„一个Java插äšgä»ÕdŠ¡åäØ“build。该ä»ÕdŠ¡ž®†ç¼–译源代码åQŒè¿è¡Œæµ‹è¯•ç¨‹åºåÆˆå½’é›†WARæ–‡äšg--所有的˜q™äº›ä»ÕdŠ¡éƒ½å°†ä»¥æ­£¼‹®çš„™åºåºè¢«æ‰§è¡Œã€‚执行命令gradle build之后åQŒä½ å¯èƒ½ä¼šå¾—到åŞ如下面的输出åQ?/span>
$ gradle build
:compileJava                                      #A
:processResources UP-TO-DATE
:classes
:war                                              #B
:assemble
:compileTestJava UP-TO-DATE                       #C
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test                                             #D
:check
:build

#A ¾~–译产品的Java源代ç ?br /> #B War插äšg提供的ä“Q务,用于归集WARæ–‡äšg
#C ¾~–译Java‹¹‹è¯•源代ç ?br /> #D ˜qè¡Œå•å…ƒ‹¹‹è¯•

上述输出的每一行都代表执行了一个由Java或War插äšg提供的ä“Q务。你可能会注意到åQŒæœ‰ä¸€äº›ä“Q务被标记为UP-TO-DATE。它的意思是指该ä»ÕdŠ¡è¢«èŸ©˜q‡åŽ»äº†ã€‚Gradle的增量构建支持策略会自动识别不需要执行的工作。特别是在大型商业项目中åQŒè¯¥ç‰ÒŽ€§ä¼šæžå¤§åœ°èŠ‚çœæ—¶é—´ã€?/span>
在该工程的根节目录中åQŒä½ ž®†ä¼šå‘现一个名为build的子目录åQŒå®ƒåŒ…含有执行构å»ÞZ¹‹åŽçš„全部输出åQŒåŒ…括类文äšgåQŒæµ‹è¯•报告,归集的WARæ–‡äšgåQŒä»¥åŠåƒmanifest˜q™æ ·çš„在打包旉™œ€è¦çš„临时文äšg。如下就是执行构建工作之后的工程目录¾l“æž„åQ?/span>
.
├── build
│   ├── classes
│   │   └── main                                          #A
│   │       └── com
│   │           └── manning
│   │               └── gia
│   │                   └── todo
│   │                       ├── model
│   │                       │   └── ToDoItem.class
│   │                       ├── repository
│   │                       │   ├── InMemoryToDoRepository.class
│   │                       │   └── ToDoRepository.class
│   │                       └── web
│   │                           ├── ToDoServlet$ToDoListStats.class
│   │                           └── ToDoServlet.class
│   ├── dependency-cache
│   ├── libs
│   │   └── todo-webapp.war                               #B
│   ├── reports
│   │   └── tests
│   │       ├── base-style.css
│   │       ├── css3-pie-1.0beta3.htc
│   │       ├── index.html
│   │       ├── report.js
│   │       └── style.css
│   ├── test-results
│   │   └── binary
│   │       └── test
│   │           └── results.bin
│   └── tmp
│       └── war
│           └── MANIFEST.MF                                #C
├── build.gradle
└── src

#A åŒ…含Java¾cÀL–‡ä»¶çš„默认目录
#B å½’集的WARæ–‡äšg
#C ç”¨äºŽWARçš„äÍæ—¶manifestæ–‡äšg
ä½ å·²¾lçŸ¥é“如何从一个基于标准目录结构的Web工程åŽÀLž„建WARæ–‡äšg。现在是时候将它布¾|²åˆ°ä¸€ä¸ªServlet容器中去了。在下一节中åQŒæˆ‘们将在本地开发机器中启动Jetty去运行这个Web应用ã€?/span>

˜qè¡Œåº”用
在本地机器中˜qè¡Œä¸€ä¸ªWeb应用应该很容易,能够实践快速应用开å?RAD)åQŒåƈ能够提供快速的启动旉™—´ã€‚最‹‚’地是,它不要求你部¾|²ä¸€ä¸ªWeb容器˜qè¡Œæ—¶çŽ¯å¢ƒã€‚Jetty一个流行的轻量¾U§å¼€æºWeb容器åQŒå®ƒæ”¯æŒå‰é¢æåˆ°çš„æ‰€æœ‰ç‰¹æ€§ã€‚在˜q™ä¸ªWeb应用中加入一个HTTP模块åQŒå®ƒž®±å˜æˆäº†ä¸€ä¸ªåµŒå…¥å¼å®žçŽ°ã€‚Gradleçš„Jetty插äšg扩展了War插äšgåQŒå®ƒæä¾›çš„ä“Q务可以将一个Web应用部çÖv到嵌入式容器中,òq¶èƒ½å¤Ÿå¯åŠ¨è¯¥åº”ç”¨ã€‚åœ¨ä½ çš„æž„å¾è„šæœ¬ä¸­ï¼Œå¯ä»¥åƒå¦‚ä¸‹é‚£æ ·ä‹É用这个插ä»Óž¼š
apply plugin: 'jetty'
˜q™ä¸ªž®†è¢«æˆ‘们用于启动Web应用的ä“Q务名为jettyRun。它甚至可以在无需创徏WARæ–‡äšg的情况下启动一个Jetty容器。执行上˜q°å‘½ä»¤åŽä¼šå¾—到如下åŞ式的输出åQ?/span>
$ gradle jettyRun
:compileJava
:processResources UP-TO-DATE
:classes
> Building > :jettyRun > Running at http://localhost:8080/todo-webapp-jetty
在上˜q°è¾“出的最后一行中åQŒè¯¥æ’äšg告诉了你Jetty卛_°†ä¾¦å¬çš„请求地址。打开一个你喜欢的浏览器åQŒåƈ输入上述地址。最后,我们会看到这个To Do Web应用的行为。图2展示在一个浏览器中查看到该应用界面的截屏ã€?/span>

å›? To Do应用的Webç•Œé¢åŠå…¶è¡ŒäØ“

在你通过¾l„合键CTRL+CåŽÕdœæ­¢è¿™ä¸ªåº”用之前,Gradle会让它一直运行。Jetty如何知道使用哪个端口和上下文环境去运行这个Web应用åQŸå†è¯´ä¸€éï¼Œ˜q™å°±æ˜¯è§„范。Jetty˜qè¡ŒWeb应用所使用的默认端口就æ˜?080ã€?/span>

æ€È»“
只需要较ž®‘的努力åQŒä½ ž®±å¯ä»¥ä‹É用GradleåŽÀLž„å»ºåÆˆ˜qè¡Œä¸€ä¸ªJava Web应用。只要你严格遵åó@标准目录¾l“æž„åQŒé‚£ä¹ˆä½ çš„æž„廸™„šæœ¬ä»…éœ€è¦ä¸¤è¡Œä»£ç ã€?/span>


]]>
最大限度利用Maven settings.xmlæ–‡äšg(è¯?http://www.aygfsteel.com/jiangshachina/archive/2009/08/14/291103.htmlSha JiangSha JiangFri, 14 Aug 2009 11:13:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2009/08/14/291103.htmlhttp://www.aygfsteel.com/jiangshachina/comments/291103.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2009/08/14/291103.html#Feedback2http://www.aygfsteel.com/jiangshachina/comments/commentRss/291103.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/291103.html最大限度利用Maven settings.xmlæ–‡äšg
John Ferguson在他çš?a >最新Blog中,介绍了ä‹Éç”?a >Maven settings.xmlæ–‡äšg的一些鲜ä¸ÞZh知的技巧,希望对大家也有所助益ã€?2009.08.14最后更æ–?

如果你在ä»ÖM½•½E‹åº¦ä¸­ä‹É用过MavenåQŒä½ åº”该知道settings.xmlæ–‡äšgã€?a >settings.xmlæ–‡äšg包含有与¾pȝ»ŸçŽ¯å¢ƒç›¸å…³çš„é…¾|®ç»†èŠ‚ï¼Œä¾‹å¦‚ä»£ç†é…ç½®åQŒä»“库,服务器的用户名和密码åQŒç­‰½{‰ã€?br /> 下面是一个典型的settings.xmlæ–‡äšg的示例:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation
="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd"
>
  
<localRepository>C:/maven/repository</localRepository>

  
<proxies>
    
<proxy>
      
<id>localproxy</id>
      
<active>true</active>
      
<protocol>http</protocol>
      
<host>proxy.acme.com</host>
      
<port>8080</port>
      
<username>scott</username>
      
<password>t0ps3cr3t</password>
      
<nonProxyHosts>*.acme.com</nonProxyHosts>
    
</proxy>
  
</proxies>
  
  
<servers>
    
<server>
      
<id>dbserver</id>
      
<username>scott</username>
      
<password>tiger</password>
    
</server>
  
</servers>
  
</settings>
例如åQŒè‹¥ä½ ä‹É用公司的环境åQŒåœ¨è¯¥çŽ¯å¢ƒä¸­åQŒä½ çš„Mavenä¸È›®å½•是每天早晨当你ç™Õd½•æ—¶ç”±¾|‘络传输的,localRepository元素ž®×ƒ¼šéžå¸¸æœ‰ç”¨ã€‚在˜q™ç§æƒ…况 下,ž®†æœ¬åœîC»“库置于你本地¼‚ç›˜çš„不同目录中åQŒå°†ä¼šèŠ‚¾U¦å¤§é‡çš„带宽ã€?br /> 你也可以在settings.xmlæ–‡äšg中定义仓库,镜像åQŒæ¦‚˜q°å’Œå±žæ€§ã€‚在此处åQŒæˆ‘不想涉及上述内容åQŒå› ä¸ºåœ¨å…¶å®ƒåœ°æ–¹å·²ç»æœ‰å…³äºŽå®ƒä»¬çš„很好的文档了ã€?br /> 很少ä¸ÞZh所知,或至ž®‘是很少被ä‹É用的功能是,在你的pom.xmlæ–‡äšg中ä‹É用定义在settings.xmlæ–‡äšg中的数据ã€?span style="font-size: 10pt;">事实上,你能使用settings.xml中的ä»ÖM¸€å…ƒç´ åQŒç„¶è€Œå…¶ä¸­çš„ä¸€äº›åˆ™æ›´äØ“æœ‰ç”¨ã€?br /> 一个普遍且方便的例子就是ä‹Éç”?strong>localRepository
变量。你可能需要将该变量置于一个脚本中åQŒæˆ–使用它来引用仓库中的某个特定的JARæ–‡äšg(ž®½ç®¡é€šå¸¸æœ‰æ›´ä¼˜é›…的方案来解决˜q™ä¸€é—®é¢˜)。你可以通过½Ž€å•地引用${settings.localRepository}来ä‹Éç”?strong>localRepository属性。例如,在下面的代码中,我们调用一个Ant脚本åQŒåÆˆé€šè¿‡åäØ“"localRepository"的属性传¾l™å®ƒä¸€ä¸ªæœ¬åœîC»“库èµ\径:
<plugin>
  
<groupId>org.apache.maven.plugins</groupId>
  
<artifactId>maven-antrun-plugin</artifactId>
  
<executions>
    
<execution>
      
<id>generate-stuff</id>
      
<phase>pre-comile</phase>
      
<goals>
        
<goal>run</goal>
      
</goals> 
      
<configuration>
        
<tasks>
          
<ant target="generate">
            
<property name="localRepository"  value="${settings.localRepository}"/>
          
</ant>
        
</tasks>
      
</configuration>
    
</execution>
  
</executions>
</plugin>
做更多有­‘£çš„事情åQŒç‰¹åˆ«æ˜¯å½“你也在构徏中集成了Groovy时。例如,假设在集成测试阶ŒD‰|œŸé—ß_¼Œæˆ‘们需要确保特定的SQL脚本已在数据库中执行˜q‡äº†ã€‚我们有一个名为update-scripts.groovyçš„Groovy脚本来做˜q™äšg事情åQŒä½†å®ƒéœ€è¦ä»¥å‘½ä×o行参数的形式提供用户名和密码。在集成‹¹‹è¯•阶段之前åQŒä½ åº”如何ä‹É用定义在settings.xml中的用户名和密码呢?是的åQŒåªéœ€ä¸€ç‚¹å„¿Groovy™ì”术åQŒæ²¡æœ‰æ¯”˜q™å„¿æ›´ç®€å•的了ã€?strong>settings对象可用于ä“Q何集成到pom.xml中的Groovy脚本åQŒæ‰€ä»¥ä½ å¯åƒä½¿ç”¨ä¸€ä¸ªæ™®é€šå¯¹è±¡é‚£æ äh–¹ä¾¿åœ°ä½¿ç”¨å®ƒï¼Œå¦‚下½CÞZ¾‹åQ?br />
<plugin>
  
<groupId>org.codehaus.groovy.maven</groupId>
  
<artifactId>gmaven-plugin</artifactId>
  
<version>1.0-rc-5</version>
  
<executions>
    
<execution>
      
<id>process-db-scripts</id>
      
<phase>pre-integration-test</phase>
      
<goals>
        
<goal>execute</goal>
      
</goals> 
      
<configuration>
        
<source>
        def server = settings.servers.find{ it.id.equals('dbserver') }
        """groovy update-scripts.groovy -Ddb.username=${server.username} 
        -Ddb.password=${server.password}""".execute()
        
</source>
      
</configuration>
    
</execution>
  
</executions>
</plugin>
½Ž€å•!事实上,一旦你既知道如何访问顶¾U§å˜é‡ï¼ŒåˆçŸ¥é“如何访问settings.xml中的各个元素åQŒé‚£ä¹ˆå…¶åŠŸæ•ˆž®†ä¸å¯é™é‡ï¼åªéœ€è®îC½ä¸€å®šè¦ä½¿ä½ çš„æž„å»ÞZ¿æŒå¼¹æ€?-例如åQŒä¸è¦åœ¨settings.xmlæ–‡äšg中定义那些在pom.xmlæ–‡äšg中无有效默认值的属性ã€?br /> 如果你想学习更多关于应用Maven的酷炫方法,查看最新的来自于Sonatype的在¾U¿è¯¾½E?/a>。或者,ä¸ÞZº†æœ‰ä¸€ä¸ªæ›´å…·å…¨æ™¯çš„视角åQŒå¯ä»¥å‚åŠ?a >Java Power Tools bootcamp会议--很快在堪åŸÒŽ‹‰åQŒæ‚‰ž®û|¼Œå¸ƒé‡Œæ–¯ç­å’Œæƒ çµé¡¿ž®±æœ‰ç ”讨会了ã€?



Sha Jiang 2009-08-14 19:13 发表评论
]]>出错时的软äšgå¼€å?è¯?http://www.aygfsteel.com/jiangshachina/archive/2008/10/27/236562.htmlSha JiangSha JiangMon, 27 Oct 2008 00:44:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/10/27/236562.htmlhttp://www.aygfsteel.com/jiangshachina/comments/236562.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/10/27/236562.html#Feedback2http://www.aygfsteel.com/jiangshachina/comments/commentRss/236562.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/236562.html出错时的软äšgå¼€å?/strong>
在开发的˜q‡ç¨‹ä¸­æœ‰é”™è¯¯å‘生了,此时你该如何应对呢?John Ferguson Smart在他çš?a >最新博å®?/a>中提å‡ÞZº†ä¸€äº›æƒ³æ³•,大家可以参考一ä¸?2008.10.27最后更æ–?

    çŽîC»Šæ¯”以后ä“Q何时候,都需要开发者更加高效。极度高效。组¾l‡éœ€è¦æé«˜ä»Žå®ƒä»¬çš„开发项目中得到的附加å€û|¼Œòq¶ä¸”它们也乐于寻扑֮žçŽ°è¿™ä¸€ç›®æ ‡çš„æ–¹æ³•ã€?br /> 当然åQŒä½ å¯ä»¥é‡‡ç”¨ä¼ ç»Ÿçš„æ–¹æ³?-åŠªåŠ›å·¥ä½œã€‚äØ“äº†æ¶ˆé™¤é¡¹ç›®ä¸­ä¸å¯é¢„è§çš„ç—‡çŠÓž¼Œæ¯å¤©å·¥ä½œ16个小æ—Óž¼Œ˜q˜æ²¡æœ‰å‘¨æœ«ã€‚但做的更聪明一点儿åQŒä¼šä¸ä¼šæ›´å¥½äº›ï¼Ÿ
在引˜q›æ–°çš„实跉|–¹æ³•及改进现有æ–ÒŽ³•æ–šw¢æŠ•入的相对多一些,以ä‹É¾l„织能努力获得更多回报,˜q™å°±æ˜¯å¼€å‘çš„˜q‡ç¨‹ã€‚一般而言åQŒäº‹ç‰©ä¸­æœ‰è®¸å¤šæ–¹é¢éƒ½å¯ä»¥è¢«æ”¹˜q›ï¼Œä½†æ­¤å¤„有一些小½Hé—¨èƒ½ä‹É你的开发流½E‹æ›´åŠ åˆç†ï¼Œåªæ˜¯ä¸ÞZ½ å¼€ä¸ªå¤´¾|¢äº†ã€?br />
持箋集成(CI)通知½{–略的再思è€?br />     åˆ°ç›®å‰äØ“æ­¢ï¼Œæœ€é€šç”¨çš„CI通知机制ž®±æ˜¯é™ˆæ—§çš„邮件服务器。然而,你能肯定在你手边能完成这™å¹ä“Q务的最合适系¾lŸå°±æ˜¯ç”µå­é‚®ä»¶å—åQŸå°è¯•不使用电子邮äšgåQŒè€Œä‹É用即时消息去完成你的CI通知。记住,电子邮äšg易成ä¸ÞZ¸€¿Uå¹²æ‰?-如果你仅仅大¾U¦æ¯ä¸¤å°æ—¶æ‰æŸ¥é˜…一‹Æ¡é‚®ä»Óž¼Œä½ å°±ä¼šå˜å¾—十分高效。电子邮件只是,或至ž®‘是åQŒç”¨äºŽæž„建失è´?-äºÞZ»¬éœ€è¦?em>å¿«é€?/em>地知晓失败ä“Q务ã€?br />
¿U¯æžåœîC¼˜åŒ–æž„å»ø™¿‡½E?/strong>
    构徏度量(Build Metrics)是一¿Uç›‘æŽ§æž„å»ø™¿‡½E‹å¥åºïLжå†ëŠš„极好æ–ÒŽ³•ã€‚äØ“ä»€ä¹ˆè¿‡åŽ?周中åQŒä»£ç è¦†ç›–率一直在下降åQŸäؓ什么单元测试的数量òq¶æœªå‘ˆæœ‰è§„律的增长?ä¸ÞZ»€ä¹ˆè¦èŠÞp´¹å¾ˆé•¿çš„æ—¶é—´åŽ»ä¿®å¤˜q™æ ·çš„æž„建?˜qè¡Œå•å…ƒ‹¹‹è¯•需要多长时é—?-是否有一些测试需要执行过分长的时é—ß_¼Ÿ˜q™äº›ä¿¡æ¯òq‰™žåŽè€Œä¸å®žçš„东西--在不断改˜q›æž„廸™¿‡½E‹çš„工作中,它们都扮演着关键的角艌Ӏ‚现代CI工具åQŒå¦‚HudsonåQŒBambooå’ŒTeamCityåQŒèƒ½ä¸ºæž„建展½CÞZ¸°å¯Œçš„¾lŸè®¡ã€‚Bamboo在这斚w¢åšçš„ž®¤ä½³ã€‚æ— è®ÞZ½ æ­£ä‹É用何¿UCI工具åQŒéƒ½è¦å­¦ä¹ å¦‚何最大限度地使用它的报表ç‰ÒŽ€§ï¼Œòq¶ä‹É用这些特性去定位及修复开发过½E‹ä¸­è®¨åŽŒæ±¡ç‚¹ã€‚å¦‚æžœä½ çš„CI工具不能¾l™ä½ æ‰€éœ€è¦çš„全部信息åQŒé‚£ž®±æ‰¾ä¸€ä¸ªèƒ½åšåˆ°çš„ã€?br />
合理化发布过½E?/strong>
    在发布过½E‹ä¸­æœ‰è®¸å¤šå¿…做的工作åQŒå¦‚准备发行说明åQŒç¡®å®šè¯¥ç‰ˆæœ¬ä¸­å“ªäº›é—®é¢˜å·²è¢«è§£å†³äº†åQŒæ ‡è®°ç‰ˆæœ¬ï¼Œ½{‰ç­‰ã€‚这些都是èÊY件生命周期的重要部分åQŒå¦‚果你忽略了它们,QA们和最¾lˆç”¨æˆ·å¯èƒ½ä¼šå¾ˆç”Ÿæ°”。但要尽量自动地åŽÕdš˜q™äº›å·¥ä½œã€‚许多CI工具能很好地与问题追ítªç³»¾l?如JIRAå’ŒTrac)˜q›è¡Œé›†æˆåQŒä»¥ä¾¿ä½ èƒ½åŸºäºŽç‰ˆæœ¬æŽ§åˆ¶æ—¥å¿—看到某个问题是在哪‹Æ¡ç‰¹å®šçš„æž„徏中被解决的。如果你在ä‹É用EclipseåQŒMylyn能帮你将处理˜q‡çš„问题归æ€ÀLˆé€»è¾‘变化¾l„,òq¶ä‹É用标准的模板列出在某™å¹å·¥ä½œä¸­å·²è¢«è§£å†³çš?或仅是媄响到çš?问题。或者你可ä‹É用Subversionçš„hook脚本åŽÈ¡®ä¿æ¯‹Æ¡å‘Subversion做的提交都能对应åˆîC¸€ä¸ªæœ‰æ•ˆçš„问题¾~–号ã€?br />     ˜q™åªæ˜¯ä¸€äº›æƒ³æ³•çÅžäº?-˜q˜æœ‰æ›´å¤šã€‚底¾U¿å°±æ˜?-你不需要忍耐一个次理想的开发过½E?-相反åQŒè¦˜q›å…¥å…¶ä¸­åQŒåƈ做些能改˜q›å®ƒçš„事情。祝好运!



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ¾²°²Çø| ÃÉ×ÔÏØ| ÐÂç­ÏØ| Î÷ºÍÏØ| Ôý´ïÏØ| ÁúÃÅÏØ| ËÞÖÝÊÐ| ÓÀË³ÏØ| ²ìÑÅÏØ| ºéÔóÏØ| ÕÑÆ½ÏØ| ¹ó¶¨ÏØ| ÆæÌ¨ÏØ| ÀúÊ·| ÓÀ²ýÏØ| ͨ»¯ÊÐ| ÌÁ¹ÁÇø| ÇßÔ´ÏØ| ³¤°×| ¶ÀÉ½ÏØ| ÇßÑôÊÐ| ÍÁÄ¬ÌØ×óÆì| Æ¤É½ÏØ| µÂÑôÊÐ| ºþ¿ÚÏØ| ¶«ÄþÏØ| Ïâ»ÆÆì| Ò˾ýÏØ| ÓÀ·áÏØ| ¸Ê¹ÈÏØ| ÐÂÄþÏØ| Êè¸½ÏØ| ÄÛ½­ÏØ| ÎÌÔ´ÏØ| ½ðƽ| ÏçÄþÏØ| À³Î÷ÊÐ| ÄÇÆÂÏØ| ½­×ÎÏØ| ¸§ÄþÏØ| ÓÀ¼ÃÊÐ|