【问题标题】:Where do I put static files for GWT app? war folder or public folder?我在哪里放置 GWT 应用程序的静态文件?战争文件夹还是公用文件夹?
【发布时间】:2009-10-01 06:14:12
【问题描述】:

我有一些 JavaScript 文件、一个主 HTML 文件、一个主 CSS 文件和一些导入到主文件中的 CSS 文件。

我知道我可以将静态文件放在两个地方:a) 'war' 文件夹;或 b) 'public' 文件夹。

放置静态文件的最佳位置在哪里?这两个位置的处理方式不同吗?在这个问题上是否有“最佳实践”?

【问题讨论】:

    标签: gwt web-applications directory-structure


    【解决方案1】:

    在 GWT 中工作的新方法是使用 war 文件夹。

    但是,如果您的项目是在 GWT 应用程序中使用的可重用小部件库,那么您应该将资源放在公共文件夹中。编译器将确保文件自动包含在生成的包中。

    【讨论】:

    • 怎么把css放到war文件夹中,然后在xxx.gwt.xml文件中引用呢?我的问题是我的相对 url 将来可能会改变,我不想改变任何保留它在公共 gwt 文件夹中的东西
    • 另见gwtproject.org/doc/latest/…(准则6)
    • 但是当将任何东西放入war 文件夹时,它会在重新编译项目时被删除。静态资源应该放在哪里?
    • 确保您的 App.gwt.xml 中有一个 并在存储 gwt.xml 文件的包中创建一个文件夹 public。 GWT 编译器将复制您在生成的输出中公开的所有文件。 (它将在模块文件夹中,而不是在战争根文件夹中)。
    【解决方案2】:

    这两个位置的区别在于公用文件夹中的文件由 gwt 编译器复制到“war”文件夹中的“您的模块”文件夹中。这意味着如果您部署“战争”(例如通过谷歌插件到谷歌应用引擎),“公共”文件夹中的文件不在顶层。

    例如,如果您在“public”文件夹中有一个 index.html,其中 gwt 模块名为“mymodule”,并且您将其部署到 www.example.com,它看起来如下所示,您需要通过以下方式访问它:

    www.example.com/mymodule/index.html
    

    如果你在'war'文件夹中有 index.html,你会得到:

    www.example.com/index.html
    

    总结。您的登录页面应位于“战争”文件夹中。登陆页面使用的资源文件也可以存储在这里(css、图像)。任何 gwt 模块文件(或代码,如图像)中引用的任何其他资源文件都应存储在与 gwt 模块相关的“公共”文件夹中。

    【讨论】:

    • 这个答案是否仍然适用于 GWT 2.6?我的项目似乎没有public 文件夹。另一方面,如果我在war 文件夹中添加任何内容,它会在我重新编译项目后立即被删除。那么,现在应该把静态文件放在哪里呢?
    【解决方案3】:

    在我看来,这取决于您的要求,但让我们先从一个口语示例开始......

    我发现关于此的 documentation(应该是 GWT 2.6.0)不正确或至少不完整/令人困惑。如我所见(我不是专家,所以如果我的调查有误,请纠正我!)我正在查看以下示例项目结构

    myproj/
      src/my/gwtproj/
         client/
           img/
             foo1.png
           AppClientBundle.java
           foo2.png
         public/
           img/
             foo3.png
           foo4.png
      war/
        img/foo5.png
        foo6.png
      .classpath
      .project
    

    假设我们可能(或可能不需要)在某些AppClientBundle 接口(或其他应用程序引用上下文)中引用此类资源:

    interfaces AppClientBundle extends ClientBundle {
    
      @Source("img/foo1.png")
      ImageResource fooImg();
    }
    

    那么它似乎取决于您的要求,例如:

    • R.a) 这些资源(如图像)在应用程序代码中引用,例如在我们的AppClientBundle 接口中通过@Source 注释
    • R.b) 这些资源将按文件夹分组,例如foo2.pngimg/foo1.png
    • R.c) 这些资源应该在某些特定应用程序 URL 上下文路径之外可用,例如如果用作小部件库,例如http://host1/gwtapp1/foo4.pnghttp://host1/gwtapp2/foo4.png
    • R.d) 这些资源需要独立于应用程序(例如外部)引用 URL,例如http://host1/gwtapp1/foo4.pnghttp://host1/foo6.png

    这是一个人可以做的事情(可能性)及其对上述R.*的影响:

    • P.1)我认为一般推荐)很好地将文件夹结构的资源放在my.gwtproj.client 下(例如@ 987654336@)
      • 这样@Source("img/foo1.png")... 工作正常
      • 在上面的文档中,他们谈到了一些 public 文件夹(在我的情况下为 my.gwtproj.public),但我不允许在 Eclipse 中将其创建为包(因为 @ 987654340@ 是保留的 Java 关键字,但可以通过 Navigator 视图创建它)
        • 但是,这种方式上面的 @Source 不起作用(可能是因为它是相对 AppClientBundle 文件系统位置的问题)
        • 尽管如此,如果资源应该在应用程序上下文中公开可用,则可能必须通过此 public 文件夹进行操作
    • P.2)“未分组”资源直接放在 myproj/war 下,例如projdir/war/foo6.png
      • 这样可以在注释中使用/找到它,例如@Source
      • 它可以在应用程序本身之外通过例如引用http://host1/foo6.png
    • P.3)文件夹结构的资源放在myproj/war 下,例如projdir/war/img/foo5.png
      • 与 P.2 相比)@Source("img/foo5.png") 将不再工作

    【讨论】:

    • 一个非常广泛的分析,但它确实应该是一个新问题。在这种情况下,您应该更好地构建您的要求,否则它可能会被标记为“不清楚所要求的内容”。
    • 查看原始问题、标题、谷歌排名和遇到相同问题等。我发现我的答案非常合适,但不明白,为什么我们应该创建另一个重复的问题。如果我在某些方面可能是错误的,但如果指出,我会在这里更正它。
    • 这很有帮助,谢谢,我没听说过ClientBundle。我创建了一个简单的example project 来展示如何设置资产文件并将它们包含在一个包中。
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 2012-07-10
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多