本章說明 Sun GlassFish Enterprise Server 2.1.1 軟體的已知問題以及相關的解決方案。這些問題特別會影響建立於 Sun GlassFish Enterprise Server 2.1 上的通訊伺服器。如果沒有看到指出特定平台的摘要聲明,表示這個問題會發生在所有平台上。這些資訊按以下章節進行分類:
本節介紹已知的管理問題以及相關的解決方案。
叢集建立時,Communications Server 會為其隨機指定 1026 到 45556 之間的活動訊號連接埠。對於預設叢集 (亦即 Communications Server 安裝所建立的預設叢集),系統會隨機選取介於 0 至 45556 之間的數字。叢集建立程序不會精確偵測是否已有其他服務使用該活動訊號連接埠。
如果自動叢集建立配置選取了與另一服務 (已使用該連接埠) 衝突的活動訊號連接埠,請將叢集活動訊號連接埠更新為系統未使用的連接埠。
要變更叢集的活動訊號連接埠,請使用下列 asadmin 指令:
asadmin set cluster-name.heartbeat-port= newportnumber
在執行 64 位元 Linux 的 NFS 伺服器上,asadmin create-domain 指令在嘗試於掛載 Network File System (NFS) 的檔案系統上建立網域時可能會失敗。
無已知解決方案。
自動重建大型記錄檔時,觀察到回應時間略為增加的情形。
修改記錄程式設定中「檔案自動重建限制」和「檔案自動重建時間限制」的值,可以將效能降低情形減至最低。這些特性的值會視您的應用程式和環境而定。
針對 IBM Message Queue 產品部署常規 RA 配接卡失敗。server.policy 檔案授予的權限如下。
grant { permission java.util.logging.LoggingPermission "control"; permission java.util.PropertyPermission "*", "read,write"; } |
變更 server.policy 檔案中的權限,如下所示:
grant codeBase "file:${com.sun.aas.installRoot}/lib/install/applications/adminapp/-" { permission java.util.logging.LoggingPermission "control"; }; |
在某些情況下,系統會將安裝在 DAS 上但需與特定實例同步的檔案,真的傳送至其他實例。
無已知解決方案。
即使啟動期間失敗的元件並不重要,asadmin start-cluster 指令仍會顯示過多訊息。請參閱下列不重要元素 (與叢集中的實例有關) 失敗時產生的指令輸出範例:
./asadmin start-cluster --port 9898 cluster1 Please enter the admin user name>admin Please enter the admin password> The clustered instance, instance2, was successfully started. error 0 [#|2008-07-17T14:58:16.496+0200|WARNING|sun-appserver9.1|javax.jms| _ThreadID=10;_ThreadName=main; _RequestID=90bbbe3a-d654-4480-b295-7e317d945a4a;|[C4003]: Error occurred on connection creation [localhost:37676]. - cause: java.net.ConnectException: Connection refused|#] error 1 [#|2008-07-17T14:58:17.517+0200|WARNING|sun-appserver9.1|javax.jms| _ThreadID=10;_ThreadName=main; _RequestID=90bbbe3a-d654-4480-b295-7e317d945a4a;|[C4003]: Error occurred on connection creation [localhost:37676]. - cause: java.net.ConnectException: Connection refused|#] error 2 [#|2008-07-17T14:58:30.596+0200|WARNING|sun-appserver9.1| javax.enterprise.system.container.ejb| _ThreadID=13;_ThreadName=pool-1-thread-4;TimerBean; _RequestID=5954a044-df06-4a3e-902a-0c40b4b6cddb; |EJB5108:Unable to initialize EJB Timer Service. The likely cause is the database has not been started or the timer database table has not been created.|#] error 3 [#|2008-07-17T14:58:32.512+0200|WARNING|sun-appserver9.1| javax.enterprise.resource.resourceadapter|_ThreadID=10;_ThreadName=main; __CallFlowPool;_RequestID=90bbbe3a-d654-4480-b295-7e317d945a4a;| RAR5005:Error in accessing XA resource with JNDI name [__CallFlowPool] for recovery|#] The clustered instance, instance1, was successfully started. error 0 [#|2008-07-17T14:58:21.117+0200|WARNING|sun-appserver9.1| javax.enterprise.system.container.ejb| _ThreadID=13;_ThreadName=pool-1-thread-4;TimerBean; _RequestID=30827d9a-72ac-4854-b216-06494b6a9fb5; |EJB5108:Unable to initialize EJB Timer Service. The likely cause is the database has not been started or the timer database table has not been created.|#] error 1 [#|2008-07-17T14:58:23.106+0200|WARNING|sun-appserver9.1| javax.enterprise.resource.resourceadapter| _ThreadID=10;_ThreadName=main;__CallFlowPool; _RequestID=b41d76fa-0203-49f7-a2ae-83bf242d3e7a; |RAR5005:Error in accessing XA resource with JNDI name [__CallFlowPool] for recovery|#] Command start-cluster executed successfully. |
無已知解決方案。可以略過這些 (異常) 訊息。
依預設,在 as-install/lib/package-appclient.xml 中,asenv.conf 指向的 domain1 之 AS_ACC_CONFIG 變數有一個程序內定值。如果刪除 domain1 並建立新網域,則不會使用新網域名稱更新 AS_ACC_CONFIG 變數,這將導致 package-appclient 程序檔失敗。
執行下列動作之一:
保留 domain1 的完整,並在周圍建立其他網域。
移除 domain1 並使用新網域名稱替代 as-install/lib/package-appclient.xml 中 domain1 的程序內定值。
如果沒有 domain1,則每次建立新網域時均必須執行此作業。
在 Application Server 上可以配置 J2SE 1.4.x、5.0 或更高版本。啟動 JMX 代理程式是 J2SE 5.0 平台不可或缺的功能。如果您在伺服器啟動時明確設定系統特性,則會啟動此功能。
範例值包含︰
name="com.sun.management.jmxremote" value="true" name="com.sun.management.jmxremote.port" value="9999" name="com.sun.management.jmxremote.authenticate" value="false" name="com.sun.management.jmxremote.ssl" value="false" |
在配置 JMX 特性並啟動伺服器之後,會在 Application Server Virtual Machine 上啟動新的 jmx-connector 伺服器。此作業會產生不良副作用,即負面影響管理功能,並且 Application Server 管理主控台和指令行介面可能會產生未預期的結果。問題在於在內建 jmx-connector 伺服器和新的 jmx-connector 伺服器之間存在某些衝突。
在使用 jconsole (或其他任何 JMX-compliant 用戶端) 時,考量重複使用透過 Application Server 啟動程序檔啟動的標準 JMX 連接器伺服器。
伺服器啟動後,server.log 中會顯示與下行類似的文字。您可連接至其中指定的 JMXService URL,並在成功提供憑證之後執行相同的管理/配置作業,例如:
[#|2004-11-24T17:49:08.203-0800|INFO|sun-appserver-ee8.1| javax.enterprise.system.tools.admin|_ThreadID=10;|ADM1501: Here is the JMXServiceURL for the JMXConnectorServer: [service:jmx:rmi:///jndi/rmi://hostname:8686/management/ rmi-jmx-connector]. This is where the remote administrative clients should connect using the JSR 160 JMX Connectors.|#] |
在文件中未說明 .asadmintruststore 檔案。如果伺服器管理員的 home 目錄中不存在此檔案,則升級在此伺服器上代管的某些應用程式時,可能會遇到嚴重錯誤。
如果可能,應由安裝此伺服器的使用者執行 asadmin start-domain domain1 指令。
如果未由該使用者執行,則應從安裝使用者的 home 目錄中,將 .asadmintruststore 移動或複製到執行使用者的 home 目錄。
請注意,如果將此檔案從安裝使用者的 home 目錄移動 (而非複製) 到執行使用者的 home 目錄,您可能會遇到應用程式升級問題 (例如在錯誤 6309079、6310428 和 6312869 中說明的問題),因為在升級/安裝使用者 (在 Java ES 中一般為 root) 的 home 目錄中將不再包含 .asadminstruststore 檔案。
Communications Server 叢集實例的預設 MQ 整合模式為 LOCAL。當 Communications Server 的安裝位置 (PATH) 很長 (顯示為「not short」) 時,imqbrokerscv.exe 便會在叢集實例啟動時當機。此問題屬於 imqbrokersvc 中的記憶體分配問題。
叢集實例的 JMS 服務類型必須從預設的 LOCAL 變更為 REMOTE。在此配置中,所有實例都指回 DAS 代理程式。請依照以下說明在 REMOTE 模式中配置叢集。
當使用 REMOTE 模式時,所有實例均使用一個代理程式 (DAS),因此在 Communications Server 叢集啟動時,不會建立任何代理程式叢集。如需詳細資訊,請參閱 http://www.glassfishwiki.org/gfwiki/attach/OnePagersOrFunctionalSpecs/as-mq-integration-gfv2.txt 單頁短文第 4.1 節第 iii 點的「自動叢集」。上述功能將無法使用!
依據您的環境修改連接埠與密碼檔案。請注意,在以下說明中,叢集名稱為 racluster,DAS 管理連接埠為 5858,DAS JMS 連接埠為 7676。
修改叢集配置,將 JMS 類型變更為 REMOTE。
as-install/bin/asadmin.bat set --port 5858 --user admin --passwordfile \ as-install/bin/password_file racluster.jms-service.type=REMOTE |
建立與 DAS JMS 主機對應的 JMS 主機。
as-install/bin/asadmin.bat create-jms-host --port 5858 --user admin --passwordfile \ as-install/bin/password_file --target racluster --mqhost localhost --mqport 7676 \ --mquser admin --mqpassword admin dashost |
將預設 JMS 主機設定為在上一步驟中建立的 DAS JMS 主機。
as-install/bin/asadmin.bat set --port 5858 --user admin --passwordfile \ as-install/bin/password_file racluster.jms-service.default-jms-host=dashost |
移至 [配置] -> [cluster-name-config] -> [Java 訊息服務] -> [JMS 主機]。
按一下 [新增] 以建立新的 JMS 主機,將其命名為 dashost。
輸入與 DAS 的 JMS 服務對應的配置設定,預設設定如下所示︰
主機名稱:localhost
連接埠︰ 7676
管理使用者︰ admin
密碼︰ admin
依據您 DAS JMS 服務的需要修改上述設定。
瀏覽回 [Java 訊息服務] 標籤,然後將 JMS 服務類型變更為 REMOTE (預設為 LOCAL)。
從 [default-jms-host] 下拉式清單中選擇 [dashost]。
儲存變更,然後啟動節點代理程式或叢集。
當嘗試使用某些不支援的瀏覽器顯示 [記錄統計監視] 頁面中的圖表時,可能會丟出以下錯誤︰
Error loading jmaki.widgets.jmaki.charting.line.Widget : id=form1:jmaki_chart11 Script: http://easqelx5.red.iplanet.com:4848/resources/jmaki/charting/ \ line/component.js (line:5437). Message: area.initialize is not a function |
使用支援的瀏覽器。請參閱瀏覽器,以取得 Communications Server 支援的瀏覽器清單。
在 AIX 作業系統上,嘗試使用自訂主密碼建立網域失敗,同時會顯示以下錯誤:
keytool error (likely untranslated): java.lang.NullPointerException Enter keystore password: New keystore password: |
本節介紹已知的應用程式用戶端問題以及相關的解決方案。
如果您在用戶端 JAR 內部具有頂層的 JAR 檔案 (這種情況下,為 reporter.jar),當您部署用戶端 JAR 時,該 JAR 的可取得的檔案將置換用戶端 JAR 的可取得的檔案。
目前尚無解決方案。
應用程式用戶端始終嘗試連線至 localhost:3700。問題在於呼叫用戶端程式碼之前,需要讀取數個系統特性。
將以下內容設定為系統特性 (-D 位於 JAVA_CMD 中)。請勿在應用程式用戶端程式碼中設定它們︰
org.omg.CORBA.ORBInitialHost = server-instance-host org.omg.CORBA.ORBInitialPort = server-instance-port |
在數個選擇器上註冊 SocketChannel 時,執行 socketChannel.keyFor(lastRegisteredSelector) 會傳回 Null,而非 SelectionKey。
此問題與 JDK 錯誤 6562829 相關,預計在 6.0 U3 中修正。Communications Server 中已經提供了解決方法,以便在呼叫 keyFor API 之前展開選擇器。這樣,將繼續使用 keyFor,直至修正了 JDK 錯誤。
本節介紹已知的附帶的 Sun JDBC驅動程式問題以及相關的解決方案。
如果應用程式在一個作業事件中產生 3000 個以上 PreparedStatement 物件,DB2 可能會遇到以下錯誤︰
[sunm][DB2 JDBC Driver] No more available statements. Please recreate your package with a larger dynamicSections value.
將以下特性增加到連線區定義中,以使用更大的動態區段值來使驅動程式重新連結 DB2 封裝︰
createDefaultPackage=true replacePackage=true dynamicSections=1000
與上述 PrepardStatement 錯誤相關,可能丟出其他錯誤訊息:
[sunm][DB2 JDBC Driver][DB2]Virtual storage or database resource is not available.
增大 DB2 伺服器配置參數 APPLHEAPSZ。合適的值為 4096。
隔離層級 TRANSACTION_SERIALIZABLE。如果應用程式使用隔離層級 TRANSACTION_SERIALIZABLE,並使用上述建議的參數之一,則應用程式在取得連線時可能會掛機。
若要為連線設定所需的隔離層級,必須在此隔離層級建立相應的連線區。
隨附的 Java DB 資料庫不會在重新啟動主機系統或 Solaris 區域,或啟動 Communications Server 之後自動重新啟動。這不是錯誤,而是所有隨附應用程式或協力廠商應用程式的預期運作方式。問題在於 Java DB 必須在 Communications Server 實例之前啟動。
重新啟動主機電腦或 Solaris 區域之後,務必在啟動 Communications Server 之前啟動 Java DB,例如︰
/opt/SUNWappserver/appserver/bin/asadmin start-database |
在已配置為支援叢集的網域中,時序問題有時會造成自動部署失敗。不支援叢集的網域尚未發生此問題。
使用以下解決方案之一:
JSP 編譯未使用應用程式專用類別載入器 (applibs 或 --libraries)。因此參照這些 JAR 的 JSP 將無法進行編譯。
無已知解決方案。
本節說明已知的文件問題以及相關的解決方案。
用於多個 AMX 介面與方法的 Javadoc 缺漏或不正確:
ConnectorConnectionPoolStats 和 AltJDBCConnectionPoolStats 中缺少 NumConnAcquired 和 NumConnReleased 統計的獲取方法。這些獲取方法將在未來的發行版本中加入為 getNumConnAcquired() 和 getNumConnReleased()。
在 EJBCacheStats 中呼叫以下方法將丟出異常: getPassivationSuccesses()、getExpiredSessionsRemoved()、getPassivationErrors() 和 getPassivations()。這將在未來的版本中進行修正。
啟動伺服器後,AMX MBeans 可能需要數秒鍾才能完全註冊和使用。未來的版本將可能確定完全載入 AMX MBeans 的時間。
常數 XTypes.CONNNECTOR_CONNECTION_POOL_MONITOR 拼寫錯誤 ("NNN")。這將在未來的版本中進行校正。
在「主」執行緒中丟出以下異常 java.lang.NoClassDefFoundError: org/apache/tools/ant/launch/Launcher。
不建議將隨附的 ANT 用於 Communications Server 以外的軟體。
由於 EJB 初始化的順序,導致無法在 HandlerChain 中使用資源注入。
無已知解決方案。
當使用 [管理主控台] 建立任何資源時,請使用 [目標] 標籤將伺服器指定為目標。如果使用指令行或 asant 目標,則伺服器為預設目標,無需其他動作。
如果使用 java.util.Arrays.asList() API 將 Object[] 轉換為 Collection,JDK 便會傳回不可複製的 java.util.ArrayList 之實作。這樣會導致出現以下異常︰
The method invocation of the method [protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException] on the object [[pkg.A id = xxx]], of class [class java.util.Arrays$ArrayList], triggered an exception. Internal Exception: java.lang.reflect.InvocationTargetException Target Invocation Exception: java.lang.CloneNotSupportedException: java.util.Arrays$ArrayList |
此問題將以 https://glassfish.dev.java.net/issues/show_bug.cgi?id=556 持續追蹤。
使用其建構子建立另一集合;例如︰
myCollection = new ArrayList(java.util.Arrays.asList(a)) |
將 DataDirect 驅動程式與 SyBase 配合使用時,嘗試插入使用 GenerationType.IDENTITY 的實體會失敗。失敗的原因在於 DataDirect 驅動程式會為參數化預備陳述式建立已儲存程序。
在 domain.xml 檔案中,設定對應資料來源的特性 PrepareMethod=direct。
本節說明已知的生命週期管理問題以及相關的解決方案。
將 ejb-timer-service 特性 minimum-delivery-interval 設定為 9000 之後,嘗試將 ejb-timer-service 特性 redelivery-interval-in-mills 設定為 7000 的行為會導致 set 指令失敗,並出現以下錯誤︰
[echo] Doing admin task set [exec] [Attribute(id=redelivery-interval-internal-in-millis) : Redelivery-Interval (7,000) should be greater than or equal to Minimum-delivery-interval- in-millis (9,000)] [exec] CLI137 Command set failed. |
minimum-delivery-interval 是同一定時計時器的兩次傳送之間的最小間隔持續時間。
redelivery-interval-in-mills 是計時器服務在 ejbTimeout 失敗後嘗試重新傳送之前的等待時間。
問題在於,將重新傳送間隔特性與最小傳送特性相聯繫的邏輯不正確,並阻止您使用 GUI 或 CLI 設定任何最小傳送間隔大於重新傳送間隔的值。
minimum-delivery-interval-in-millis 的設定必須始終等於或高於 ejb-timer-service 特性 redelivery-interval-in-millis 的設定。問題在於,應用程式伺服器具有錯誤的驗證檢查可驗證 redelivery-interval-in-millis 的值是否大於 minimum-delivery-interval-in-millis 的值。
使用這些特性的預設值,如下所示:
minimum-delivery-interval(default)=7000 redelivery-interval-in-millis(default)=5000 |
這些預設值以外的值將會產生錯誤。
如果您要嘗試檢視使用 default-config 的 JMS 實體目標,便會出現一則錯誤訊息。
這是預期的運作方式。在 Communications Server 2.0 中,default-config 是配置資訊範本,因此無法針對 default-config 執行 JMS 作業 (如 list 和 create)。但是,可以針對叢集或獨立實例的配置執行 JMS 作業。
(僅適用於 Windows 2003) 執行豐富存取功能時,Windows 2003 系統上會出現記憶體錯誤。出現此問題是因為 Win32 非分頁池一直在增長,最終導致整個 TCP/IP 堆疊出現錯誤。一旦出現此故障,TCP/IP 堆疊便處於可回復狀態,復原它的唯一方式是重新啟動 Windows 2003 系統。
有兩種解決方法可解決這個問題:
將 domain.xml 的 http-listener 屬性配置成 blocking-enabled="true" 以使用 Grizzly 封鎖模式,或者增加以下 http-listener 特性︰
<property name="blocking" value="true"/> |
使用 Windows Vista 或 Windows XP。
本節說明已知的記錄問題以及解決方案。
設定 JVM 的 java.security.debug 選項將會導致伺服器實例啟動因為死結而凍結;例如,在 domain.xml 中進行以下設定會導致該問題:
<jvm-options>-Djava.security.debug=access,failure</jvm-options> |
目前尚無解決方案。請避免設定此標幟。
本節說明已知的 Java Message Queue 問題以及相關的解決方案。
在與時間相關的方案中重新連線失敗可能是由多個問題導致的。
您可以透過以下方法解決這些問題:
重新啟動涉及的代理程式
重新啟動涉及的 Application Server 實例
如果您將 JMS 配置為 REMOTE,則 MQ 代理程式未啟動時,企業伺服器亦無法啟動。
設定下列 JVM 選項,如下所示:com.sun.enterprise.jms.CONNECT_MQ_LAZILY=true。設定此 JVM 選項後,如果 MQ 代理程式未啟動,您可以啟動 Communications Server。然而,建議您在啟動伺服器之前啟動 MQ。
在 Linux 系統上建立帶有叢集設定檔的網域之後,可能會遇到 java.lang.OutOfMemoryError: Java heap space 錯誤,由於 MQ 代理程式未啟動,伺服器實例也可能無法重新啟動。出現此狀況之後,系統便無法再回復。出現此問題是因為 /etc/hosts 檔案配置錯誤;具體的說,伺服器主機名稱將指向迴路位址 127.0.0.1。
依設計,MQ 代理程式叢集不能在網路裝置配置為指向迴路位址的情形下啟動。這不是錯誤。解決方案是確保 Communications Server 主機的 /etc/hosts 檔案不指向 127.0.0.1。
應用程式伺服器啟動期間,伺服器會檢查 Message Queue 版本。如果 Message Queue 版本錯誤,伺服器會使用 imqjmsra.jar 升級。應用程式伺服器必須重新啟動才可使用此升級 JAR 及其類別。只有當 Message Queue 單獨升級時,或是單獨修補應用程式伺服器時,才會發生此情況。此情況的副作用是有時無法啟動應用程式伺服器。
您需要將 Message Queue 與應用程式伺服器維持在同一修補層級,或重新啟動應用程式伺服器。
本節介紹已知的監視問題和相關的解決方案。
檢視 HTTP 服務的某些元素的監視統計資料時,出現的某些值與目前值不相符,或始終為 0。具體的說,下列 HTTP 服務統計資料顯示的資訊並不適用於應用程式伺服器,應予以忽略:
http-service
load1MinuteAverage
load5MinuteAverage
load15MinuteAverage
rateBytesTransmitted
rateBytesReceived
pwc-thread-pool (元素)
在以後的版本中,將移除這些監視,並由更適當的資訊取代。
從管理 GUI 開啟 JNDI 瀏覽器時,會丟出許多異常。
目前尚無解決方案。
在繁體中文、簡體中文和西班牙文語言環境下執行 asadmin monitor --type jvm server 會發生異常狀況。
請從【管理主控台】檢視 JVM 資訊,或在英文語言環境中執行 asadmin monitor 指令。
本節說明與 Communications Server 和 Web 應用程式安全性及憑證有關的已知問題和相關解決方案。
在負荷過大的情況下執行某些 SSL 分析藍本時,JDK6 Sun PKCS11 提供者中的 JDK 錯誤 (請參閱:https://jdk6.dev.java.net/issues/show_bug.cgi?id=23) 可能會導致出現記憶體不足的錯誤。
如果您遇到此問題,請從 JRE 安裝內的 java.security 檔案中移除 sun.security.pkcs11.SunPKCS11 提供者。
SSL 終止無法正常工作;如果為 SSL 終止設定了負載平衡程式 (硬體),Communications Server 會在重新導向期間將協定從 https 變更為 http。
在硬體負載平衡器與 Communications Server 之間增加軟體負載平衡器。
由於 JVM 錯誤,在 HTTP 偵聽程式上將 security-enabled 設定為 true 時,某些 JDK 版本會出現錯誤問題。具體的說,重現此錯誤的步驟如下︰
在 HTTP 偵聽程式上,將 security-enabled 設定為 true︰
<http-listener acceptor-threads="1" address="0.0.0.0" blocking-enabled="false" default-virtual-server="server" enabled="true" family="inet" id=" http-listener-1" port="8080" security-enabled="true" server-name="" xpowered-by="true"> |
在 quicklook 測試結尾處加入停止網域的註釋。
執行 quicklook 測試。
檢查通訊埠的使用︰
netstat -an | grep 8080 |
下面顯示的是正在使用︰
*.8080 *.* 0 0 49152 0 LISTEN *.8080 *.* 0 0 49152 0 BOUND |
GlassFish 網站已經追蹤此問題,網址為:https://glassfish.dev.java.net/issues/show_bug.cgi?id=849。
升級到最新的 JDK 版本。
本節說明已知的 Web 容器問題以及相關的解決方案。
如果您在 Windows 上部署應用程式時請求 JSP 的預先編譯,則以後無法按預期嘗試取消部署或重新部署該應用程式 (或任何具有相同模組 ID 的應用程式)。問題在於 JSP 預先編譯會開啟應用程式中的 JAR 檔案,但不會關閉它們,同時 Windows 會防止取消部署刪除這些檔案或防止重新部署置換它們。
請注意,取消部署會進行到某個地步,此時會依據邏輯將該應用程式從 Application Server 中移除。還請注意,asadmin 公用程式不會傳回任何錯誤訊息,但應用程式的目錄和鎖定的 jar 檔案會保留在伺服器上。伺服器的記錄檔將包含描述無法刪除檔案和應用程式目錄的訊息。
取消部署失敗後會嘗試重新部署應用程式,因為伺服器會嘗試移除現有檔案與目錄,此嘗試仍失敗。如果您嘗試部署使用與原來部署的應用程式具有相同模組 ID 的任何應用程式,便會出現這種情況,因為伺服器使用該模組 ID 選擇目錄名稱以存放應用程式檔案。
基於同樣原因,不先取消部署即嘗試重新部署應用程式將會失敗。
如果您嘗試重新部署應用程式或在取消部署之後再部署該應用程式,asadmin 公用程式會傳回一個如下類似錯誤。
An exception occurred while running the command. The exception message is: CLI171 Command deploy failed : Deploying application in domain failed; Cannot deploy. Module directory is locked and can't be deleted. |
如果您在部署應用程式時指定 --precompilejsps=false (預設的設定),則不會出現此問題。請注意,第一次使用應用程式將觸發 JSP 編譯,因此第一次請求的回應時間會比以後的請求的回應時間長。
還請注意,如果進行預編譯,應先停止並重新啟動伺服器,然後再取消部署或重新部署應用程式。關機會釋放鎖定的 JAR 檔案,因此重新啟動後才能成功取消部署或重新部署。
web.xml 中的選擇性 load-on-startup servlet 元素表示要載入相關的 servlet 並將其初始化為宣告該 servlet 的 Web 應用程式啟動的一部分。
該元素的可選內容是一個整數,表示要載入並初始化與 Web 應用程式之其他 servlet 相關的 servlet 的順序。只要在啟動其含有的 Web 應用程式過程中載入並初始化 servlet,空的 <load-on-startup> 即表示順序錯誤。
web.xml 的 Servlet 2.4 模式不再支援空的 <load-on-startup>,亦即使用基於 Servlet 2.4 的 web.xml 時,必須指定整數。若指定空的 <load-on-startup> (如 <load-on-startup/>),web.xml 將無法針對 web.xml 的 Servlet 2.4 模式進行驗證,進而導致部署 Web 應用程式失敗。
返回至相容性問題。指定空的 <load-on-startup> 仍可使用基於 Servlet 2.3 的 web.xml。
使用基於 Servlet 2.4 的 web.xml 時,指定 <load-on-startup>0</load-on-startup>,以表示 servlet 載入順序並不重要。
存取 JSP 頁面後無法編譯,且伺服器記錄含有錯誤訊息「Unable to execute command」,以及以下堆疊追蹤:
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher. exec(Execute.java:655) at org.apache.tools.ant.taskdefs.Execute. launch(Execute.java:416) at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:427) at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter. executeExternalCompile(DefaultCompilerAdapter.java:448) at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute (JavacExternal.java:81) at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:842) at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:682) at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:396) |
將 JSP 編譯切換「fork」設定為「false」。
有兩種方法可以執行此操作:
將 domain-dir/config/default-web.xml 中 JspServlet 的 fork init 參數全部設定為 false:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> .... <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> .... </servlet> |
依據每個 Web 應用程式,將 sun-web.xml 中的 fork JSP 配置特性設定為 false:
<sun-web-app> <jsp-config> <property name="fork" value="false" /> </jsp-config> </sun-web-app> |
以上任何一種設定都將阻止 ant 產生用於 javac 編譯的新程序。
本節說明已知的 Web 容器問題以及相關的解決方案。
對於 JDK 6 Update 4,wscompile ant 作業會失敗。針對每個 JAX-RPC API 類別,會顯示下列錯誤訊息:
package package-name does not exist |
在執行 wscompile ant 作業之前,請確認在類別路徑中已指定 javaee.jar,而非 j2ee.jar。