2011-01-27 23 views
8

Tengo una aplicación web que en producción ejecuto en Tomcat. Utiliza el conector MySQL, sin embargo no está incluido con la guerra, sino que está incluido en el directorio lib común de Tomcat, de modo que puedo acceder a la fuente de datos a través de JNDI.Ejecución de la aplicación web en Jetty y Tomcat

Me gustaría hacer algo similar con Jetty (durante el desarrollo), y más precisamente Jetty + Maven. ¿Hay alguna manera de incluir el contenedor mysql-connector en el classpath al ejecutar Jetty a través de Maven (es decir, no tenerlo incluido en el archivo war)?

También debería tener en cuenta que estoy usando Maven para mi proceso de compilación y tengo el conector mysql especificado como ámbito "provisto".

+0

¿Encontró una solución a su problema? – Stephane

Respuesta

2

No responde su pregunta directamente, pero como me encanta la portabilidad en webapps, mi guerra contendrá el contenedor y un grupo de conexiones (por ejemplo, el super duper c3p0). Eso significa que el contenedor ya no administrará la conexión de la base de datos ni usaré JNDI para describir las propiedades de la conexión. Sin embargo, la aplicación web es ahora 100% portátil y predecible en Tomcat, amarre, resina, etc. JBoss

+0

pero OP no desea empaquetar el contenedor. De lo contrario, es fácil. – Nishant

+0

@Nishant: Sí, lo mencioné en mi respuesta. Puede agregar información útil, de lo contrario, simplemente puedo eliminar la respuesta. – cherouvim

+0

por favor no borrar. No quise ofender (y lo siento si te sentiste así). Seguro que es una buena alternativa. – 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> 

Es un embarcadero-env.xml, lo que apunta a un archivo .properties, que contiene toda los parámetros de conexión a 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> 

Es una configuración de resorte (estoy usando la primavera también)

Y luego, llamo embarcadero mvn: correr, y funciona bien ...

+0

¿su dependencia de MySQL dice 'proporcionado'? – Nishant

+0

Honestamente, estoy usando postgres en lugar de mysql, pero parece que no hay diferencia de lo que están usando en este contexto. No, tiene un alcance de compilación ... ¿Importa? – javagirl

+0

Sí, en realidad los artefactos de ámbito 'compilar' se empaquetan con war, mientras que los artefactos marcados con 'provided' no lo son. Y, se supone que el entorno (en este caso, el servidor de aplicaciones) proporciona esos artefactos. Uno de estos artefactos es 'servlet', ya que todos los servidores de aplicaciones proporcionan su propia implementación. – Nishant

3

Additinally a la respuesta anterior: hay que añadir a su plugin embarcadero en experta en la dependencia de configuración:

<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> 

Y entonces usted puede utilizar alcance previsto en las principales dependencias del proyecto. Lo hice en este momento, y funciona. Gracias por su pregunta (y Nishant también)

+0

También hice esto, base en [esto] (http://dev.eclipse.org/mhonarc/lists/jetty-users/ msg02547.html), puede confirmar que funciona;) – demaniak

0

Quizás podría intentar usar Maven .war overlays para este fin, aunque no sé si funcionan con otras dependencias.

Así que, básicamente, su proyecto se

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

Cuando el proyecto original de la guerra tiene la dependencia MySQL como <scope>provided</scope> pero el módulo nuevo de la guerra es sólo un pom que tiene un <packaging>war</packaging>, depende de la guerra originales (para la superposición) tiene la dependencia de mysql con el ámbito de compilación, y ejecuta el plugin jetty (abandona el plugin jetty del módulo original-war). Si esto funciona, entonces tendrá que lidiar con la inconveniencia menor de hacer su desarrollo en un módulo, pero sea cual sea la prueba que esté haciendo en maven dentro de otro módulo.

Cuestiones relacionadas