2011-01-27 15 views
8

Mam aplikację internetową, którą w produkcji używam na Tomcat. Wykorzystuje złącze MySQL, ale nie jest powiązane z wojną, a raczej jest dołączone do wspólnego katalogu lib Tomcat, więc mogę uzyskać dostęp do źródła danych przez JNDI.Uruchamianie aplikacji internetowej zarówno w Jetty, jak i Tomcat

Chciałbym zrobić coś podobnego z Jetty (podczas rozwijania), a dokładniej Jetty + Maven. Czy istnieje sposób, aby włączyć słoik konektora mysql w ścieżce klas podczas korzystania z Jetty przez Maven (tj. Nie ma go w pakiecie w pliku wojny)?

Należy również zauważyć, że używam Maven dla mojego procesu kompilacji i że złącze mysql jest określone jako "dostarczony".

+0

Czy znalazłeś rozwiązanie swojego problemu? – Stephane

Odpowiedz

2

Nie odpowiada bezpośrednio na twoje pytanie, ale ponieważ uwielbiam przenośność w aplikacjach internetowych, moja wojna będzie zawierała słoik złącza i pulę połączeń (np. Super duper c3p0). Oznacza to, że kontener nie będzie już zarządzać połączeniem z bazą danych ani nie będę używać JNDI do opisu właściwości połączenia. Ale webapp jest teraz 100% przenośne i przewidywalne na kocura, molo, żywica, JBoss itp

+0

, ale OP nie chce pakować słoika złączy. W przeciwnym razie jest to łatwe. – Nishant

+0

@Nishant: Tak, wspomniałem o tym w mojej odpowiedzi. Może dodać użyteczne informacje, w przeciwnym razie mogę po prostu usunąć odpowiedź. – cherouvim

+0

proszę nie usuwać. Nie chciałem urazić (i przepraszam, jeśli tak się czułeś). To z pewnością dobra alternatywa. – Nishant

0
<Configure class="org.mortbay.jetty.webapp.WebAppContext"> 
<New class="org.mortbay.jetty.plus.naming.Resource"> 
    <Arg>hd-props</Arg> 
    <Arg> 
     <New class="java.util.Properties"> 
      <Call name="load"> 
       <Arg> 
        <New class="java.io.FileReader"> 
         <Arg>cfg/dev-local.properties</Arg> 
        </New> 
       </Arg> 
      </Call> 
     </New> 
    </Arg> 
</New> 

Jest to pomost-env.xml, co wskazuje na plik .properties, który zawiera wszystko połączyć parametry do DB.

<bean id="jndi" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:comp/env/hd-props"/> 
    </bean> 
    <bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="properties" ref="jndi"/> 
    </bean> 

Jest config sprężyny (używam sprężynę zbyt)

A potem wzywam mvn jetty: run, i to działa dobrze ...

+0

czy twoja zależność od MySQL mówi "dostarczone"? – Nishant

+0

Szczerze mówiąc, używam PostgreSQL zamiast mysql, ale wygląda na to, że nie ma różnicy, czego używa dB w tym kontekście. Nie, ma zasięg kompilacji ... czy to ma znaczenie? – javagirl

+0

Tak, faktycznie artefakty o "kompilacji" są pakowane wraz z wojną, podczas gdy "dostarczone" oznaczone artefakty nie są. A środowisko (w tym przypadku serwer aplikacji) ma zapewniać te artefakty. Jednym z takich artefaktów jest "serwlet", ponieważ wszystkie aplikacje zapewniają własną implementację. – Nishant

3

Additinally do poprzedniej odpowiedzi: trzeba dodać do swojej wtyczki molo w zależności od konfiguracji maven:

<plugin> 
      <groupId>org.mortbay.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>${jetty.version}</version> 
      <configuration> 
       <stopKey>blah-blah-blah</stopKey> 
       <stopPort>9966</stopPort> 
       <webAppConfig> 
        <contextPath>/</contextPath> 
       </webAppConfig> 
       <jettyEnvXml>${basedir}/src/jetty-env.xml</jettyEnvXml> 
      </configuration> 
      <dependencies>    
       <dependency> 
        <groupId>postgresql</groupId> 
        <artifactId>postgresql</artifactId> 
        <version>8.4-701.jdbc4</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

a następnie można użyć dostarczonego w zakres podstawowych zależnościach projektu. Zrobiłem to teraz i to działa. Dziękuję za twoje pytanie (i Nishant też)

+0

Zrobiłem to również na podstawie [this] (http://dev.eclipse.org/mhonarc/lists/jetty-users/ msg02547.html), może potwierdzić to jako działające;) – demaniak

0

Być może mógłbyś spróbować użyć w tym celu Maven .war overlays, choć nie wiem, czy działają z innymi zależnościami.

Więc w zasadzie projekt byłby

parent 
|---- original-war 
|---- new-war 

Gdzie oryginalny wojnie projekt ma zależność MySQL jako <scope>provided</scope> ale moduł nowej wojny jest tylko pom że ma <packaging>war</packaging> zależy na oryginalnym wojny (dla nakładki) ma zależność mysql z zakresem kompilacji i uruchamia wtyczkę pomostu (zostawiając wtyczkę pomostu z oryginalnego modułu wojny). Jeśli to zadziała, to będziesz musiał poradzić sobie z drobną niedogodnością związaną z rozwojem w jednym module, ale niezależnie od tego, jakie testy przeprowadzasz w urządzeniu w innym module.

Powiązane problemy