如何使用Google App Engine和Webjars?

5
我有一个Google App Engine(1.8.5)项目。我想通过Webjars提供静态JavaScript和CSS。但是,我一直收到HTTP 404错误。我该如何使我的Webjars文件可访问?
我的src/main/webapp/WEB-INF/appengine-web.xml按照Google的文档
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    ...
    <static-files>
        <include path="/resources/**" />
        <include path="/webjars/**" />
    </static-files>
</appengine-web-app> 

我的 src/main/webapp/index.html,引用了 Webjars 提供的 Bootstrap CSS 文件:
<html>
<head>
    <link rel="stylesheet" href="webjars/bootstrap/3.0.0/css/bootstrap.min.css">
</head>
...
</html>

pom.xml的片段:

    <dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>(lots)</artifactId>
        <version>1.8.5</version>
    </dependency>
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>4.0-beta</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <scope>provided</scope>
        <version>3.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>bootstrap</artifactId>
        <version>3.0.0</version>
    </dependency>

这是我在GAE上发布的第一个问题,所以我不确定需要提供什么额外的信息 - 对我温柔些吧,SO。

4个回答

2
很遗憾,Webjars 需要一个 Servlet 3.x 容器,但 Google App Engine 目前仍然只支持版本 2.5。
你可能想在 GAE 问题列表中为 这个问题 点赞。

我在某个地方看到过这方面的注释,但是我没有记住它;谢谢。这意味着我要采用的解决方案——既保持我的项目整洁又提供文件——将是在我的<script><link>标签中使用CDN链接。 - JJ Zabkar
你能详细说明一下你的解决方法吗?在GAE中使用webjars会非常方便。 - tom

1
你可以轻松地做到这一点。在Servlet 2.x容器中也可以实现。
在你的Web应用程序中注册我们的webjars-servlet-2.x Maven依赖:
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>webjars-servlet-2.x</artifactId>
    <version>1.1</version>
</dependency>

在您的web.xml文件中注册WebjarsServlet:
<!--Webjars Servlet-->
<servlet>
    <servlet-name>WebjarsServlet</servlet-name>
    <servlet-class>org.webjars.servlet.WebjarsServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>WebjarsServlet</servlet-name>
    <url-pattern>/webjars/*</url-pattern>
</servlet-mapping>

默认情况下,Webjars 资源将被浏览器缓存。如果出于任何原因您需要禁用缓存,可以使用 disableCache 配置属性进行如下操作:
<!--Webjars Servlet-->
<servlet>
    <servlet-name>WebjarsServlet</servlet-name>
    <servlet-class>org.webjars.servlet.WebjarsServlet</servlet-class>
    <init-param>
        <param-name>disableCache</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>WebjarsServlet</servlet-name>
    <url-pattern>/webjars/*</url-pattern>
</servlet-mapping>

更多信息请查看http://www.webjars.org/documentation#servlet2


1
我终于找到了一种实际可行的解决方法!我使用RESTlet完成了它。我认为你可以在非RESTlet应用程序中完成它,只需在这一部分使用RESTlet即可。
如果您确实使用了RESTlet,则只需将其插入到您的路由器中:
final Component component = new Component();
component.getClients().add(Protocol.CLAP);
final Directory dir = new Directory(component.getContext(), "clap://class/META-INF/resources/webjars");
dir.setDeeplyAccessible(true);
this.attach("/webjars", dir);
//access via http://example.com/webjars/jquery/1.9.0/jquery.min.js

如果您不使用restlet,您需要在web.xml中添加一个restlet servlet adapter,创建一个restlet应用程序和路由器并以上述内容为基础。这只需要加上几行额外的代码!
更多信息请参阅我的博客:http://demeranville.com/using-webjars-without-servlet-3-on-google-app-engine-gae/

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接