2010-10-28 13 views
6

Estoy migrando desde el plugin de Maven al plugin Cargo (cargo-maven2-plugin) porque Cargo estará feliz de ejecutar WAR de módulos Maven dependientes. Dentro de la aplicación web nos hemos tomado grandes molestias para externalizar toda la configuración a través de JNDI. Estas definiciones JNDI son específicas de la aplicación web y, por lo tanto, se ubican en un archivo jetty-env.xml que está fuera de WAR. Usando el plugin embarcadero, especificamos el archivo de la siguiente manera:¿Cómo especificar el archivo jetty-env.xml para el plugin Maven Cargo para Jetty?

 <plugin> 
      <groupId>org.mortbay.jetty</groupId> 
      <artifactId>maven-jetty-plugin</artifactId> 
      <configuration> 
       <jettyEnvXml>${basedir}/target/config/jetty-env.xml</jettyEnvXml> 
      </configuration> 
     </plugin> 

¿Cómo hace uno para especificar esto dentro del Plugin Cargo? Esta es la configuración que tengo hasta ahora. Es, por supuesto, en su defecto, debido a la configuración de JNDI ausente:

 <plugin> 
       <groupId>org.codehaus.cargo</groupId> 
       <artifactId>cargo-maven2-plugin</artifactId> 
       <configuration> 
        <container> 
         <containerId>jetty6x</containerId> 
         <type>embedded</type> 
        </container> 
        <configuration> 
         <deployables> 
          <deployable> 
           <groupId>com.mycompany</groupId> 
           <artifactId>my-war-module</artifactId> 
           <type>war</type> 
           <properties> 
            <context>/</context> 
           </properties> 
          </deployable> 
         </deployables> 
        </configuration> 
        <wait>false</wait> 
       </configuration> 
       <executions> 
          ...... 
       </executions> 
     </plugin> 

Respuesta

1

La respuesta de Mond provocó la idea de que quizás podría usar la configuración de Cargo para depositar mi (rebautizado y ligeramente modificado) embarcadero-env.xml en el directorio "contextos". Para mi sorpresa, simplemente funcionó. Aquí lo que hice:

Para mi configuración de carga que añade lo siguiente:

<configfiles> 
    <configfile> 
     <file>${basedir}/../config/jetty-env.xml</file> 
    <todir>contexts</todir> 
    <tofile>${jetty6.context}.xml</tofile> 
    </configfile> 
</configfiles> 

Pero con el fin de convertir mi muelle de una env.xml en un context.xml real que añade lo siguiente:

<!-- Activates the Jetty-Plus feature so we can create/share JNDI resources --> 
<Array id="plusConfig" type="java.lang.String"> 
    <Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item> 
    <Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item> 
    <Item>org.mortbay.jetty.plus.webapp.Configuration</Item> 
    <Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item> 
    <Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item> 
</Array> 

<!-- Miscellaneous properties that were take from the CARGO version of this file that is created automatically 
    (and then replaced by this file). If you ever upgrade Cargo you may need to change these. --> 
<Set name="contextPath">/${jetty6.context}</Set> 
<Set name="war"> 
    <SystemProperty name="config.home" default="."/>/webapps/${jetty6.context}.war</Set> 
<Set name="extractWAR">true</Set> 
<Set name="defaultsDescriptor"> 
    <SystemProperty name="config.home" default="."/>/etc/webdefault.xml</Set> 
<Set name="ConfigurationClasses"> 
    <Ref id="plusConfig" /> 
</Set> 

Estaba preocupado de que CARGO volcara su propio archivo de contexto DESPUÉS de que copiara el mío allí, pero fue lo suficientemente inteligente como para copiar el mío al final.

+0

la solución es genial, pero cuando intento implementarlo, me enfrento a un problema aún más fundamental: Cargo no genera el contexto xml. Será genial si puedes compartir algo de experiencia conmigo. http://stackoverflow.com/questions/10170949/where-is-cargo-generating-context-xml-for-jetty-6-x –

+1

Solo una nota rápida para las personas que encontraron esta solución: Esta solución no funciona con embarcadero integrado . Necesitas uno instalado. Para la instalación automática, consulte la actualización de HDave en el enlace del comentario anterior. –

3

Según CARGO-804, implementador Muelle de Carga soporta ahora incorporación de un muelle de una env.xml dentro de su guerra (a partir de la versión 1.0.3) .

Y con el fin de mantener el jetty-env.xml fuera de la guerra "real", mi sugerencia sería la creación de un módulo de guerra adicional para alojar el archivo jetty-env.xml y configurar por carretera a merge WAR files (prestar una especial atención al elemento <extensions>true</extensions> lo cual es importante , como se menciona en CARGO-524).

+0

Parece que podría poner el archivo jetty-env.xml en el directorio WEB-INF, pero no me gustaría enviar un WAR a los clientes con ese archivo allí.Esperaba evitar la creación de otro módulo Maven cuya existencia fuera solo para actuar como servidor para la prueba de integración de otros módulos Maven. Pensé que tal vez alguna combinación de propiedades del sistema o argumentos de línea de comando o algo así podría haberlo evitado. – HDave

+0

@HDave: Sí, entiendo que desee mantener el archivo jetty-env.xml fuera de WAR, por lo que sugerí el enfoque de fusión. Pero también entiendo que crear otro módulo solo con el propósito de Cargo podría no ser deseado. Sin embargo, esa es la única solución en la que podría pensar. Veamos si encuentras algo mejor. –

