2012-03-06 100 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