GWT Maven使用maven配置文件构建

时间:2012-03-06 15:40:30

标签: gwt maven

我正在尝试使用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

的文件中转换此值
${application-url}

我可以在这里使用的东西:

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。我怎么能这样做?

2 个答案:

答案 0 :(得分: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!
    }

答案 1 :(得分: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. 为实际模型提供正确的REST服务器网址

    我能够实现这一点,因为我的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)。

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