??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产精品va在线,国产亚洲精品一区二区,美女诱惑一区http://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。刚刚接触GradleQ看Cq篇文Q随手译了出?-) (2014.01.23最后更?

当今世界Q一z忙。在职业生和私人生zMQ我们中间的许多同时理多个目。你可能常常发现自己处于不知所措及失控的状态。保持规整ƈ专注于h值的关键是一个维护良好的工作清单。当Ӟ你可能L把你的Q务写在一张纸上,但是你也怸可能在你所处的M地方都可方便地获得这些工作条目?对互联网的访问几乎是无处不在的,无论是通过你的Ud电话Q还是公q|络接入炏V在<Gradle in Action>一书中Q如?所C的说明性示例是一个很有吸引力的可视化Web应用?/span>

? To Do应用可以通过互联|进行访问,q用它ȝ理数据存储中的工作条?/strong>


Gradle插g表现的如同一个能器Q它会自动地执行q些d。一个插仉过引入特定领域的规范以及对~省值敏感的dd工程q行扩展。随Gradle发布的插件之一是Java插g。该Java插gl不仅仅是提供了源码~译和打包这L基础功能。它为工E徏立了一整套标准的目录布局Q它会确保以正确的顺序去执行dQ这Pq些d在Java工程环境中才是有意义的。现在是时候ؓ我们的应用去创徏一个构本ƈM用这个Java插g了?/span>

构徏Java应用
一开始,每个Gradle工程都会创徏一个名为build.gradle的构本。ؓ了创脚本Qƈ告诉该工E用Java插gQ应该像q样dQ?/span>
apply plugin: 'java'
Z构徏你的Java代码Q一行代码就够了。但Gradle怎么知道d儿找你的源文件呢Q该Java插g引入的规范之一是源代码的路径。默认地Q该插g会到目录src/main/java中搜M品的源代码?/span>

构徏Web应用
通过War插gQGradle也提供了构徏Web应用的扩展支持。War插g扩展了Java插gQ它加入了针对Web应用E序开发的规范Qƈ支持归集WAR文g。让我们也在q个工程中用用War插gQ?/span>
apply plugin: 'war'
Web应用源文件的默认路径是src/main/webapp。假设你已经明确了该应用所必要的JavacR那么要使品的全部源代码和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形式的动态脚本化视图lg

声明外部依赖
在实现这个Web应用的过E,我们使用的一些类Q例如javax.servlet.HttpServletQƈ非Java标准?Java SE)的一部分。在构徏工程之前Q我们需要确保已l声明了q些外部依赖。在Javapȝ中,依赖cd是以JAR文g的Ş式去发布和用的。许多类库可以从仓库Q如一个文件系l或中央服务器,中获得。ؓ了用依赖,Gradle要求你至定义一个仓库。出于一些考虑Q我们将使用公共的可通过互联|进行访问的Maven Central仓库?/span>
repositories {
   mavenCentral()                   #A
}
#A 通过http://repo1.maven.org/maven2讉KMaven2中央仓库的简短标?/span>
在Gradle中,依赖是通过配置Ҏq行分组的。我们将来Servlet依赖使用的配|项是providedCompile。该配置用于那些在~译时而非q行时所需的依赖。像JSTLq样的运行时依赖Q在~译时不会被用到Q但在运行时则会被用到。它们都会成为WAR文g的一部分。下面的配置语句块声明了我们应用所需的外部类库:
dependencies {
   providedCompile 'javax.servlet:servlet-api:2.5'
   runtime 'javax.servlet:jstl:1.1.2'
}

构徏工程
我们已经准备好构个工E了。另到工E中的一个Java插gd名ؓ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包括类文gQ测试报告,归集的WAR文gQ以及像manifestq样的在打包旉要的临时文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 包含JavacL件的默认目录
#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插gQ它提供的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+Cd止这个应用之前,Gradle会让它一直运行。Jetty如何知道使用哪个端口和上下文环境去运行这个Web应用Q再说一遍,q就是规范。Jettyq行Web应用所使用的默认端口就?080?/span>

ȝ
只需要较的努力Q你可以用GradleL建ƈq行一个Java Web应用。只要你严格遵@标准目录l构Q那么你的构本仅需要两行代码?/span>


Sha Jiang 2014-01-23 21:22 发表评论
]]>
最大限度利用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的一些鲜Zh知的技巧,希望对大家也有所助益?2009.08.14最后更?

如果你在ME度中用过MavenQ你应该知道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 /> 很少Zh所知,或至是很少被用的功能是,在你的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脚本来做qg事情Q但它需要以命o行参数的形式提供用户名和密码。在集成试阶段之前Q你应如何用定义在settings.xml中的用户名和密码呢?是的Q只需一点儿Groovy术Q没有比q儿更简单的了?strong>settings对象可用于Q何集成到pom.xml中的Groovy脚本Q所以你可像使用一个普通对象那h便地使用它,如下CZQ?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尝试不使用电子邮gQ而用即时消息去完成你的CI通知。记住,电子邮g易成ZU干?-如果你仅仅大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如HudsonQBamboo和TeamCityQ能为构建展CZ富的l计。Bamboo在这斚w做的佳。无Z正用何UCI工具Q都要学习如何最大限度地使用它的报表Ҏ,q用这些特性去定位及修复开发过E中讨厌污点。如果你的CI工具不能l你所需要的全部信息Q那找一个能做到的?br />
合理化发布过E?/strong>
    在发布过E中有许多必做的工作Q如准备发行说明Q确定该版本中哪些问题已被解决了Q标记版本,{等。这些都是Y件生命周期的重要部分Q如果你忽略了它们,QA们和最l用户可能会很生气。但要尽量自动地dq些工作。许多CI工具能很好地与问题追t系l?如JIRA和Trac)q行集成Q以便你能基于版本控制日志看到某个问题是在哪ơ特定的构徏中被解决的。如果你在用EclipseQMylyn能帮你将处理q的问题归L逻辑变化l,q用标准的模板列出在某工作中已被解决?或仅是媄响到?问题。或者你可用Subversion的hook脚本ȝ保每ơ向Subversion做的提交都能对应C个有效的问题~号?br />     q只是一些想法Ş?-q有更多。底U就?-你不需要忍耐一个次理想的开发过E?-相反Q要q入其中Qƈ做些能改q它的事情。祝好运!



Sha Jiang 2008-10-27 08:44 发表评论
]]>
վ֩ģ壺 | ƽ| ˮ| ɽ| ӡ| | | ˫Ѽɽ| ű| | | | | | ȫ| ˳| | | غ| | żҿ| γ| ɽ| | | | | | Ϫ| ͼ| ʩ| Ϫ| | ٸ| | | | | ½| | ̳|