2012-03-06 70 views
0

我試圖使用maven配置文件提供的功能爲不同的服務器環境構建自定義構建。我正在試圖做的是結合Maven的資源過濾GWT Maven使用maven配置文件構建

<resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 

與它的配置文件機制

<profiles> 
    <profile> 
     <id>mock</id> 
     <properties> 
      <application-url>http://mock-server-url</application-url> 
     </properties> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
    </profile> 
</profiles> 

該值在名爲文件轉換server.cfg

​​

的東西我可以在這裏使用:

public interface ServerResource extends ClientBundle { 
    public static final ServerResource INSTANCE = GWT.create(ServerResource.class); 

    @Source("server.cfg") 
    public TextResource server(); 

} 

我可以看到該值在WEB-INF/classes中被替換,但是它沒有出現GWT使用該替換文件來創建應用程序的JavaScript。我怎樣才能做到這一點?

+0

它看起來像你在GWT應用程序中的特定服務器屬性中進行硬編譯。當應用程序啓動時,是否有理由不通過例如異步回調從服務器獲取這些值?這樣你就不需要首先編譯多個版本。 – 2012-03-06 18:31:56

+0

我對此有點新,所以如果我從my_server/instance1下載我的GWT應用程序,如何知道回調到my_server/instance1_services。這最終是我想要做的 - 然後在my_server/instance2和myserver/instance2_services上有另一個應用程序實例。我試圖使用ExternalSourceResource,但沒有成功。我也研究過GIN,也無法弄清楚。 – Vinnie 2012-03-06 23:28:29

+0

你能更具體地說明你對'服務'的真正含義嗎?它是一個單獨的部署應用程序?它們是實際的webservice還是GWT RPC servlet?你如何與這些服務交流? – 2012-03-08 18:18:07

回答

1

我解決了我在不使用maven配置文件或GWT ClientBundle的情況下完成的工作(當我寫這個問題時,我從來沒有按照我的意圖工作。

這裏是我希望使用maven配置文件和解決辦法要解決的主要問題,我使用的手來解決這個問題:

  1. 在託管模式使用模擬MVP模式

    // inside the initialization for my model locator 
    boolean hostedMode = GWT.getPermutationStrongName().equals("HostedMode"); 
    
    if (hostedMode) { 
        // instantiate mock models 
    } else { 
        // instantiate real models to call REST web services 
    } 
    
  2. 使用正確的RESTful服務器URL提供真實模型

    我能夠完成此操作,因爲我的GWT應用程序和RESTful Web服務URL遵循一組命名約定。我基本上是從URL中的尾隨「/」和追加「_services」

    String createServicesBaseUrl() { 
        StringBuffer baseUrl = new StringBuffer(GWT.getHostPageBaseURL()); 
        int length = baseUrl.length(); 
        baseUrl.replace(length-1, length, "_services"); 
        return baseUrl.toString(); 
    } 
    
  3. 使盡可能多的MVP演示(活動&地方)的測試,我可以

    我已經將模型定位器注入到我的Activity類中,因此用JUnit使用的模型模型定位器代替它非常簡單,我對我的視圖也做了相同的處理,並將其他代碼除外,這些代碼在瀏覽器外部似乎不起作用(如GWT PlaceController

總而言之,我的構建基本相同,但我學會了如何在測試中獲得很大的靈活性,配置我的GWT應用程序連接的服務器實例以及我的應用程序使用的模型(取決於託管服務器與服務器模式)。

+0

現在我看到你正在做什麼...有趣。 – Renato 2012-03-10 04:03:02

1

使用GWT編譯器排列來應用這種配置在我看來是一個非常糟糕的主意。關於GWT最常見的抱怨之一是編譯所花費的時間,通過這樣做,你只會增加問題。

配置通常應該從配置文件中讀取(驚喜!),如shown here

無論如何,你想要做的事似乎是不可能的。你不能告訴客戶端代碼應該連接到哪個服務器。這將違反same-origin policy!該應用只能與它來自的服務器進行通信。

要讓不同的應用程序在不同的URL中運行,您需要部署幾個不同名稱的GWT應用程序(即使它們基本相同)。然後,您只需在瀏覽器中輸入每個應用程序(版本)的正確URL,它就會「看」正確的應用程序。所以,你可以有一個像這樣的網址:

http://myserver.com/app1 
http://myserver.com/app2 

爲了使在相同的服務器GWT應用程序運行的不同應用程序的請求,你可以做這樣的事情:

String serviceUrl = "/app2/someService"; // or some other String sourced from a config file, using a GWT ClientResource for example 
RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, 
      serviceUrl); 
    try { 
     // send request from app1 to app2 
     rb.sendRequest(null, new RequestCallback() { 
      @Override 
      public void onResponseReceived(Request request, 
        Response response) { 
       log.info("Response: " + response.getStatusText()); 
       // if response is 200 it's ok, you can read the outputStream to see what's in there 
      } 
      @Override 
      public void onError(Request request, Throwable exception) { 
       log.warning("Request Error", exception); 
       // do something more 
      } 
     }); 
    } catch (RequestException e) { 
     log.warning("Request Exception", e); 
     // getting here means trouble with the connection or service! 
    } 
+0

它不會違反相同的源策略,因爲它要到達同一個服務器,而只是服務器上的另一個實例 - 而且我需要指定它是哪個實例。 Flex有類似的SOP限制,我們試圖用GWT替換我們的Flex UI。你在後文中提出的關於不同應用版本的建議是我正在嘗試做的 - 只是app1使用app1_web_services而app2使用app2_web_services。我需要指定映射到某個地方。在Flex中,我在戰爭包裝中做過。我會看看你的配置示例。謝謝! – Vinnie 2012-03-07 13:59:17

+0

您引用的配置文件示例看起來像設置服務器端組件的配置。真的嗎?我想要做的是在客戶端組件上設置這種類型的配置(對於由gwt編譯器生成的js可見)。 – Vinnie 2012-03-07 21:17:45

+0

順便說一句 - 我很樂意將編譯時間慢的性能用於快速(er)運行時間性能。 – Vinnie 2012-03-07 21:19:06