jspc

已棄用

如果您使用此任務搭配 Tomcat 的 Jasper JSP 編譯器,您應該認真考慮改用 Tomcat 附帶的任務。此任務僅針對 Tomcat 4.x 進行測試。已知 Tomcat 5.x 有 Ant 無法修復的問題,請改用 Tomcat 的 jspc 任務。
建議您部署原始檔案 (*.jsp) 並使用容器內建功能,而非依賴特定於容器的 JSP 編譯器:部署後,針對已部署的 Web 應用程式執行測試套件(例如使用 CactusHttpUnit)。這樣您就能獲得測試結果已編譯的 JSP。

說明

Apache Ant 任務,用於執行 JSP 編譯器並將 JSP 頁面轉換為 Java 原始檔。

此任務可用於預先編譯 JSP 頁面,以快速執行 JSP 頁面的初始呼叫、在未安裝完整 JDK 的伺服器上部署,或僅在不部署頁面的情況下檢查頁面語法。在多數情況下,javac 任務通常是建置程序中的下一個階段。此任務會執行基本相依性檢查以防止不必要的重新編譯—此檢查會比較原始檔和目標檔的時間戳記,且不會考量類別或標籤庫相依性,或 <jsp:include> 參照。

此任務預設使用 Jasper JSP 編譯器。這表示此任務需要 jasper.jarjasper-runtime.jar,這些檔案會隨附 Apache Tomcat 專案 中的 Tomcat 4/Catalina 建置,以及未來版本中可能需要的任何其他 jar 檔案(會變更)。

我們建議(2003 年 3 月)使用 Tomcat 版本 4.1.x,以取得最穩定的 Jasper 版本。

此任務有許多限制,部分來自於 Jasper 的許多版本,其他則來自於任務中的實作「問題」(例如沒有人願意徹底變更任務的大部分內容,以解決 Jasper 的問題)。由於這個原因,以及 JSP 頁面不一定要在實作之間(或實作版本之間)具有可攜性的事實,因此此任務較適合用於在部署之前驗證 JSP 頁面,而非預先編譯它們。對於後者,只要在部署後部署並執行 HttpUnit JUnit 測試,即可一次完成編譯和測試頁面。

參數

此任務具有下列屬性

屬性 說明 必要
destdir 放置產生檔案的位置。它們會根據指定的套件名稱放置在此目錄下。
srcdir 尋找原始檔 JSP 檔案的位置。
verbose 傳遞給編譯器的詳細資料整數。 否;預設 0
package 產生 Java 類別的目標套件名稱。
compiler JSP 編譯器轉接器的類別名稱,例如 jasperjasper41 否;預設為 jasper
ieplugin Internet Explorer 的 Java Plugin classid。
mapped (布林值)為 JSP 中的每行 HTML 產生個別的 write() 呼叫。
classpath 用於執行 JSP 編譯器的類別路徑。 否,但使用時似乎效果較好;也可以由巢狀元素 classpath 指定。
classpathref 一個 參考。依據 classpath
failonerror 控制編譯失敗動作的旗標。 否;預設 yes
uribase JSP 中相對 URI 參考的內容。 否;根據檔案相對於 uriroot 宣告或推導值的相對位置推導。
uriroot URI 應解析的根目錄。
compiler 要使用的 JSP 編譯器適配器的類別名稱。 否;預設為 Jasper 的標準適配器
compilerclasspath 用於尋找 compiler 屬性指定的編譯器適配器的類別路徑。
webinc 列出 Servlet 的 web.xml 部分的輸出檔名。
webxml 要產生的 web.xml 檔名

如果將 mapped 選項設定為 true,它會將 JSP 文字內容分割成每行一個呼叫的格式。在映射的寫入呼叫上方和下方有註解,以標示 JSP 檔案中每一行文字的來源。這可能會導致效能略微下降(但受限於線性複雜度)。如果不使用這個選項,所有相鄰的寫入會串接成單一寫入。

<jsp:plugin> 標籤使用 ieplugin 選項。如果您想要使用的 Java Plug-in COM Class-ID 變更,可以在這裡指定。這不需要變更。

uriroot 指定 Web 應用程式的根目錄。這是所有絕對 URI 將解析的來源。如果未指定,則會使用第一個 JSP 頁面來推導。若要推導它,系統會搜尋第一個 JSP 頁面的每個父目錄是否有 WEB-INF 目錄,並使用最接近 JSP 頁面且有該目錄的目錄。如果找不到,則會使用呼叫 Jasperc 的目錄。這只會影響從明確宣告的 JSP 檔案翻譯的頁面,包括對標籤庫的參考。

uribase 用於建立 JSP 頁面中相對 URI 參考的內容。如果不存在,則會根據檔案相對於 uriroot 宣告或推導值的相對位置推導。這只會影響從明確宣告的 JSP 檔案翻譯的頁面。

以巢狀元素指定參數

此任務是一個 基於目錄的任務,例如 javac,因此要編譯的 .jsp 檔案會像 javac.java 檔案一樣放置。也就是說,元素(例如 includesexcludes)可以直接用在任務宣告內。

jspc 任務的特定元素是

classpath

用於編譯 JSP 頁面的類別路徑,指定方式與其他類別路徑相同。

classpathref

現有類別路徑的參考

webapp

指示 Jasper 建立整個 Web 應用程式的指令。基本目錄必須在其下方有一個 WEB-INF 子目錄。使用時,任務會將所有相依性檢查交給編譯器。

屬性 說明 必要
basedir Web 應用程式的基本目錄

範例

src/war 下的所有 .jsp 檔案建置到目標 /gensrc 中,並使用從 com.i3sp.jsp 開始的封裝層級。

<jspc srcdir="${basedir}/src/war"
      destdir="${basedir}/gensrc"
      package="com.i3sp.jsp"
      compiler="jasper41"
      verbose="9">
  <include name="**/*.jsp"/>
</jspc>

.jsp 檔案產生 .java 檔案,然後使用 javac 將它們轉換成位元組碼。在 Java 編譯中包含 lib/taglibs.jar。相依性檢查用於清除 .java 檔案(如果類別相依性指出有需要的話)。

<jspc destdir="interim"
      verbose="1"
      srcdir="src"
      compiler="jasper41"
      package="com.i3sp.jsp">
  <include name="**/*.jsp"/>
</jspc>
<depend srcdir="interim"
         destdir="build"
         cache="build/dependencies"
         classpath="lib/taglibs.jar"/>
<javac srcdir="interim"
         destdir="build"
         classpath="lib/taglibs.jar"
         debug="on"/>

注意事項

使用 package 屬性可以辨識結果的 .java 檔案,並因此執行完整的相依性檢查—此任務應該只在 .jsp 檔案已修改時才重新建置 .java 檔案。不過,這只適用於某些版本的 Jasper。預設檢查支援使用 jasper 編譯器的 Tomcat 4.0.x,將編譯器設定為 jasper41 以進行 Tomcat 4.1.x 相依性檢查。即使在它運作時,.tld 匯入或編譯時間包含的變更也不會被選取。

Jasper 會根據 JSP 1.2 規格產生 JSP 頁面—類別路徑上需要 servlet 規格版本 2.3 的副本才能編譯 Java 程式碼。