2012-11-17 4 views
5

Ich versuche, ein .jar zu erzeugen, das eine main() enthält, die Jetty starten würde.Embedded Jetty: Wie wird ein WAR verwendet, das in der JAR-Datei enthalten ist, von der Jetty gestartet wird?

Mein Problem ist, dass ich die .war mag, dass Jetty Lasten im gleichen .jar aufgenommen werden.

Ich habe in der Lage gewesen, mit dem .jar mit dem .war zu erstellen:

Im pom.xml:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <finalName>myApp</finalName> 
     <appendAssemblyId>false</appendAssemblyId> 
     <archive> 
      <manifest> 
       <mainClass>com.myApp.Server</mainClass> 
      </manifest> 
     </archive> 
     <descriptors> 
      <descriptor>src/main/resources/executable-jar-assembly.xml</descriptor> 
     </descriptors> 
    </configuration> 
    <executions> 
     <execution> 
      <id>make-my-jar-with-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

ausführbare-jar-assembly.xml:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

<id>jar-with-dependencies-and-war</id> 
<formats> 
<format>jar</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 
<dependencySets> 
    <dependencySet> 
     <outputDirectory>/</outputDirectory> 
     <useProjectArtifact>false</useProjectArtifact> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
</dependencySets> 
<fileSets> 
    <fileSet> 
     <directory>target/classes/</directory> 
     <outputDirectory>/</outputDirectory> 
    </fileSet> 
    <fileSet> 
     <directory>target/</directory> 
     <includes> 
      <include> 
       myApp.war 
      </include> 
     </includes> 
     <outputDirectory>/</outputDirectory> 
    </fileSet> 
</fileSets> 

Der Code, den Krieg in Jetty zu setzen:

handler.setWar("myApp.war"); 

... Ich habe auch versucht:

URL res = Server.class.getResource("myApp.war"); 
handler.setWar(res.toExternalForm()); 

... und:

URL res = Thread.currentThread().getContextClassLoader().getSystemResource("myApp.war"); 
handler.setWar(res.toExternalForm()); 

Aber nichts funktioniert!

Mit diesem letzten Beispielcode zum Starten von Jetty scheint der Server korrekt zu starten, aber keine Anforderungen funktionieren. Die Konfiguration ist offensichtlich falsch.

Ich weiß, es gibt einige Problemumgehungen, ein .war selbst ausführbar zu machen, aber ich würde gerne die ".war innerhalb der .jar" arbeiten.

Gibt es eine Idee, wie die .war konfiguriert werden sollte?

Antwort

4

Ich spielte mit diesem eine Menge in 2009-10 für eine bestimmte App.

Das Problem, das ich fand, ist, dass, wenn Sie einen Krieg in einem Jar eingebettet haben, die URIs diejenigen sein können, die nicht mit dem Standard jar: URI-Handler versuchen, auf die WAR-Datei zuzugreifen.

Es gibt eine Reihe von Lösungen, die ich gefunden:

  1. Tells Anlegestelle zu extrahieren/die WAR-Datei in ein temporäres Verzeichnis

  2. Implementieren Sie Ihre eigenen URI-Handler explode (das war eine interessante Übung , aber wenn Sie den Code selbst unterstützen müssen, würde ich nicht empfehlen, das zu tun)

  3. Machen Sie die WAR-Datei eine ausführbare WAR-Datei, z die gleiche Art von Trick, die Jenkins benutzt. Dazu überlagern Sie die Jetty-Server-Klassen und Ihre Hauptklasse mit der WAR-Datei. Dann zeigen Sie einfach Jetty auf die JAR-Datei selbst als Kriegsdatei.Jetty kümmert sich nicht darum, dass der Dateiname endet nicht in .war

Alle drei für mich auf Jetty 7 habe ich den Verdacht, dass die Situation gleich bleiben wird.

Am Ende entschied ich mich für Option 3. Es funktioniert als die einfachste, hinterlässt keine temporären Dateien auf dem System des Benutzers und ist am schnellsten zu starten.

+0

Wie bewerkstelligen Sie # 1? Mein Versuch war 'WebAppContext.setWAR (" jar: ... ");' aber Sie erwähnen das 'jar:' Präfix funktioniert nicht. Mit dem oben genannten Code extrahiert jetty das '.war' in das Verzeichnis'/tmp/jetty/webapp/', aber die Navigation zum Webserver zeigt mir eine Verzeichnisliste'/tmp/jetty/webapp/'und nicht die Webapp. @Stephen – cklab

+0

Ich habe keinen Zugriff mehr auf den Code (gehört dem ehemaligen Arbeitgeber). IIRC Ich habe den "Krieg" in '/ tmp' selbst extrahiert und sie haben ihn dem Steg –

+2

-1 mangels Besonderheiten gegeben. Das ist fast schlimmer als gar keine Hilfe. – barclay

0

Ich habe versucht wie Sie mit einer Kriegsdatei im Glas, aber Jetty schien mir einen Verzeichniseintrag mit der Kriegsdatei als einziger Eintrag zu dienen, den ich seltsam fand ... Nicht sicher, ob ich etwas falsch gemacht habe da ...

Ich habe festgestellt, dass die explodieren der WAR-Datei in einem Verzeichnis innerhalb der JAR-Datei für mich bisher funktioniert. Ich mag später noch ein paar seltsame Dinge aufdecken, aber bis es soweit ist, bleibe ich dabei.

Verwandte Themen