Incluyendo dependencias en un frasco con Maven

Resuelto racer asked hace 14 años • 16 respuestas

¿Hay alguna manera de forzar a Maven (2.0.9) a incluir todas las dependencias en un solo archivo jar?

Tengo un proyecto que se construye en un solo archivo jar. Quiero que las clases de las dependencias también se copien en el jar.

Actualización: sé que no puedo simplemente incluir un archivo jar en un archivo jar. Estoy buscando una manera de descomprimir los archivos jar especificados como dependencias y empaquetar los archivos de clase en mi archivo jar.

racer avatar Nov 13 '09 19:11 racer
Aceptado

Puede hacer esto usando el complemento maven-assembly con el descriptor "jar-with-dependencies". Aquí está el fragmento relevante de uno de nuestros pom.xml que hace esto:

  <build>
    <plugins>
      <!-- any other plugins -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>
John Stauffer avatar Nov 13 '2009 13:11 John Stauffer

Con Maven 2, la forma correcta de hacer esto es usar el complemento de ensamblaje Maven2 , que tiene un archivo descriptor predefinido para este propósito y que puede usar en la línea de comando:

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

Si desea que este jar sea ejecutable, simplemente agregue la clase principal que se ejecutará a la configuración del complemento:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>my.package.to.my.MainClass</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

Si desea crear ese ensamblado como parte del proceso de compilación normal, debe vincular el objetivo único o de directorio únicoassembly (el objetivo SOLO debe ejecutarse desde la línea de comando) a una fase del ciclo de vida ( packagetiene sentido), algo como esto:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <executions>
    <execution>
      <id>create-my-bundle</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        ...
      </configuration>
    </execution>
  </executions>
</plugin>

Adapte el configurationelemento a sus necesidades (por ejemplo, con el contenido del manifiesto tal como se habla).

Pascal Thivent avatar Nov 13 '2009 13:11 Pascal Thivent

Si desea crear un archivo jar ejecutable, también debe configurar la clase principal. Así debería ser la configuración completa.

    <plugins>
            <plugin>
                 <artifactId>maven-assembly-plugin</artifactId>
                 <executions>
                     <execution>
                          <phase>package</phase>
                          <goals>
                              <goal>single</goal>
                          </goals>
                      </execution>
                  </executions>
                  <configuration>
                       <!-- ... -->
                       <archive>
                           <manifest>
                                 <mainClass>fully.qualified.MainClass</mainClass>
                           </manifest>
                       </archive>
                       <descriptorRefs>
                           <descriptorRef>jar-with-dependencies</descriptorRef>
                      </descriptorRefs>
                 </configuration>
         </plugin>
   </plugins>
abdiel avatar Dec 29 '2016 16:12 abdiel