2010-11-17 6 views
15

Aquí es lo que estoy tratando de lograr - un directorio dist (o un archivo zip) que tiene este aspecto:Embalaje un frasco en un directorio dist con recursos y dependencias externas separadas

dist/ 
|-- application-1.0.jar 
|-- conf/ 
    |-- application.properties 
    |-- log4j.properties 
|-- lib/ 
    |-- *.jar 

Básicamente:

  • Un tarro ejecutable se produce (con ruta de clase apropiado en el manifiesto)
  • quiero excluir src/main/resources de ser empaquetado de forma automática con el frasco, de modo que application.properties puede b e modificado
  • Quiero tener dependencias externas en el directorio lib/

me ocurrió una solución utilizando un perfil con plugins unidos a la fase de paquete, pero sería usando el plugin ensamblaje ser una mejor solución?

Respuesta

4

Es necesario utilizar dos plugins para lograr esto: experto-jar-plugin y experta en montaje-plugin.

útiles pom.xml muestras:

(te recomendaría que para separar las propiedades editables por el usuario los archivos en el directorio separado, pero es una cuestión de gusto.)

configuración de montaje de la muestra, para empezar:

<assembly> 
    <id>dist</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <includeBaseDirectory>true</includeBaseDirectory> 
    <baseDirectory>dist</baseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <outputDirectory>lib</outputDirectory> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>src/conf</directory> 
     <outputDirectory>conf</outputDirectory> 
    </fileSet> 
    <fileSet> 
     <directory>src/run</directory> 
     <outputDirectory></outputDirectory> 
     <excludes> 
     <exclude>*.sh</exclude> 
     </excludes> 
    </fileSet> 
    </fileSets> 
    <files> 
    <file> 
     <source>src/run/run.sh</source> 
     <outputDirectory></outputDirectory> 
     <fileMode>0755</fileMode> 
    </file> 
    </files> 
</assembly> 
+0

Genial, pero también necesita hacer que el jar sea ejecutable, establecer el classpath del manifiesto y excluir el archivo de propiedades del jar ... – brasskazoo

+0

que ya es una cuestión de configurar su plugin JAR, nada que ver con el plugin de ensamblaje. Supongo que ya estás haciendo eso, ¿no? Y ayudaría si agrega secciones relevantes de su pom.xml a su pregunta. –

+0

hacer que JAR sea ejecutable y establecer el classpath de manifiesto: http://maven.apache.org/shared/maven-archiver/examples/classpath.html, excluir propiedades: http://maven.apache.org/plugins/maven-jar- plugin/usage.html –

6

la solución usando el plugin conjunto tiene unas pocas partes:

  • El pom incluye configurar el plugin tarro (maven-jar-plugin), y configurar el plugin conjunto (maven-assembly-plugin).
  • Durante la fase de empaque de maven, se llama al plugin jar para construir el jar de aplicación.
  • A continuación, se ejecuta el complemento de ensamblaje y combina el contenedor, los recursos y las dependencias construidos en un archivo zip tal como se define en el archivo de ensamblaje (distribution-zip.xml).

En el pom, configurar los plugins:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <archive> 
        <!-- Make an executable jar, adjust classpath entries--> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>./lib/</classpathPrefix> 
         <mainClass>com.acme.KillerApp</mainClass> 
        </manifest> 
        <!--Resources will be placed under conf/--> 
        <manifestEntries> 
         <Class-Path>./conf/</Class-Path> 
        </manifestEntries> 
       </archive> 
       <!--exclude the properties file from the archive--> 
       <excludes> 
        <exclude>*.properties</exclude> 
       </excludes> 
      </configuration> 
     </plugin> 

     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.2-beta-5</version> 
      <configuration> 
       <descriptors> 
        <descriptor>${basedir}/assembly/distribution-zip.xml</descriptor> 
       </descriptors> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
... 

El contenido del archivo de ensamblaje distribution-zip.xml (con gracias a Neeme Praks) combina la jarra, recursos y dependencias creadas:

<assembly> 
    <id>dist</id> 
    <formats> 
     <format>zip</format> 
    </formats> 

    <includeBaseDirectory>true</includeBaseDirectory> 

    <dependencySets> 
     <dependencySet> 
      <!--Include runtime dependencies--> 
      <outputDirectory>lib</outputDirectory> 
      <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 

    <fileSets> 
     <fileSet> 
      <!--Get the generated application jar--> 
      <directory>${project.build.directory}</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>*.jar</include> 
      </includes> 
     </fileSet> 
     <fileSet> 
      <!--Get application resources--> 
      <directory>src/main/resources</directory> 
      <outputDirectory>conf</outputDirectory> 
     </fileSet> 
     <fileSet> 
      <!--Get misc user files--> 
      <directory>${project.basedir}</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>README*</include> 
       <include>LICENSE*</include> 
       <include>NOTICE*</include> 
      </includes> 
     </fileSet>  
    </fileSets> 
</assembly> 

¡El archivo zip distribuible resultante se crea como target/killer-app-1.0-dist.zip!

Cuestiones relacionadas