使用Maven概要文件构建gwtmaven

使用Maven概要文件构建gwtmaven,gwt,maven,Gwt,Maven,我试图使用maven概要文件提供的功能为不同的服务器环境构建定制的构建。我试图做的是结合maven资源过滤 <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> &

我试图使用maven概要文件提供的功能为不同的服务器环境构建定制的构建。我试图做的是结合maven资源过滤

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
我可以在这里使用:

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。我怎样才能做到这一点呢?

在我看来,使用GWT编译器排列来应用这种配置是一个非常糟糕的主意。对GWT最常见的抱怨之一是编译所需的时间,这样做只会增加问题的严重性

配置通常应该从配置文件中读取(出乎意料!),比如

不管怎么说,你想做的事在我看来是不可能的。您不能告诉客户端代码它应该连接到哪个服务器。这将违反法律!应用程序只能与它来自的服务器通信

要在不同的URL中运行不同的应用程序,您需要部署几个名称不同的GWT应用程序(即使它们基本相同)。然后,您只需在浏览器中为每个应用程序(版本)键入正确的URL,它就会“查看”正确的应用程序。因此,您可以使用如下URL:

http://myserver.com/app1
http://myserver.com/app2
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!
    }
为了向与GWT应用程序在同一服务器上运行的不同应用程序发出请求,您可以执行以下操作:

http://myserver.com/app1
http://myserver.com/app2
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!
    }

在没有使用maven概要文件或GWT ClientBundle的情况下,我解决了我试图完成的问题(我从来没有按照我写问题时的预期方式来工作)

以下是我希望使用maven概要文件解决的主要问题,以及我为解决当前问题而采用的变通方法:

  • 在托管模式下使用模拟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
    }
    
  • 为真实型号提供正确的RESTful服务器URL

    我之所以能够做到这一点,是因为我的GWT应用程序和RESTfulWeb服务url遵循一套命名约定。我基本上是从URL中去掉尾随的“/”并附加“\u服务”

  • 尽可能多地测试MVP演示者(活动和场所)

    我已经在将模型定位器注入到我的
    活动
    类中,因此用模拟模型定位器替换它供JUnit使用是很简单的。我对我的视图做了同样的操作,并抽象掉了一些在浏览器之外似乎不起作用的其他代码(如GWT
    PlaceController


  • 总而言之,我的构建基本相同,但我学会了如何在测试、配置GWT应用程序连接的服务器实例以及应用程序使用的模型(取决于托管vs服务器模式)方面获得很大的灵活性.

    在我看来,您正在GWT应用程序中的特定服务器属性中进行硬编译。是否有理由在应用程序启动时不通过异步回调等方式从服务器获取这些值?这样一来,您就不需要首先编译多个版本。我对此有点陌生,因此如果我下载GWT从my_server/instance1应用程序,回调如何知道转到my_server/instance1_服务。这是我最终想要做的-然后在my_server/instance2和myserver/instance2_服务中有另一个应用程序实例。我尝试使用ExternalSourceResource,但没有成功。我也研究了GIN,也无法理解你能更具体地说明你对
    服务的确切含义吗?它是一个单独部署的应用程序吗?它们是实际的webservice还是GWT RPC servlet?你如何与这些服务通信?是的,它是一个单独部署的RESTful web服务应用程序。我通过HTTP(和HTTPS)与它们通信。它不会违反同源策略,因为它将访问同一台服务器,只是服务器上的一个不同实例-我需要指定它是哪个实例。Flex有类似的SOP限制,我们正在尝试用GWT替换Flex UI。您稍后在帖子中对不同应用版本的建议就是我正在尝试的要做-只是app1使用app1_web_服务,app2使用app2_web_服务。我需要在某个地方指定映射。在Flex中,我在war打包中完成了该操作。我将查看您的配置示例。谢谢!您引用的配置文件示例看起来像是为服务器端组件设置了配置。这是真的吗我想做的是在客户端组件上设置这种类型的配置(对gwt编译器生成的js可见)运行时性能。从您编写的内容来看,我觉得您似乎想要设置要连接到的服务器的URL。这是不可能的。您把事情搞混了……当您使用GWT.create(…)时,您使用的是延迟绑定()。这与maven配置文件无关。我使用maven配置文件来构建“dev”或“prod”“environment”(“dev”)基本上只编译到一个浏览器,所以它必须更快。请更明确地说明您试图实现的目标,我想我可能能够提供帮助,因为我已经使用了延迟绑定、Maven配置文件,甚至GWT生成器(它们可以为您带来惊人的效果)。我相信这些解决方案中的一个会满足您的需求(除了连接到不同的服务器)。。。有趣。
    
    String createServicesBaseUrl() {
        StringBuffer baseUrl = new StringBuffer(GWT.getHostPageBaseURL());
        int length = baseUrl.length();
        baseUrl.replace(length-1, length, "_services");
        return baseUrl.toString();
    }