2010-01-26 22 views
5

básicamente lo que tengo es un servidor de aplicaciones que ejecuta el portal de Liferay. y también tenemos portlets personalizados que tienen bibliotecas personalizadas compartidas y otras de terceros. por ejemplo dwr-3.0, varios archivos jar de drools, spring-webmvc, spring, etc.Agrupar diferentes clases de Java en un solo archivo jar en un solo contenedor

el problema es que es una pesadilla para la administración del servidor, porque cuando hay una implementación alguien siempre olvida qué versión estaba en el servidor etc.

Usamos maven 2, y lo que estaba pensando es hacer algo así como un proyecto maven que extrae las dependencias (usando dependencyManagement) del pom padre y el objetivo predeterminado es algo así como "deshacer todas las dependencias y jar ellos en un frasco único ". de esa manera tendríamos un jar único con una versión estándar que se implementa junto con el resto de los archivos en lugar de tener que implementar.

¿Ustedes saben cómo puedo hacer eso si es posible? He estado jugando con maven-assembly-plugin sin mucho éxito. Si ensamblar es el camino a seguir, ¿tiene un ejemplo para darme un kickstart?

Gracias de antemano

+0

I' Estoy teniendo problemas para entender exactamente lo que está tratando de hacer, pero parece algo para OSGI - http://www.osgi.org/Main/HomePage. Pensaría que si tuviera dependencias explícitas para cada artículo en su pom, siempre obtendría esa versión (suponiendo que esté indicando SNAPSHOTs). Pero si intenta evitar que cada portlet funcione con su propio conjunto de bibliotecas y evite las interacciones, OSGI puede hacer esto por usted. – Tim

+0

Tim, definitivamente creo que osgi es el camino a seguir, pero haría que todo el equipo cambie la forma en que se hacen las cosas, y la gerencia probablemente se negaría a aprobar ir en esa dirección. Además, no sé qué tan bien cabría el modelo de osgi en jboss eap 4.3.0, probablemente más problemas y pruebas de lo que vale. – feniix

Respuesta

0

Y, finalmente, la mejor solución estaba usando Maven-sombra-plugin:

