2015-06-12 12 views
5

Attualmente sto utilizzando Tomcat 7. Voglio distribuire/installare un servlet che verrà caricato in ogni webapp nel loro contesto. Sto cercando una soluzione che non mi coinvolga aggiungendo il servlet alla guerra di ogni webapp. È possibile?Come installare un servlet in un contenitore Tomcat e averlo caricato nel contesto di ogni app Web?

In definitiva, voglio che funzioni richieste su un sottotracciato comune della root di contesto di ogni webapp.

Stavo pensando che forse avrei potuto caricare un servlet annotato dalla Tomcat classloader comune, ma non ho potuto ottenere quello per funzionare. Ad esempio, lo stesso servlet annotato ha funzionato in guerra, ma non nel classloader comune.

@WebServlet(
    description = "Says Hello", 
    urlPatterns = { "/HelloServlet" }) 
public class HelloServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     // log hello 
    } 
} 

Grazie per il vostro aiuto.

+1

Crea una terza app per condividere il servlet in entrambi;) – Stefan

+0

@StefanLindenberg puoi espandere il tuo commento? Non sono a conoscenza di come un'app possa fornire un servlet nel contesto di un'altra webapp. Forse forniscilo come risposta ... – successhawk

+0

Se vuoi rendere disponibile il tuo servlet in più percorsi, puoi installare i reindirizzamenti nella sua posizione effettiva (e unica). –

risposta

0

La cosa che descrivi non è esattamente compatibile con la logica di Servlet.

Se si desidera utilizzare un servizio/libreria da 2 diverse applicazioni in Tomcat, è possibile aggiungere una libreria come libreria condivisa in Tomcat. Quindi, sarai in grado di utilizzare questa libreria dai servlet dell'applicazione. Se si desidera ottenere ciò, sarà necessario aggiungere il jar in $CATALINA_HOME/shared/lib e quindi modificare $CATALINA_HOME/conf/catalina.properties per aggiungere {catalina.home}/mylibs/*.jar nella proprietà common.loader. Quindi, sarai in grado di utilizzare la tua libreria nei vari servlet delle tue applicazioni.

Tuttavia, questo è diverso da ciò che descrivi. In realtà, ciò che descrivi è irrealizzabile in Tomcat, poiché ogni applicazione Web ha il proprio ApplicationContext. Pertanto, il contesto dell'applicazione webappA sarà http://host/webappA e webappB il contesto dell'applicazione sarà http://host/webappB. Quindi, se si desidera avere un servlet al di fuori di queste 2 applicazioni, questo servlet apparterrà ad un ApplicationContext diverso. Pertanto, non sarà possibile accedere a questa servlet tramite uno dei due percorsi http://host/webappA/common, http://host/webappB/common, che appartiene ai precedenti ApplicationContexts.

+0

Grazie. Conosco common.loader, ma c'è un modo per caricare un servlet "condiviso"? Stavo pensando che sarebbe stato possibile visto che urlPatterns era relativo alla root di contesto della webapp e speravo che sarebbe stato caricato in ApplicationContext di ogni webapp. Utilizzando il servlet fornito come esempio: http: // host/webappA/HelloServlet e http: // host/webappB/HelloServlet. Cosa mi manca? – successhawk

+0

Questo è quello che ho descritto in precedenza. L'unico modo per farlo è aggiungere il servlet in entrambe le applicazioni (in modo che sia accessibile all'interno dei loro contesti). L'unico modo per "condividere" le sue funzionalità è aggiungerlo come un contenitore di libreria condiviso e utilizzarlo in questo modo dalle tue applicazioni. – Dimos