2013-01-08 48 views

回答

11
+4

你不需要任何插件。只需[在类路径中添加文档根目录](http://stackoverflow.com/a/22221194/453605)。 –

+0

不幸的是,这个插件已老化,并且只支持0.7。它可能只是一个更改为插件使用更新的Dropwizard(io.dropwizard)类路径的问题,但我没有尝试过。任何其他现成的答案? – Joel

+0

是的,请按照下面我回答中列出的步骤操作。 – craddack

2

绝大多数服务于静态内容的网站都是通过专用的网络服务器,或者在更大规模的情况下通过CDN

有时,你可能希望将应用程序部署为完成这也正是Dropwizard进来所有资产独立单元。

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

4

user manual说:

使用扩展AssetsBundle构造服务资源资产从文件夹的根路径。

即文件作为资源从类路径加载。然后你只需要正确设置服务的类路径。

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

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

这很好,如果你的静态资产真的是HTML文件。如果它们是大文件,二进制文件或压缩文件,最好将它们保存在jar文件之外。 –

+0

@ CraigP.Motlin,单个jar文件的一大优点是易于部署:只需复制一个文件,所有内容都会更新并保证可以在临时服务器上工作。通常最大的缺点是需要在生产服务器上上传一个大文件。要解决这个问题,我使用'rsync'来更新最新部署文件的中间副本。这是非常快速和可靠的。 –

+0

@ CraigP.Motlin,澄清:我不是说所有的资产都放在罐子里。正如我在我的回答中所说的,您只需将资源文件夹添加到类路径中。换句话说:将资产文件夹放在任何你喜欢的地方,唯一的要求是它可以在类路径中找到。 –

7

工作过马塞洛Nuccio的回答,它仍然采取了我一天的大部分时间得到它的权利,所以这是我在一个更详细一点做。

比方说,我有这样的目录结构:

  • 我-dropwizard-的server.jar
  • staticdocs
    • 资产
      • image.png

然后这就是你要做的工作:

1)在你的dropwizard Application类中,添加一个新的AssetsBundle。如果您希望您的资产通过其他网址提供,请更改第二个参数。

@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)这一步完全是可选的。如果你想从不同的根路径为你的新泽西州的REST资源(例如,“应用程序”),以下内容添加到您的配置阳明:

server: 
    rootPath: /app/* 

现在,您可以访问您喜欢这个静态内容,例如:

localhost:8080/assets/image.png 
+0

通过将'assets'文件夹放入'src/main/resources'中,可以避免使用'maven-jar-plugin'。 –

+2

但是这会将资产打包到jar中,不是吗?这个问题的重点是从罐子的外部提供资产。 – craddack

+0

你是对的。重要的一点是:将您的资产放在任何你喜欢的地方,但要确保它们在类路径中找到。这是唯一的要求。 –

1

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

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

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

相关问题