+0

@Pascal - Después de un estudio limitado, pero cuidadoso, creo que su trabajo de crear otro módulo Maven es el único enfoque que puede funcionar en este momento. He creado una solicitud de mejora aquí, que resume los detalles: – HDave

1

Comparto el mismo problema y deseo tener una instalación limpia. No me atraía la fusión de archivos WAR. En su lugar, utilizo un ensamblaje para mantener un archivo ZIP de todas las propiedades externas. Como módulo separado, puedo implementar los contenidos del archivo ZIP en el entorno JETTY. A su vez, aprovecho cómo Jetty usa el nombre de la aplicación web para cargar un archivo de entorno complementario (para webapps/foo.war Jetty usa contexts/foo.xml para la configuración). Por lo tanto, aunque no es tan compacto como una solución de carga pura, lo prefiero, ya que el archivo WAR no se adultera en su progreso durante todo el proceso de promoción. La solución también es un mecanismo general para administrar todas las actividades de configuración. Puedo señalar más detalles si alguien está interesado.

+0

Suena interesante. Sabía que Tomcat buscaba contextos/foo.xml, pero no sabía que Jetty lo hizo. ¿Estás diciendo que tu solución funciona junto con la carga o la reemplaza? ¿Puedes poner recursos JNDI en foo.xml? – HDave

+0

En realidad puede, pero resultó ser una opción inestable. Se sobreescribe en redespliegues. La solución funciona en conjunto con Cargo. Estoy discutiendo el tema con la gente de Jetty y espero obtener una solución sólida. El uso de propiedades parece interesante ... –

+0

Hola, he podido resolver un misterio para mí ... ¡así que Cargo estaba generando el archivo de configuración en lugar de Jetty! Entonces sí, tu nueva respuesta es ideal. Mi único problema ahora es cómo habilitar las propiedades para que se pueda usar el mismo archivo xml en todos los entornos ... –

1

Otra cosa que quiero hacer es filtrar propiedades. Hasta ahora tengo esto:

<profile> 
     <id>deploy-properties</id> 
     <activation> 
      <activeByDefault>false</activeByDefault> 
     </activation> 
     <properties> 
      <deployable.classifier>properties</deployable.classifier> 
      <deployable.type>zip</deployable.type> 
      <ys.imq.user>UserFromDeploymentPom</ys.imq.user> 
      <ys.imq.password>PasswordFromDeploymentPom</ys.imq.password> 
     </properties> 
     <dependencies> 
      <dependency> 
       <groupId>${project.groupId}</groupId> 
       <artifactId>${deployable.artifactId}</artifactId> 
       <classifier>${deployable.classifier}</classifier> 
       <type>${deployable.type}</type> 
       <version>${project.version}</version> 
      </dependency> 
     </dependencies> 
     <build> 
      <plugins> 
       <plugin> 
        <artifactId>maven-dependency-plugin</artifactId> 
        <executions> 
         <execution> 
          <phase>process-resources</phase> 
          <goals> 
           <goal>unpack</goal> 
          </goals> 
         </execution> 
        </executions> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <groupId>${project.groupId}</groupId> 
           <artifactId>${deployable.artifactId}</artifactId> 
           <classifier>${deployable.classifier}</classifier> 
           <version>${project.version}</version> 
           <type>${deployable.type}</type> 
           <overWrite>true</overWrite> 
           <outputDirectory>/tmp/${deployable.artifactId}</outputDirectory> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </plugin> 
       <plugin> 
        <artifactId>maven-resources-plugin</artifactId> 
        <version>2.4.3</version> 
        <executions> 
         <execution> 
          <id>copy-resources</id> 
          <phase>package</phase> 
          <goals> 
           <goal>copy-resources</goal> 
          </goals> 
          <configuration> 
           <outputDirectory>${deploy.jettyHome}</outputDirectory> 
           <overwrite>true</overwrite> 
           <resources> 
            <resource> 
             <directory>/tmp/${deployable.artifactId}</directory> 
             <filtering>true</filtering> 
            </resource> 
           </resources> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 

Es un poco más complicado de lo que me gusta, pero me permite Filtrar mientras que la adición de ellos en Jetty. Esto permite anular las contraseñas y otros datos confidenciales utilizando las propiedades del sistema. Estamos utilizando Bamboo (supongo que Hudson es similar) y uno puede ajustar los planes por entorno. Los planes pueden estar sujetos a control de acceso. Esto nos permite tener un lugar para establecer todas las propiedades de implementación, por lo que no habrá más administradores hackeando en los cuadros de Unix.

+0

Esto es bueno, para reducir la complejidad, los estaba copiando directamente del otro módulo de proyecto con una ruta codificada. Prefiero tu enfoque porque el mío rompe la portabilidad de la construcción. ¡Creo que ahora hemos logrado la perfección en esto! – HDave

+0

FYI Me rendí en JNDI. En cambio, decidí usar propiedades. Estos se pueden cargar en Spring a través de CLASSPATH. El único truco es agregar esos archivos al directorio de recursos en JETTY, que resulta que está en CLASSPATH de forma predeterminada. También agregamos un directorio en el directorio de recursos y agregamos un context.xml con la opción extraClassPath para agregar eso para poder admitir varias aplicaciones en una instancia de Jetty. –

Cuestiones relacionadas