2009-06-18 13 views
8

A menudo encuentro distribuciones de aplicaciones o bibliotecas Java que usan Maven como su herramienta de compilación.Java: ¿cómo puedo construir distribuciones autónomas de proyectos basados ​​en Maven?

Algunos de ellos, por desgracia, no proporcionan frascos independientes (o redistribuibles).

¿Es posible construir aplicaciones basadas en Maven, de tal manera, que el resultado compilación contiene todas las dependencias y puede ser redistribuido a trabajar fuera de la caja?

Intenté construir el módulo OCM de Jackrabbit. Por algunas razones muy "inteligentes" no existe una versión independiente descargable .
Así que construí Jackrabbit con Maven (el paquete fuente de Jackrabbit incluye OCM), y obtuve el mismo jar como se encuentra en el apache repository. El jar no contiene contener las dependencias necesarias y es inútil para mí.

+0

Consulte mi respuesta para Maven Shade VS Assembly. Shade es el ganador claro. – opyate

+0

http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html#jar-with-dependencies –

Respuesta

0

Cambie el archivo pom.xml y utilice la directiva <Embed-Dependency>. Un ejemplo similar se puede encontrar en here para que pueda adaptarlo a su escenario.

<Embed-Dependency>*;scope=!test;inline=true</Embed-Dependency> 

Creo que esto debería hacer el truco.


Este es el ejemplo en la URL anterior que parece dar tiempo de espera.

<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>br.gov.lexml</groupId> 
    <artifactId>toolkit</artifactId> 
    <packaging>bundle</packaging> 
    <version>3.0</version> 
    <parent> 
     <artifactId>lexml</artifactId> 
     <groupId>br.gov.lexml</groupId> 
     <version>1.0</version> 
    </parent> 
    <build> 
     <finalName>Lexml_Toolkit-2.0</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.5</source> 
        <target>1.5</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <!--_include>src/toolkit/resources/META-INF/MANIFEST.MF</_include--> 

         <Export-Package>*;-split-package:=merge-last</Export-Package> 
         <Bundle-Activator>br.gov.lexml.borda.Toolkit</Bundle-Activator> 
         <Bundle-Name>Toolkit</Bundle-Name> 
         <Private-Package /> 
         <Embed-Dependency>*;scope=!test;inline=true</Embed-Dependency> 
         <Bundle-ClassPath>.,{maven-dependencies}</Bundle-ClassPath> 
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.xmlbeans</groupId> 
      <artifactId>xmlbeans</artifactId> 
      <version>2.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.xmlbeans</groupId> 
      <artifactId>xmlbeans-xmlpublic</artifactId> 
      <version>2.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.15</version> 
     </dependency> 
     <dependency> 
      <groupId>br.gov.lexmlbeans</groupId> 
      <artifactId>lexmlbeans</artifactId> 
      <version>3.0</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

Su enlace da como resultado el tiempo de espera. Por favor, dime dónde poner la directiva. No puedo encontrar instrucciones utilizables en la web. –

+0

Acaba de pegar los comentarios del documento en línea en la respuesta. Espero que ayude. –

+0

Lo siento, soy totalmente nuevo en maven, y, sinceramente, ni siquiera quiero profundizar en él. Entonces, no sé: 1) ¿Tengo que editar el pom.xml principal, o el módulo deseado (que quiero construir como un paquete de redist), 2) El Activador de paquetes parece ser algo relacionado con su proyecto, entonces ¿cómo lo alteraría para que funcione? El principal problema es que estoy haciendo todo de manera remota a través de SSH, por lo que mi flexibilidad para probar cosas es muy limitada. –

2

Puede tener un poco de suerte con el . En su defecto, eche un vistazo al assembly plugin. Eso es más flexible, pero de nivel inferior. Si está utilizando el complemento de ensamblaje, puede encontrar el capítulo sobre él en maven: the definitive guide para ser útil.

0

Creo que el Maven Shade Plugin satisfará sus necesidades. Lo uso cuando estoy construyendo herramientas de interfaz de línea de comando para crear un Uber JAR incluyendo mis clases y junto con las clases de todas mis dependencias.

Es muy fácil de usar y creo que example se explica por sí mismo.

2

Como dijo Dominic, usar el plugin de montaje hará el truco. Que se suele configurar dentro POM de su propio proyecto para recoger y empaquetar todas las dependencias necesarias:

... 
    <plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    </plugin> 
    ... 

jar-with-dependencies está predefinida por el plugin de montaje e incluirá todas las dependencias en el paquete final (véase la documentación here).

Si no desea utilizar Maven para su propio proyecto, deberá modificar los POM de las bibliotecas y volver a empaquetarlos usted mismo (descargue los orígenes, agregue el fragmento anterior a pom.xml y ejecute mvn package). Tenga cuidado con las dependencias transitivas duplicadas o incompatibles si usa múltiples bibliotecas. exclusions podría ayudar en ese caso (consulte la documentación here).

0

Como dicen algunos de los carteles, el plugin de ensamblaje es una buena forma de crear un archivo jar completo, con todas las dependencias del proyecto. Sin embargo, no es necesario modificar el archivo pom.xml. Simplemente ejecute:

mvn assembly:single -DdescriptorId=jar-with-dependencies 

... para crear un archivo jar. Si desea hacer algo más avanzado, probablemente debería modificar pom.xml y crear un descriptor de ensamblaje personalizado.

+0

'' 'assembly: single''' descomprimirá sus JAR de dependencia tal como están, y esto no podría ser lo que usted desea. P.ej. cosas como '' 'META-INF/spring.schemas''' serán anuladas con el último JAR de dependencia de primavera que se evalúa, y como tal no se encontrarán sus XSD (aparte de los del último JAR, por supuesto). Por eso sistemas como Alfresco crearon su plugin AMP, que agrupa las dependencias dentro de '' lib/'' 'dentro del AMP que está construyendo. Sin embargo, esto último plantea problemas de gestión de la dependencia. – opyate

3

Utilice el tono plugin de Maven

... pero tenga cuidado de las trampas (similar al que se describe más abajo en mi respuesta), que ha conseguido a workaround explained here.

Además, tenga mucho cuidado con la configuración del plugin Shade. Accidentalmente usé etiquetas dobles <configuration> una vez, y los transformadores no se aplicaron en absoluto, y el complemento también se tomó la libertad de no avisarme.

No utilice la Asamblea Maven plugin de

assembly:single va a desempaquetar sus tarros de dependencia tal y como son, y esto no podría ser lo que quieres. P.ej. cosas como META-INF/spring.schemas serán anuladas con el último JAR de dependencia de primavera que se evalúa, y como tal no se encontrarán sus XSD (aparte de los del último JAR, por supuesto). Es por eso que los sistemas como Alfresco hicieron su plugin de AMP que agrupa las dependencias dentro de lib/ dentro del AMP que está construyendo. Sin embargo, esto último plantea problemas de gestión de la dependencia.

Cuestiones relacionadas