<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    John Jiang

    a cup of Java, cheers!
    https://github.com/johnshajiang/blog

       :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理 ::
      131 隨筆 :: 1 文章 :: 530 評論 :: 0 Trackbacks
    使用Gradle構(gòu)建Java Web應用
    本文是發(fā)布在java.net上的一篇摘自于<Gradle in Action>一書中的節(jié)選,介紹了使用Gradle構(gòu)建Java Web應用的過程。剛剛接觸Gradle,看到了這篇小文,隨手譯了出來:-) (2014.01.23最后更新)

    當今世界,一派繁忙。在職業(yè)生涯和私人生活中,我們中間的許多人要同時管理多個項目。你可能常常發(fā)現(xiàn)自己處于不知所措及失控的狀態(tài)。保持規(guī)整并專注于價值的關(guān)鍵是一個維護良好的工作清單。當然,你可能總是把你的任務寫在一張紙上,但是你也許不可能在你所處的任何地方都可方便地獲得這些工作條目?對互聯(lián)網(wǎng)的訪問幾乎是無處不在的,無論是通過你的移動電話,還是公共的網(wǎng)絡接入點。在<Gradle in Action>一書中,如圖1所示的說明性示例是一個很有吸引力的可視化Web應用。

    圖1 To Do應用可以通過互聯(lián)網(wǎng)進行訪問,并使用它去管理數(shù)據(jù)存儲中的工作條目


    Gradle插件表現(xiàn)的如同一個使能器,它會自動地執(zhí)行這些任務。一個插件通過引入特定領(lǐng)域的規(guī)范以及對缺省值敏感的任務去對工程進行擴展。隨Gradle發(fā)布的插件之一就是Java插件。該Java插件絕不僅僅是提供了源碼編譯和打包這樣的基礎(chǔ)功能。它為工程建立了一整套標準的目錄布局,它會確保以正確的順序去執(zhí)行任務,這樣,這些任務在Java工程環(huán)境中才是有意義的。現(xiàn)在是時候為我們的應用去創(chuàng)建一個構(gòu)建腳本并去使用這個Java插件了。

    構(gòu)建Java應用
    一開始,每個Gradle工程都會創(chuàng)建一個名為build.gradle的構(gòu)建腳本。為了創(chuàng)建該腳本,并告訴該工程使用Java插件,應該像這樣去做:
    apply plugin: 'java'
    為了構(gòu)建你的Java代碼,一行代碼就夠了。但Gradle怎么知道去哪兒找你的源文件呢?該Java插件引入的規(guī)范之一就是源代碼的路徑。默認地,該插件會到目錄src/main/java中搜尋產(chǎn)品的源代碼。

    構(gòu)建Web應用
    通過War插件,Gradle也提供了構(gòu)建Web應用的擴展支持。War插件擴展了Java插件,它加入了針對Web應用程序開發(fā)的規(guī)范,并支持歸集WAR文件。讓我們也在這個工程中用用War插件:
    apply plugin: 'war'
    Web應用源文件的默認路徑是src/main/webapp。假設你已經(jīng)明確了該應用所必要的Java類。那么要使產(chǎn)品的全部源代碼和Web資源文件處于正確路徑下,該工程的目錄布局應該像下面這樣:
    .
    ├── 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源文件默認目錄
    #B Web應用描述符文件
    #C 存儲描述如何展現(xiàn)HTML元素的樣式單文件的目錄
    #D 存放JSP形式的動態(tài)腳本化視圖組件

    聲明外部依賴
    在實現(xiàn)這個Web應用的過程,我們使用的一些類,例如javax.servlet.HttpServlet,并非Java標準版(Java SE)的一部分。在構(gòu)建工程之前,我們需要確保已經(jīng)聲明了這些外部依賴。在Java系統(tǒng)中,依賴類庫是以JAR文件的形式去發(fā)布和使用的。許多類庫可以從倉庫,如一個文件系統(tǒng)或中央服務器,中獲得。為了使用依賴,Gradle要求你至少定義一個倉庫。出于一些考慮,我們將使用公共的可通過互聯(lián)網(wǎng)進行訪問的Maven Central倉庫。
    repositories {
       mavenCentral()                   #A
    }
    #A 通過http://repo1.maven.org/maven2訪問Maven2中央倉庫的簡短標記
    在Gradle中,依賴是通過配置項來進行分組的。我們將來Servlet依賴使用的配置項是providedCompile。該配置項用于那些在編譯時而非運行時所需的依賴。像JSTL這樣的運行時依賴,在編譯時不會被用到,但在運行時則會被用到。它們都會成為WAR文件的一部分。下面的配置語句塊聲明了我們應用所需的外部類庫:
    dependencies {
       providedCompile 'javax.servlet:servlet-api:2.5'
       runtime 'javax.servlet:jstl:1.1.2'
    }

    構(gòu)建工程
    我們已經(jīng)準備好構(gòu)建這個工程了。另到工程中的一個Java插件任務名為build。該任務將編譯源代碼,運行測試程序并歸集WAR文件--所有的這些任務都將以正確的順序被執(zhí)行。執(zhí)行命令gradle build之后,你可能會得到形如下面的輸出:
    $ 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 編譯產(chǎn)品的Java源代碼
    #B War插件提供的任務,用于歸集WAR文件
    #C 編譯Java測試源代碼
    #D 運行單元測試

    上述輸出的每一行都代表執(zhí)行了一個由Java或War插件提供的任務。你可能會注意到,有一些任務被標記為UP-TO-DATE。它的意思是指該任務被跳過去了。Gradle的增量構(gòu)建支持策略會自動識別不需要執(zhí)行的工作。特別是在大型商業(yè)項目中,該特性會極大地節(jié)省時間。
    在該工程的根節(jié)目錄中,你將會發(fā)現(xiàn)一個名為build的子目錄,它包含有執(zhí)行構(gòu)建之后的全部輸出,包括類文件,測試報告,歸集的WAR文件,以及像manifest這樣的在打包時需要的臨時文件。如下就是執(zhí)行構(gòu)建工作之后的工程目錄結(jié)構(gòu):
    .
    ├── 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類文件的默認目錄
    #B 歸集的WAR文件
    #C 用于WAR的臨時manifest文件
    你已經(jīng)知道如何從一個基于標準目錄結(jié)構(gòu)的Web工程去構(gòu)建WAR文件。現(xiàn)在是時候?qū)⑺际鸬揭粋€Servlet容器中去了。在下一節(jié)中,我們將在本地開發(fā)機器中啟動Jetty去運行這個Web應用。

    運行應用
    在本地機器中運行一個Web應用應該很容易,能夠?qū)嵺`快速應用開發(fā)(RAD),并能夠提供快速的啟動時間。最棒地是,它不要求你部署一個Web容器運行時環(huán)境。Jetty一個流行的輕量級開源Web容器,它支持前面提到的所有特性。在這個Web應用中加入一個HTTP模塊,它就變成了一個嵌入式實現(xiàn)。Gradle的Jetty插件擴展了War插件,它提供的任務可以將一個Web應用部署到嵌入式容器中,并能夠啟動該應用。在你的構(gòu)建腳本中,可以像如下那樣使用這個插件:
    apply plugin: 'jetty'
    這個將被我們用于啟動Web應用的任務名為jettyRun。它甚至可以在無需創(chuàng)建WAR文件的情況下啟動一個Jetty容器。執(zhí)行上述命令后會得到如下形式的輸出:
    $ gradle jettyRun
    :compileJava
    :processResources UP-TO-DATE
    :classes
    > Building > :jettyRun > Running at http://localhost:8080/todo-webapp-jetty
    在上述輸出的最后一行中,該插件告訴了你Jetty即將偵聽的請求地址。打開一個你喜歡的瀏覽器,并輸入上述地址。最后,我們會看到這個To Do Web應用的行為。圖2展示在一個瀏覽器中查看到該應用界面的截屏。

    圖2 To Do應用的Web界面及其行為

    在你通過組合鍵CTRL+C去停止這個應用之前,Gradle會讓它一直運行。Jetty如何知道使用哪個端口和上下文環(huán)境去運行這個Web應用?再說一遍,這就是規(guī)范。Jetty運行Web應用所使用的默認端口就是8080。


    總結(jié)
    只需要較少的努力,你就可以使用Gradle去構(gòu)建并運行一個Java Web應用。只要你嚴格遵循標準目錄結(jié)構(gòu),那么你的構(gòu)建腳本僅需要兩行代碼。
    posted on 2014-01-23 21:22 John Jiang 閱讀(14297) 評論(8)  編輯  收藏 所屬分類: Java翻譯Build

    評論

    # re: 使用Gradle構(gòu)建Java Web應用(譯) 2014-01-24 06:38 魏五鎖業(yè)
    期待博主更新文章。  回復  更多評論
      

    # re: 使用Gradle構(gòu)建Java Web應用(譯) 2014-01-24 20:17 海邊沫沫
    我才剛開始上手Maven。博主就給我評論告訴我現(xiàn)在流行Gradle了。
    我也時常有把看到的比較好的英文文章翻譯出來的沖動,奈何精力有限,光看不練。
    向博主學習。  回復  更多評論
      

    # re: 使用Gradle構(gòu)建Java Web應用(譯) 2014-01-26 21:29 Sha Jiang
    @海邊沫沫
    我每月寫一篇而已,不花多少時間^_^  回復  更多評論
      

    # re: 使用Gradle構(gòu)建Java Web應用(譯) 2014-02-03 13:51 Unmi
    還是沒看見身邊有誰正在使用  回復  更多評論
      

    # re: 使用Gradle構(gòu)建Java Web應用(譯)[未登錄] 2015-03-07 14:22 ma
    @Unmi
    那是你身邊的人水平不行吧  回復  更多評論
      

    # re: 使用Gradle構(gòu)建Java Web應用(譯) 2015-08-28 15:30 啊大
    怎么進行debug調(diào)試呢。  回復  更多評論
      

    # re: 使用Gradle構(gòu)建Java Web應用(譯)[未登錄] 2015-10-16 11:21 simon
    查了一些資料,gradle是支持增量編譯的,不知道可以打增量包么?   回復  更多評論
      

    # re: 使用Gradle構(gòu)建Java Web應用(譯) 2015-12-28 10:56 曾經(jīng)
    能不能再詳細些  回復  更多評論
      

    主站蜘蛛池模板: 两个人看的www高清免费视频 | 免费萌白酱国产一区二区三区 | 亚洲日韩区在线电影| 九九热久久免费视频| 国产亚洲精品无码拍拍拍色欲| 精品成人一区二区三区免费视频| 日本无吗免费一二区| 美女黄频a美女大全免费皮| 免费夜色污私人影院在线观看| 无码 免费 国产在线观看91| 亚洲视频一区二区| 久久九九全国免费| 亚洲精品第五页中文字幕| 国产啪精品视频网免费| 亚洲AV无码一区二区乱子仑 | 九九视频高清视频免费观看 | 中文字幕永久免费| 亚洲精品综合一二三区在线| 1000部无遮挡拍拍拍免费视频观看| 亚洲人成网站18禁止久久影院 | 91视频免费观看高清观看完整| 久久综合日韩亚洲精品色| 4虎1515hh永久免费| 亚洲国产成人久久一区二区三区| 免费乱理伦在线播放| 99久久免费国产精精品| 亚洲精品网站在线观看你懂的| 免费无码看av的网站| 国产精品免费久久| 亚洲va成无码人在线观看| 免费又黄又爽的视频| 日本中文字幕免费高清视频| 亚洲一区二区三区91| 亚洲Aⅴ无码一区二区二三区软件| 免费看无码特级毛片| 亚洲国产精品精华液| 亚洲国产精品一区二区第一页| 无码永久免费AV网站| 久久www免费人成精品香蕉| 亚洲国产夜色在线观看| 亚洲精品无码久久不卡|