2011-04-19 16 views
13

Lamento sonar ignorante aquí, pero soy nuevo en Maven y me he estado golpeando la cabeza contra algo que estoy seguro es bastante simple.Problemas para comenzar con el complemento de ensamblaje de maven

El docs dicen:

[...] un proyecto podría producir un montaje de ZIP que contiene el artefacto JAR de un proyecto en el directorio raíz, las dependencias de tiempo de ejecución en un directorio lib /, y un script de shell para iniciar una aplicación independiente.

que es exactamente lo que quiero hacer! Pero no puedo hacer que suceda.

Mi POM es el siguiente:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.anearalone</groupId> 
    <artifactId>myapp</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    [...] 
    <build> 
     <finalName>myapp</finalName> 
     <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2.1</version> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
       <configuration> 
        <descriptors> 
        <descriptor>src/main/assemble/dist.xml</descriptor> 
        </descriptors> 
        <archive> 
        <manifest> 
         <mainClass>com.anearalone.myapp.CLI</mainClass> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
        </manifest> 
        </archive> 
       </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
</build> 
[...] 
</project> 

y la dist.xml referencia es el siguiente:

<assembly> 
    <id>dist</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <files> 
     <file> 
     <outputDirectory>/</outputDirectory> 
     <source>src/main/bin/arkify.sh</source> 
     <fileMode>755</fileMode> 
     </file> 
    </files> 
    <dependencySets> 
     <dependencySet> 
     <useProjectArtifact>false</useProjectArtifact> 
      <includes> 
      <include>*:jar</include> 
      </includes> 
      <outputDirectory>/lib</outputDirectory> 
     </dependencySet> 
     <dependencySet> 
     <useProjectArtifact>true</useProjectArtifact> 
     <includes> 
      <include>com.anearalone:myapp:jar:0.0.1-SNAPSHOT</include> 
     </includes> 
     <outputDirectory>/</outputDirectory> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

este modo se consigue la disposición que quiero en el archivo zip (aunque estoy bastante seguro que no estoy llegando de la manera correcta) pero obtengo dos jar en target/ (uno en el archivo zip, el otro en la raíz), y ninguno de ellos incluye mi entrada mainClass en el resultante MANIFEST.MF.

Si cambio la project.packaging a "pom", que pensé que podría ser correcto, por supuesto, el frasco extra (en la raíz de target/ se va, pero me da estas advertencias:

[WARNING] Cannot include project artifact: com.anearalone:myapp:pom:0.0.1-SNAPSHOT; it doesn't have an associated file or directory. 
[WARNING] The following patterns were never triggered in this artifact inclusion filter: 
o 'com.anearalone:myapp' 

.. . y de hecho mi artefacto no está en el archivo, y todavía no hay entradas agregadas a MANIFEST.MF.

Alguien tiene tiempo para ayudar a un principiante?

Respuesta

9

Si entiendo su problema correctamente, su postal es correcta creado, pero el my-app-0.0.1-SNAPSHOT contenido en él (así como el JAR directamente ubicado en el directorio target/) no incluye su clase principal en el archivo MANIFEST.MF?

De hecho, el complemento assembly no está dedicado a ejecutar tal tarea. Esta es la tarea del JAR plugin, que proporciona una forma de indicar, en el MANIFEST.MFthe main class of your project. Simplemente debe agrega esta configuración en el actual pom.xml:

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    ... 
    <configuration> 
     <archive> 
     <manifest> 
      <addClasspath>true</addClasspath> 
      <mainClass>my.app.MainClass</mainClass> 
     </manifest> 
     </archive> 
    </configuration> 
    </plugin> 
</plugins> 

En cuanto a su intento de cambiar el envase del proyecto para un embalaje pom: era una mala idea;) De hecho, el embalaje pom se usa para proyectos sin otros recursos que el pom.xml. Es realmente útil para pom.xml que se definen como the parent of others projects, o aggregate multiples modules.

+1

¡Ah, perfecto! Debería haber deducido esto de las primeras líneas en la [página de uso] (http://maven.apache.org/plugins/maven-assembly-plugin/usage.html). ¡Muchas gracias! – JStroop

Cuestiones relacionadas