2013-01-08 3 views

Antwort

11
+4

Sie benötigen kein Plugin. Einfach [fügen Sie den Dokumentstamm im Klassenpfad hinzu] (http://stackoverflow.com/a/22221194/453605). –

+0

Leider ist dieses Plug-In veraltet und unterstützt nur bis zu 0,7. Es kann nur eine Frage des Wechselns zum Plugin sein, um den neueren Dropwizard (io.dropwizard) Klassenpfad zu verwenden, aber ich habe es nicht versucht. Irgendwelche andere Antwort? – Joel

+0

Ja, folgen Sie den Schritten in meiner Antwort unten. – craddack

2

Die meisten Websites, die statische Inhalte bereitstellen, tun dies über einen dedizierten Webserver oder, in größerem Maßstab, eine CDN.

Gelegentlich möchten Sie vielleicht eine Anwendung als eigenständige Einheit komplett mit allen Assets bereitstellen, die sich in dem Dropwizard kommt.

Es ist möglich, Dropwizard zu bekommen Vermögen von außerhalb des Classpath zu dienen, aber Der einfachste Weg dazu besteht darin, einen eigenen Asset-Endpunkt zu schreiben, der von einem extern konfigurierten Dateipfad liest.

4

Die user manual sagt:

einen erweiterten AssetsBundle Konstruktor verwenden, um Ressourcen im Anlagenordner aus dem Stammpfad zu dienen.

, d.h. die Dateien werden als Ressourcen aus dem Klassenpfad geladen. Dann müssen Sie nur den Klassenpfad für den Dienst ordnungsgemäß festlegen.

Mit der Standardkonfiguration bedeutet dies, dass Sie den Dokumentstamm assets aufrufen müssen und den übergeordneten Ordner des Stammverzeichnisses in den Klassenpfad einfügen müssen. Dann zum Beispiel assets/foo.html werden bei

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

Dies ist in Ordnung, wenn Ihre statischen Assets wirklich HTML-Dateien sind. Wenn es sich um große, binäre oder komprimierte Dateien handelt, sollten Sie sie außerhalb der JAR-Datei aufbewahren. –

+0

@ CraigP.Motlin, Der große Vorteil der einzelnen JAR-Datei ist die einfache Bereitstellung: Kopieren Sie einfach eine einzige Datei und alles ist aktualisiert und garantiert wie auf Staging-Server arbeiten. Der größte Nachteil ist oft die Notwendigkeit, eine große Datei auf den Produktionsserver hochzuladen. Um dies zu umgehen, verwende ich 'rsync', um eine Zwischenkopie der neuesten bereitgestellten Datei zu aktualisieren. Dies ist sehr schnell und zuverlässig. –

+0

@ CraigP.Motlin, um zu verdeutlichen: Ich sage nicht, alle Vermögenswerte in das Glas zu setzen. Wie ich in meiner Antwort gesagt habe, müssen Sie nur den Ordner "Assets" zum Klassenpfad hinzufügen. Mit anderen Worten: Legen Sie den Ordner "Assets" an einer beliebigen Stelle ab, die einzige Voraussetzung ist, dass er im Klassenpfad gefunden wird. –

7

Arbeiten weg von Marcello Nuccio Antwort zur Verfügung steht, dauerte es noch mir den größten Teil meines Tages es richtig zu machen, so hier ist das, was ich in etwas mehr Detail tat .

Lassen Sie uns sagen, dass ich diese Verzeichnisstruktur haben:

  • my-dropwizard-server.jar
  • staticdocs
    • Vermögenswerte
      • image.png

Dann müssen Sie Folgendes tun, damit es funktioniert:

1) Fügen Sie in Ihrer DropWizard-Anwendungsklasse ein neues AssetsBundle hinzu. Wenn Sie möchten, dass Ihre Assets von einer anderen URL geliefert werden, ändern Sie den zweiten Parameter.

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

2) Fügen Sie den Dokumentstamm zu Ihrem Klassenpfad hinzu, indem Sie das maven-jar-plugin wie folgt konfigurieren. (Gibt es die "./staticdocs/" in die richtige Form hat mich eine Weile. Klassenpfade unversöhnlich sind.)

<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) Dieser Schritt vollständig optional.Wenn Sie Ihren Jersey REST-Ressourcen von einem anderen Wurzelpfad dienen soll (zB „App“), fügen Sie die folgende Konfiguration YML:

server: 
    rootPath: /app/* 

Jetzt können Sie Zugriff auf Ihre statische Inhalte wie dies zum Beispiel:

localhost:8080/assets/image.png 
+0

können Sie die Verwendung von 'maven-jar-plugin' umgehen, indem Sie den Ordner' assets' in 'src/main/resources' setzen. –

+2

Aber das wird die Vermögenswerte in das Glas packen, oder? Der springende Punkt dieser Frage ist, die Vermögenswerte von AUSSERHALB des Glases zu bedienen. – craddack

+0

Sie haben Recht. Der wichtigste Punkt ist: Lege deine Assets dorthin, wo du willst, aber stelle sicher, dass sie im Klassenpfad gefunden werden. Dies ist die einzige Voraussetzung. –

1

Um die Antwort von carddack zu ergänzen: Korrekt, Sie können den regulären AssetsBundle verwenden, solange Sie die Assets zu Ihrem Klassenpfad hinzufügen. Wenn Sie gradle und oneJar verwenden, können Sie ein Verzeichnis auf dem Classpath in der oneJar Aufgabe hinzufügen:

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

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

2

Es ist ein up-to-Datum dropwizard-configurable-assets-bundle bei offiziellen dropwizard Bündel gehalten. Sie finden es unter github https://github.com/dropwizard-bundles/dropwizard-configurable-assets-bundle. Aktuelle Version unterstützt DropWizard 0.9.2

Dies kann verwendet werden, um statische Dateien aus beliebigen Dateisystempfad dienen.

+0

Ich war auf der Suche nach Updates für Tage! Vielen Dank!! – Olesia