2009-08-31 185 views
3

如果它在Web應用程序中運行(例如,整個應用程序部署在Tomcat/Web球體等)或作爲獨立的應用程序,是否有方法來區分內部特定的方法?如何區分Web應用程序或獨立應用程序?

+1

要分清這是什麼對於? –

+0

我正在處理遺留代碼,應用程序可以獨立運行或在tomcat下運行。並且有一個線程在應用程序的初始化期間啓動。我現在可以在Web應用程序已經啓動或即將關閉時啓動。我想要得到這張照片。問題是當它不運行獨立線程拋出異常時,在Web應用程序的啓動/停止過程中。 – blefesd

回答

2

答案是「否」。無法確定您的代碼是在某種類型的應用服務器/ Servlet容器中運行還是獨立運行,而不依賴於外部信息。

你可以,但是,在一種情況下指定的系統屬性,而不是其他,並檢查其存在:

java -Dstandalone.mode=true MyApplication 

在您的代碼:

if (Boolean.getBoolean("standalone.mode")) { 
    // we're in standalone mode 
} 
0

你的問題是困難的,因爲沒有一個整體很多是從它運行在兩個預留之間的「不同」,你可以嘗試調用

org.apache.catalina.util.ServerInfo.getServerBuilt() 

,如果失敗,那麼你沒有運行Tomcat。我不熟悉網絡領域,但我會想象嘗試調用一個具體的方法,以及工作。這絕對是一種骯髒的做事方式,但它會起作用。

1

您可以檢查HttpServlet的任何實例是否顯示在當前堆棧跟蹤中。雖然它不是傻瓜,但它可能會滿足您的特定需求。

注:我還沒有試過運行這個示例代碼。異常處理已被排除。

public boolean isWebApplication() { 
    Class<?> httpServletClass; 
    try { 
     httpServletClass = Class.forName("javax.servlet.http.HttpServlet"); 
    } catch (ClassNotFoundException e) { 
     return false; 
    } 

    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace() 

    for (StackTraceElement element : stackTrace) { 
     Class<?> elementClass = Class.forName(element.getClassName()); 
     if (httpServletClass.isAssignableFrom(elementClass)) { 
      return true; 
     } 
    } 

    return false; 
} 
+2

「不防」是輕描淡寫。這將適用於servlet,但不適用於過濾器/衍生線程,或者在完整EE容器的情況下使用bean。 – ChssPly76

+2

現在,您的示例代碼將需要HttpServlet放在您的類路徑中,而業務邏輯 –

+0

@ ChssPly76不太可能出現這種情況:這就是爲什麼我說「它可能會滿足您的特定需求」。 :) –

1

你大概會希望之內不與在類路徑上的任何應用程序服務器或J2EE API的整理了一些「通用」業務邏輯代碼檢查這一點,即你不能直接訪問的HttpServlet。在這種情況下,我認爲爲J2EE或應用程序服務器類專業做Class.forName()將是您最好的選擇。如果它拋出異常,它是獨立的,否則,也許你在一個應用服務器。

0

我認爲最簡單的方法是測試JNDI system properties(假設它們不能在獨立模式下設置爲遠程服務器 - 即使這樣,您也應該能夠知道值之間的差異,例如服務器不是指本地主機)。