将外部资源添加到 GWT 开发模式服务器 (Jetty)

Posted

技术标签:

【中文标题】将外部资源添加到 GWT 开发模式服务器 (Jetty)【英文标题】:Adding external resources to GWT dev mode server (Jetty) 【发布时间】:2012-02-18 01:50:04 【问题描述】:

我有一个需要访问一些静态资源的 GWT。我不想将这些资源放在实际的 /src/main/webapp 目录中(注意:使用 Maven 和相应的布局),因为它们不是应用程序的一部分,而是数据的一部分。

我的问题不是如何在部署时让应用程序访问这些资源;这应该很容易通过 Tomcat 配置来完成。相反,问题是如何让我的应用程序在开发过程中访问一些测试数据。我在 GWT 应用程序树之外的目录中有一些测试静态文件,并且想配置 GWT 的开发模式 Jetty 服务器来访问这些资源。也就是说,我希望能够说 mvn gwt:run (或从 Eclipse 以开发模式运行或调试应用程序),并让服务器为这些静态资源提供服务。

我知道(并使用)开发模式 -noserver 选项。但是,由于我修改了很多服务器端代码以及客户端代码,因此每次服务器代码更改时重新部署服务器是不切实际的。

到目前为止,我一直在尝试在我的 WEB-INF 目录中创建一个 jetty-web.xml 文件,并添加一个新上下文,以便服务器为我的资源提供服务。这是我失败的 jetty-web.xml 尝试:

<Configure id="parentHandler" class="org.mortbay.jetty.handler.ContextHandler">
    <Set name="contextPath">/static_resources</Set>
    <Set name="resourceBase">/real/filesystem/path/to/static/resources/</Set>
    <Set name="handler">
    <New class="org.mortbay.jetty.handler.ResourceHandler">
        <Set name="cacheControl">max-age=3600,public</Set>
    </New>
    </Set>
</Configure>

如果我将它放在 jetty-web.xml 中,那么当我启动开发模式时,Jetty 会为我的外部资源提供服务,但不会为我的 GWT 应用程序提供服务。

另一方面,如果我这样做......

<Configure id="parentHandler" class="org.mortbay.jetty.handler.ContextHandler">
    <New id="newHandler" class="org.mortbay.jetty.handler.ContextHandler" >
        <Set name="contextPath">/static_resources</Set>
        <Set name="resourceBase">/real/filesystem/path/to/static/resources/</Set>
        <Set name="handler">
            <New class="org.mortbay.jetty.handler.ResourceHandler">
                <Set name="cacheControl">max-age=3600,public</Set>
            </New>
        </Set>
    </New>
    <Get id="server" name="server">
        <Call name="setHandler">
            <Arg><Ref id="newHandler" /></Arg>
        </Call>
    </Get>
    <Ref id="newHandler">
        <Set name="server"><Ref id="server" /></Set>
    </Ref>
</Configure>

...Jetty 既不为我的静态内容提供服务,也不为我的 GWT 应用提供服务。

有什么建议吗?我做错了什么?

(注意:GWT 开发模式使用 Jetty 的版本 6 [或 6.something],并以编程方式设置它,据我所知,没有读入其他 Jetty 配置文件。)

非常感谢!

【问题讨论】:

FWIW,当我需要自定义服务器时,我不打扰托管模式的码头实例,而是设置不同的服务器并使用 -noserver 来阻止码头启动。 对,我有时会使用该选项。但这意味着每次服务器代码更改时都在另一台服务器中打包和部署 .war,不是吗?然后也在另一台服务器上设置调试?我的意思是,我可以想象它是可能的,并且有一些方法可以使其自动化,但这似乎不是最直接的选择。 我在那里的一般方法(cmets,因为它实际上并没有解决问题)是从我的 ide 中运行另一台服务器。使用mvn war:exploded 将所有重要位复制到正确的目录,同时仍然让我正常调试。主要区别在于有两个调试会话正在进行,并且有两个按钮可以单击来启动而不是一个,尽管我需要重新启动 gwt 开发模式而不是服务器。 谢谢!如果我不能通过 Jetty 工作,我肯定会尝试。我想像你这样的方法,或者一些基于 maven 的解决方案,可能会更干净,因为它不依赖于 GWT 内部的细节(比如使用哪个 servlet 容器开发模式)。我猜,向 GWT 提出补丁或功能请求以更简洁地配置开发模式服务器也可能是有序的。 【参考方案1】:

我喜欢使用的方法是编写一个简单的 Servlet,它可以流式传输任何文件,类似于:http://www.exampledepot.com/egs/javax.servlet/GetImage.html,并将其在我的 web.xml 中映射到某些 URL 模式。

然后我可以通过我的配置文件之一轻松地使静态文件的基本目录可配置。我也可以做一些任意的事情,比如将几个目录混合在一起,或者从数据库中获取文件内容,...

我更喜欢这种方法,因为它适用于任何环境中的所有 servlet 容器。

【讨论】:

【参考方案2】:

我的工作:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">

<Configure class="org.mortbay.jetty.webapp.WebAppContext">
        <New id="sampleDS" class="org.mortbay.jetty.plus.naming.Resource">            
            <Arg>java:jboss/datasources/sampleDS</Arg>
            <Arg>
                 <New class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
                 <Set name="URL">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</Set>                 
                 <Set name="User">user</Set>
                 <Set name="Password">pass</Set>
                 </New>
            </Arg>
        </New>
</Configure>
    放在WEB-INF下 下载[jetty-naming-6.1.12.jar][1][jetty-plus-6.1.12.jar][2]并将它们放在`WEB-INF\lib'下

重新启动 eclipse 并再次运行应该可以解决问题。

【讨论】:

非常感谢!我很快就会对此进行测试(并希望将答案标记为正确)! -1 该xml没有显示如何添加外部文件夹作为静态文件的资源库,只是一个数据源。

以上是关于将外部资源添加到 GWT 开发模式服务器 (Jetty)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GWT 离线应用程序中包含外部 Javascript

GWT 超级开发模式 - bindAddress - 未显示更改

GWT - 将客户端和服务器拆分到不同的机器

chrome中的GWT插件问题

将 GWT CellTable 更改提交到服务器的策略/模式

Tomcat中的超级开发模式+ JSP页面