<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應(yīng)用
    本文是發(fā)布在java.net上的一篇摘自于<Gradle in Action>一書中的節(jié)選,介紹了使用Gradle構(gòu)建Java Web應(yīng)用的過程。剛剛接觸Gradle,看到了這篇小文,隨手譯了出來:-) (2014.01.23最后更新)

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

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


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

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

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

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

    構(gòu)建工程
    我們已經(jīng)準備好構(gòu)建這個工程了。另到工程中的一個Java插件任務(wù)名為build。該任務(wù)將編譯源代碼,運行測試程序并歸集WAR文件--所有的這些任務(wù)都將以正確的順序被執(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插件提供的任務(wù),用于歸集WAR文件
    #C 編譯Java測試源代碼
    #D 運行單元測試

    上述輸出的每一行都代表執(zhí)行了一個由Java或War插件提供的任務(wù)。你可能會注意到,有一些任務(wù)被標記為UP-TO-DATE。它的意思是指該任務(wù)被跳過去了。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應(yīng)用。

    運行應(yīng)用
    在本地機器中運行一個Web應(yīng)用應(yīng)該很容易,能夠?qū)嵺`快速應(yīng)用開發(fā)(RAD),并能夠提供快速的啟動時間。最棒地是,它不要求你部署一個Web容器運行時環(huán)境。Jetty一個流行的輕量級開源Web容器,它支持前面提到的所有特性。在這個Web應(yīng)用中加入一個HTTP模塊,它就變成了一個嵌入式實現(xiàn)。Gradle的Jetty插件擴展了War插件,它提供的任務(wù)可以將一個Web應(yīng)用部署到嵌入式容器中,并能夠啟動該應(yīng)用。在你的構(gòu)建腳本中,可以像如下那樣使用這個插件:
    apply plugin: 'jetty'
    這個將被我們用于啟動Web應(yīng)用的任務(wù)名為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應(yīng)用的行為。圖2展示在一個瀏覽器中查看到該應(yīng)用界面的截屏。

    圖2 To Do應(yīng)用的Web界面及其行為

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


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

    評論

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

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

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

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

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

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

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

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

    主站蜘蛛池模板: 精品免费视在线观看| 久久国产一片免费观看| 99在线精品免费视频九九视 | 免费人成视频x8x8入口| 羞羞漫画登录页面免费| 亚洲国产一区视频| 亚洲AV无码乱码精品国产| 国产精品亚洲а∨天堂2021| 日韩a级毛片免费视频| 亚洲成A人片在线观看无码不卡| 中文字幕在线免费播放| 67194成是人免费无码| 亚洲精品乱码久久久久久自慰| 国产午夜亚洲精品| 日韩免费的视频在线观看香蕉| 免费国产小视频在线观看| 无忧传媒视频免费观看入口| 永久免费毛片在线播放| 亚洲日韩精品无码专区加勒比| 无码国产精品一区二区免费16| 亚洲最新在线视频| 免费A级毛片无码A∨中文字幕下载| 免费国产成人午夜电影| 91免费国产视频| 在线精品亚洲一区二区三区| 国产AV无码专区亚洲AV麻豆丫 | 国产亚洲日韩一区二区三区| 精品在线免费观看| 亚洲sss综合天堂久久久| 2015日韩永久免费视频播放| 99999久久久久久亚洲| 亚洲国产精品无码久久青草| 久久爰www免费人成| 亚洲综合久久精品无码色欲| 亚洲国产精品自产在线播放 | 丁香花在线观看免费观看| 人人爽人人爽人人片A免费| 亚洲国产精品人久久| 国产精品va无码免费麻豆| 一本色道久久88亚洲精品综合| 免费福利在线播放|