(snip) 
    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <finalName>${artifactId}-${version}-tmp</finalName> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>1.3.1</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <shadedArtifactAttached>true</shadedArtifactAttached> 
         <shadedClassifierName>full</shadedClassifierName> 
         <artifactSet> 
          <excludes> 
           <exclude>classworlds:classworlds</exclude> 
           <exclude>junit:junit</exclude> 
           <exclude>jmock:*</exclude> 
           <exclude>org.apache.maven:lib:tests</exclude> 
           <exclude>log4j:log4j:jar:</exclude> 
          </excludes> 
         </artifactSet> 
         <filters> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>META-INF/*.SF</exclude> 
            <exclude>META-INF/*.DSA</exclude> 
            <exclude>META-INF/*.RSA</exclude> 
           </excludes> 
          </filter> 
         </filters> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

(SNIP)

Lo que es impresionante sobre el plugin de sombra es que le avisa cuando se está incluyendo clases que se superponen (un ejemplo es el frasco de la primavera (el lleno) con las clases aopalliance)

1

Suena como tal vez el Dependency Plugin es lo que necesita.

Estoy pensando que puede descomprimir todos los contenedores de dependencia en una ubicación específica, y luego volver a embalarlos en su nuevo contenedor.

Espero que funcione para usted.

1

Creo que lo que describes es posible. En primer lugar, crear un POM padres, donde se declara dependencias en el elemento <dependencyManagement>:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>groupIdA<groupId> 
    <artifactId>parent</artifactId> 
    <packaging>pom<packaging> 
    <version>1-SNAPSHOT</version> 
    ... 
    <dependencyManagement> 
    <!-- Standard dependencies used in several build modules. Ensures all modules 
     use the same version for these dependencies --> 
    <dependencies> 
     <dependency> 
     <groupId>org.directwebremoting</groupId> 
     <artifactId>dwr</artifactId> 
     <version>3.0.M1</version> 
     </dependency> 
     <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>3.0.0.RELEASE</version> 
     </dependency> 
     ... 
    </dependencies> 
    <dependencyManagement> 
    ... 
</project> 

Luego, en un proyecto secundario, declarar las dependencias que necesita sin declarar su versión:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <artifactId>parent</artifactId> 
    <groupId>groupIdA</groupId> 
    <version>1-SNAPSHOT</version> 
    </parent> 
    <artifactId>childB</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <dependencies> 
    <dependency> 
     <groupId>org.directwebremoting</groupId> 
     <artifactId>dwr</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
    </dependency> 
     ... 
    </dependencies> 
    ... 
</project> 

Por último, utilice el predeterminado jar-with-dependencies descriptor de ensamblaje predefinido para crear un ensamblado general de un paquete binario con todas las bibliotecas de dependencias incluidas desempaquetadas dentro del archivo.

<project> 
    [...] 
    <build> 
    [...] 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-assembly</id> <!-- this is used for inheritance merges --> 
      <phase>package</phase> <!-- append to the packaging phase. --> 
      <goals> 
       <goal>single</goal> <!-- goals == mojos --> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
     [...] 
    </plugins> 
    </build> 
</project> 

para crear el ensamblado de proyectos, activar el paquete de fase:

mvn package 

Y esto producirá el siguiente montaje en el directorio de destino:

target/child-1.0-SNAPSHOT-jar-with-dependencies.jar 

Estoy no estoy seguro de lo que quiere hacer con este ensamblado (utilícelo como dependencia en proyectos de portlet frente a las dependencias de extracción desde el POM principal). Facilite el despliegue de Liferay. solo por año?). Todas las opciones son posibles sin embargo. Para obtener más información, consulte la documentación Maven Assembly plugin.

+0

Hola Pascal, probé varias configuraciones diferentes del complemento de ensamblaje sin mucho éxito, lo que significa que no pude hacer que hiciera lo que quería. Lo que quiero hacer con el archivo jar generado es tener un archivo jar único que se carga en el directorio lib compartido de jboss para que todos los portlets diferentes compartan las clases. Actualmente, tenemos todos los archivos jar en server/servername/lib/ext pero es dolorosamente molesto cuando hay un cambio en las bibliotecas, realmente propenso a errores, de esta manera tenemos un archivo jar único, que tiene solo las bibliotecas requeridas , suelta un archivo y listo. – feniix

+0

@feniix Lo que estoy sugiriendo le permite hacer eso (he usado este descriptor en numerosas ocasiones) y es la manera más directa (especialmente porque solo tiene que copiar y pegar la configuración). –

+0

No digo que no funcione :) En mi caso, con la lista de bibliotecas que quería, el método de ensamblaje está dejando algunas bibliotecas, creo que es un error, pero el método de dependencia tiene exactamente TODAS las clases del las dependencias y el método de ensamblaje le falta algo. Aunque es extraño, veré si intento informar un error a apache fsf – feniix

2

Otra alternativa es maven-shade-plugin o incluso jarjar. He usado ambos, junto con el cambio de nombre del paquete sin ningún problema.

+0

Voy a echar un vistazo a ese complemento, parece que es más sencillo hacer lo que quiero. – feniix

1

Finalmente pude resolverlo de la siguiente manera, no lo he probado en el servidor de aplicaciones, pero el archivo resultante es un archivo jar con el contenido de todas las dependencias deseadas. Thanks Vincent for the tip :)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.test.jarbundle</groupId> 
<artifactId>bundle</artifactId> 
<version>1.0</version> 
<name>bundle</name> 
<packaging>jar</packaging> 
<url>http://maven.apache.org</url> 
<dependencies> 
    <dependency> 
     <groupId>org.directwebremoting</groupId> 
     <artifactId>dwr</artifactId> 
     <version>3.0.M1</version> 
     <scope>runtime</scope> 
     <exclusions> 
     <exclusion> 
      <artifactId>cometd</artifactId> 
      <groupId>org.mortbay.jetty</groupId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring</artifactId> 
     <version>2.5</version> 
     <scope>runtime</scope> 
     <exclusions> 
     <exclusion> 
      <artifactId>commons-logging</artifactId> 
      <groupId>commons-logging</groupId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>2.5</version> 
     <scope>runtime</scope> 
     <exclusions> 
     <exclusion> 
      <artifactId>commons-logging</artifactId> 
      <groupId>commons-logging</groupId> 
     </exclusion> 
     <exclusion> 
      <artifactId>aopalliance</artifactId> 
      <groupId>aopalliance</groupId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc-portlet</artifactId> 
     <version>2.5</version> 
     <scope>runtime</scope> 
     <exclusions> 
     <exclusion> 
      <artifactId>commons-logging</artifactId> 
      <groupId>commons-logging</groupId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.drools</groupId> 
     <artifactId>drools-core</artifactId> 
     <version>4.0.3</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.drools</groupId> 
     <artifactId>drools-compiler</artifactId> 
     <version>4.0.3</version> 
     <scope>runtime</scope> 
     <exclusions> 
     <exclusion> 
      <artifactId>antlr-runtime</artifactId> 
      <groupId>org.antlr</groupId> 
     </exclusion> 
     <exclusion> 
      <artifactId>core</artifactId> 
      <groupId>org.eclipse.jdt</groupId> 
     </exclusion> 
     <exclusion> 
      <artifactId>janino</artifactId> 
      <groupId>janino</groupId> 
     </exclusion> 
     <exclusion> 
      <artifactId>xercesImpl</artifactId> 
      <groupId>xerces</groupId> 
     </exclusion> 
     <exclusion> 
      <artifactId>xml-apis</artifactId> 
      <groupId>xml-apis</groupId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.drools</groupId> 
     <artifactId>drools-jsr94</artifactId> 
     <version>4.0.3</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.drools</groupId> 
     <artifactId>drools-decisiontables</artifactId> 
     <version>4.0.3</version> 
     <scope>runtime</scope> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>jar.App</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>unpack-dependencies</id> 
        <phase>validate</phase> 
        <goals> 
         <goal>unpack-dependencies</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    <resources> 
     <resource> 
      <directory>${basedir}/target/dependency</directory> 
     </resource> 
    </resources> 
</build> 

Y entonces se corre

mvn package 

link text

+0

¡Bien! Encantado de ayudar. – Vinnie

Cuestiones relacionadas