【问题标题】:Can DropWizard serve assets from outside the jar file?DropWizard 可以从 jar 文件外部提供资产吗?
【发布时间】:2012-12-22 19:43:20
【问题描述】:

在查看the documentation 时,DropWizard 似乎只能提供位于 src/main/resources 中的静态内容。我想将我的静态文件保存在 jar 文件之外的单独目录中。那可能吗?还是大多数人使用 nginx/Apache 来处理他们的静态内容?

【问题讨论】:

    标签: static-content dropwizard


    【解决方案1】:

    【讨论】:

    • 你不需要任何插件。只需add the document root in the classpath
    • 很遗憾这个插件老了,最高只支持0.7。这可能只是更改插件以使用较新的 Dropwizard (io.dropwizard) 类路径的问题,但我没有尝试过。还有其他开箱即用的答案吗?
    • 是的,请按照下面我的回答中概述的步骤操作。
    【解决方案2】:

    根据 Marcello Nuccio 的回答,我仍然花了我一天的大部分时间才把它弄好,所以这里是我所做的更详细的说明。

    假设我有这个目录结构:

    • my-dropwizard-server.jar
    • 静态文档
      • 资产
        • 图像.png

    那么这就是你必须做的事情:

    1) 在您的 dropwizard Application 类中,添加一个新的 AssetsBundle。如果您希望从不同的 URL 提供您的资产,请更改第二个参数。

    @Override
    public void initialize(Bootstrap<AppConfiguration> bootstrap) {
        bootstrap.addBundle(new AssetsBundle("/assets/", "/assets/"));       
    }
    

    2) 通过像这样配置 maven-jar-plugin 将文档根添加到您的类路径。 (以正确的形式获取“./staticdocs/”花了我一段时间。类路径是无情的。)

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <archive>
          <manifest>
            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            <addClasspath>true</addClasspath>
          </manifest>
          <manifestEntries>
            <Class-Path>./staticdocs/</Class-Path>
          </manifestEntries>
        </archive>
      </configuration>
    </plugin>
    

    3) 这一步完全是可选的。如果您想从不同的根路径(例如“app”)提供您的 Jersey REST 资源,请将以下内容添加到您的配置 YML:

    server:
      rootPath: /app/*
    

    现在您可以像这样访问您的静态内容,例如:

    localhost:8080/assets/image.png
    

    【讨论】:

    • 您可以通过将assets 文件夹放在src/main/resources 中来避免使用maven-jar-plugin
    • 但这会将资产打包到 jar 中,不是吗?这个问题的重点是为 jar 外部的资产提供服务。
    • 你是对的。重要的一点是:将你的资产放在你喜欢的任何地方,但要确保它们可以在类路径中找到。这是唯一的要求。
    【解决方案3】:

    user manual 说:

    使用扩展的 AssetsBundle 构造函数从根路径为 assets 文件夹中的资源提供服务。

    即这些文件作为资源从类路径加载。那么您只需要正确设置服务的类路径即可。

    使用默认配置,这意味着你需要调用文档根assets,并将文档根的父文件夹放在类路径中。然后,例如,assets/foo.html 将在

    http://localhost:8080/assets/foo.html
    

    【讨论】:

    • 如果您的静态资产确实是 html 文件,这很好。如果它们是大文件、二进制文件或压缩文件,最好将它们放在 jar 文件之外。
    • @CraigP.Motlin,单个 jar 文件的最大优点是易于部署:只需复制一个文件,所有内容都会更新并保证像在登台服务器上一样工作。通常最大的缺点是需要在生产服务器上上传一个大文件。为了解决这个问题,我使用rsync 来更新最新部署文件的中间副本。这是非常快速和可靠的。
    • @CraigP.Motlin,澄清一下:我并不是说要把所有资产都放在罐子里。正如我在回答中所说,您只需要将资产文件夹添加到类路径中。换句话说:将 assets 文件夹放在任何你喜欢的地方,唯一的要求是在 classpath 中找到它。
    • 我明白了。 Dropwizard documentation 建议创建阴影 jar,这意味着类路径上的所有内容 is 在许多应用程序中的阴影 jar 中。但您也可以对类路径进行更细粒度的控制。
    【解决方案4】:

    在官方 dropwizard-bundles 中维护了最新的 dropwizard-configurable-assets-bundle。你可以在 github https://github.com/dropwizard-bundles/dropwizard-configurable-assets-bundle 找到它。当前版本支持 dropwizard 0.9.2

    这可用于从任意文件系统路径提供静态文件。

    【讨论】:

      【解决方案5】:

      绝大多数提供静态内容的网站都是通过专用的网络服务器来实现的,或者在更大范围内通过CDN

      有时,您可能希望将应用程序部署为一个独立的单元,其中包含 Dropwizard 的所有资产。

      可以让 Dropwizard 从类路径外部提供资产,但最简单的方法是编写您自己的资产端点,该端点从外部配置的文件路径中读取。

      【讨论】:

        【解决方案6】:

        补充 craddack 的回答:正确,只要将资产添加到类路径中,就可以使用常规 AssetsBundle。 如果使用 gradle 和 oneJar,可以在 oneJar 任务中的类路径中添加目录:

        task oneJar(type: OneJar) {
          mainClass = '...'
          additionalDir = file('...')
          manifest {
            attributes 'Class-Path': '.. here goes the directory ..'
          }
        }
        

        https://github.com/rholder/gradle-one-jar

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-10
          • 1970-01-01
          • 2020-06-19
          • 2016-02-29
          • 2020-11-16
          • 1970-01-01
          • 1970-01-01
          • 2019-01-04
          相关资源
          最近更新 更多