2012-03-01 5 views
20

Se schiero un file guerra per Tomcat, chiamato ad esempio senza-1.1.2.war, come posso distribuire in modo che esso viene estratto a webapps/bar e la sua radice URL è /bar/...?Distribuzione file di guerra per Tomcat con un percorso diverso

La mia intenzione qui è di mantenere il file war nel server webapps con le sue informazioni sulla versione in modo da sapere quale versione è installata ma sovrascrivere una versione precedente dell'app.

Potrei distribuire il file di guerra utilizzando PSI Probe. Questo mi permetterebbe di specificare un contesto di destinazione per l'app web. Tuttavia, vuol dire che perderei qualsiasi informazione sulla versione nel nome del file war.

+0

Possibile duplicato di [Separazione del nome dell'applicazione di guerra dal nome del file di guerra] (http://stackoverflow.com/questions/5875413/separating-war-application-name-from-war-file-name) – OhadR

risposta

23

Tomcat estrae sempre il contenuto di un file di guerra, in una cartella con lo stesso nome (quando è configurato per distribuire guerre - come predefinito, ecc.).

È possibile estrarlo in un nome di cartella a scelta. Pertanto, se si decomprime manualmente il contenuto di foo.war in una cartella denominata bar/, anziché caricare semplicemente la guerra nella cartella delle app Web, verrà comunque caricata l'applicazione Web.

Tuttavia, questo è del tutto inutile, come è possibile specificare il modello URL dell'applicazione senza fare confusione con il nome del file della cartella/guerra a tutti sovrascrivendo l'elemento root di contesto per la vostra applicazione:

Questo è spesso situato in il Tomcat server.xml - ma questa pratica è abbastanza scoraggiata. Invece, io suggerirei di usare context.xml nella cartella META-INF dell'applicazione web/file di guerra:

<Context path="/bar" .../> 

Quando l'applicazione viene distribuita, il context.xml dovrebbero essere copiati /conf/Catalina/localhost ma rinominato per

Si noti che le radici di conext devono essere univoche e ci sono alcune considerazioni aggiuntive se si utilizzano le operazioni autoDeploy o deployOnStartup (origine http://tomcat.apache.org/tomcat-7.0-doc/config/context.html).


Altre opzioni includono:

  • Pulire le applicazioni del web cartella ogni distribuzione e rilasciare i nuovi foo-1.1.0 guerra in
  • includono il numero di versione in un file flat.. foo/version1
  • O semplicemente includere la versione in un file config/XML.

È inoltre possibile utilizzare Ant (o uno strumento equivalente) per automatizzare le distribuzioni (ed eseguire una delle operazioni precedenti).

+0

Ho pensato che potrebbe essere un modo per distribuire un file war senza estrarne manualmente il contenuto in modo da poter conservare le informazioni sulla sua versione ma distribuirlo su un contesto esistente. – z12345

+1

Qual è la versione dell'app che ha a che fare con il nome del file war/della cartella dell'applicazione? – Mikaveli

+0

Ho modificato la domanda nella speranza che sia più chiara. – z12345

4

Se si desidera includere solo le informazioni sulla versione nel nome del file di guerra, è possibile denominarlo come: my-app##1.2.3.war. Viene decompresso nella directory my-app##1.2.3 ma il contesto sarà solo my-app (ad esempio http://host/my-app/).

lavora almeno con Tomcat 7.0.55

+0

Per distribuire questo da URL si dovrebbe url-codificare il # sharp a% 23, ad es. 'http: // localhost: 8080/manager/text/deploy? Path =/myapp% 23% 23v1.2.2.24% 20 (myName) & war = file:/D: /RELEASE.Tomcat.wars/myapp%23 % 23v1.2.2.24% 20 (myName) .war ', altrimenti la distribuzione fallirà con un'eccezione file-not-found. – Max

7

C'è un punto importante da sottolineare sull'attributo path della definizione frammento contesto. Per citare il documentation on the topic:

Quando le operazioni autodeploy o deployOnStartup vengono eseguite da un host, il nome e il contesto percorso dell'applicazione web sono derivati ​​dal nome (s) del file (s) che definiscono (s) l'applicazione web.

deployOnStartupè il comportamento di default di Tomcat ospita.

Per seguire la documentazione, questo ha una conseguenza molto importante:

il percorso del contesto non può essere definita in un META-INF/context.xml

Secondo le vie di defining a Tomcat context, questo lascia solo due soluzioni:

  • In individual files (with a ".xml" extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory
  • Inside a Host element in the main conf/server.xml, che è una soluzione scoraggiato in un ambiente di produzione in quanto richiede il riavvio del server

Un'altra soluzione sfrutta la unpackWARs attribute.

Nel mio punto di vista, per questi motivi, il modo generale e facile da implementare un percorso sottile, in un ambiente di produzione sta prendendo advange del naming di file di guerra (che potrebbero includere la gestione versioni ed essere una soluzione al vostro problema). Un singolo sharp (ad esempio test # path.war) nei nomi file di guerra implica un segmento nel percorso di contesto (ad esempio /test/percorso). Un doppio tagliente introduce il numero di versione (ad esempio # test ## 112.war). Funziona indipendentemente dal fatto che il disimballaggio dei file di guerra, l'implementazione a caldo o meno, sia indipendente dalla distribuzione (gestore o file system) e gestisce versioni multiple di uno stesso archivio.

Tuttavia, se è necessario disporre di un percorso distinto dal nome dell'archivio, sembra che l'unica soluzione sia il descrittore nella directory /conf/[enginename]/[hostname]/ o nel file server.xml. Per questi, è necessario un accesso al filesystem del server.

La soluzione pertinente è strettamente correlata al modo in cui Tomcat è configurato e gestito quotidianamente.

+0

Non sono sicuro che lo stia facendo bene, ma questo sembra il modo giusto. Rende più comprensibile la colonna 'versione' nell'app manager Tomcat. Sto provando a copiare/spostare app in webaps come 'cp /tmp/tds-5.0.0-alpha3.war thredds ## 500a3.war' per mantenere separati i numeri di versione per THREDDS. –