2009-11-24 5 views
24

Tengo un proyecto (de tipo 'jar') que (obviamente) construye un jar. Pero ese proyecto tiene muchas dependencias. Me gustaría que Maven construya un "paquete" o "ensamblaje" que contenga mi jar, todos los jars dependientes y algunos scripts (para iniciar la aplicación, etc.)Con Maven, ¿cómo puedo construir un distributable que tenga el jar de mi proyecto y todos los jars dependientes?

¿Cuál es la mejor manera de hacerlo? Específicamente, ¿cuál es la mejor manera de obtener los dependientes en el ensamblado?

Respuesta

25

Para un solo módulo, que haría uso de un montaje mirando como la siguiente (src/assembly/bin.xml):

<assembly> 
    <id>bin</id> 
    <formats> 
    <format>tar.gz</format> 
    <format>tar.bz2</format> 
    <format>zip</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <unpack>false</unpack> 
     <scope>runtime</scope> 
     <outputDirectory>lib</outputDirectory> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>src/main/command</directory> 
     <outputDirectory>bin</outputDirectory> 
     <includes> 
     <include>*.sh</include> 
     <include>*.bat</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 

Para utilizar este montaje, agregue la siguiente configuración a su pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <descriptors> 
     <descriptor>src/assembly/bin.xml</descriptor> 
     </descriptors> 
    </configuration> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

En este ejemplo, las secuencias de comandos iniciar/detener ubicadas en src/main/command y se agrupan en bin, las dependencias se agrupan en lib. Personalícelo para satisfacer sus necesidades.

+0

Pensé que esto era lo suficientemente común como para justificar un ensamblaje incorporado ... pero aparentemente no. Gracias como siempre. – Jared

+0

Realmente estoy de acuerdo, tendría sentido tener un descriptor predefinido para algo como esto (basado en algunas convenciones, por ejemplo, ubicación de scripts). –

5

Aquí está mi solución para crear un distribuible .zip (o .tar.gz/.tar.bz2) incluyendo todas las dependencias en una carpeta lib. Será:

  1. Crear un jar con un Manifiesto incluyendo las dependencias del directorio lib como la ruta de clase y la clase principal para ejecutar cuando se ejecuta el jar.
  2. Copie todos los archivos dependientes al directorio target/lib.
  3. Crea el `zip distribuible con el jar principal y todos los jar dependientes del directorio lib.

Extracto de pom.xml:

<!-- create distributable --> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <configuration> 
     <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <classpathPrefix>lib/</classpathPrefix> 
       <mainClass>full.path.to.MainClass</mainClass> 
      </manifest> 
     </archive> 
    </configuration> 
</plugin> 
<plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>attached</goal> 
      </goals> 
      <configuration> 
       <descriptors> 
        <descriptor>src/main/resources/dist.xml</descriptor> 
       </descriptors> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

dist.xml:

<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>bin</id> 
    <formats> 
     <format>zip</format> 
     <format>tar.gz</format> 
    </formats> 
    <fileSets> 
     <fileSet> 
      <directory>${project.basedir}</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>README*</include> 
       <include>LICENSE*</include> 
       <include>NOTICE*</include> 
      </includes> 
     </fileSet> 
     <fileSet> 
      <directory>${project.build.directory}</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>*.jar</include> 
      </includes> 
     </fileSet> 
     <fileSet> 
      <directory>${project.build.directory}/lib</directory> 
      <outputDirectory>lib</outputDirectory> 
      <includes> 
       <include>*.jar</include> 
      </includes> 
     </fileSet> 
     <fileSet> 
      <directory>${project.build.directory}/site</directory> 
      <outputDirectory>docs</outputDirectory> 
     </fileSet> 
    </fileSets> 
</assembly> 

El dist.xml se derivó del formato bin descriptor aquí: http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html#bin

+0

Alternativamente, podría agregar la configuración 'dependencySet' al' dist.xml' propuesto por Pascal Thivent y deshacerse del 'maven-dependency-plugin' en' pom.xml'. –

Cuestiones relacionadas