2012-04-19 26 views
9

Tengo una aplicación de escritorio de Java creada con Maven 2 (pero podría actualizar a Maven 3 si eso ayuda) con una cantidad de dependencias de código abierto. Ahora estoy tratando de empaquetarlo como un programa independiente para que esté disponible para los usuarios finales sin que necesiten instalar Maven o cualquier otra cosa.¿Cómo se crea una aplicación independiente con dependencias intactas usando Maven?

He utilizado con éxito maven-assembly-plugin para compilar un único contenedor que contenga todas las dependencias, pero esto no es realmente lo que quiero porque cuando se usan bibliotecas LGPL se supone que se deben redistribuir las bibliotecas que se utilizan como tarros separados.

Quiero que Maven cree un zip que contenga un frasco con mi código y un MANIFEST.MF que haga referencia a los otros frascos que necesito junto con los otros frascos. Esto parece una práctica estándar pero no puedo ver cómo hacerlo.

He aquí un extracto de mi pom

 <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <encoding>UTF-8</encoding> 
        <compilerVersion>1.6</compilerVersion> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <argLine>-Dfile.encoding=UTF-8</argLine> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>com.company.widget.Main</mainClass> 
          <packageName>com.company.widget</packageName> 
          <addClasspath>true</addClasspath> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <archive> 
         <manifest> 
          <mainClass>com.company.widget.Main</mainClass> 
          <packageName>com.company.widget</packageName> 
          <addClasspath>true</addClasspath> 
         </manifest> 
        </archive> 
       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

EDIT: Tomado en la idea de Kals

creado un archivo llamado descriptor.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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>distribution</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
      <scope>runtime</scope> 
      <outputDirectory>lib</outputDirectory> 
      <unpack>false</unpack> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

y pom contiene:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <descriptors> 
      <descriptor>assembly.xml</descriptor> 
     </descriptors> 
     <archive> 
      <manifest> 
       <mainClass>com.company.widget.cmdline.Main</mainClass> 
       <packageName>com.company.widget</packageName> 
       <addClasspath>true</addClasspath> 
      </manifest> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Ahora mantiene el archivo jar y los coloca todos en la carpeta lib, incluido mi propio código

+0

Puede distribuir su aplicación como _simple_ WebStart, para la que no necesita el servidor de la aplicación JEE, solo un JNLP. –

+0

khmarbasise interesante, creo que este es el escenario después, aunque –

Respuesta

2

Intente crear un descriptor de ensamblado personalizado y agregue un conjunto de dependencias y asegúrese de especificar, descomprimir como falso.

utilizar esto como descriptor de montaje,

<?xml version="1.0" encoding="UTF-8"?> 
<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>distribution</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
      <scope>runtime</scope> 
      <outputDirectory>lib</outputDirectory> 
         <useProjectArtifact>false</useProjectArtifact> 
      <unpack>false</unpack> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

tienda este archivo decir src/main/montaje/assembly.xml y actualizar la configuración del complemento de ensamblaje en pom.xml como este.

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.2.1</version> 
      <executions> 
       <execution> 
        <id>assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>attached</goal> 
        </goals> 
        <configuration> 
          <descriptor>${basedir}/src/main/assembly/assembly.xml</descriptor> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Aquí es el montaje de referencia del descriptor si necesitas algo más

http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

+0

Se ve bien, pero lo siento, ¿dónde va esto, es este archivo separado o entra en el pom y no guardo las cosas en mi pom que se muestra en la pregunta original –

+0

Se incluirá en un archivo separado como assembly.xml, que es el descriptor de ensamblado. Configure su plugin de ensamblaje para hacer referencia a él. –

+0

Hola, eso funciona esencialmente, excepto que también puse mi propio código en la lib, mientras que identifico solo los otros jar en la carpeta lib, cualquier idea que sería genial pero he marcado correctamente tu respuesta. –

1

Por lo que yo sé que es posible redistribuir también bibliotecas LGPL en sus propios paquetes, siempre y cuando no se tocan. El complemento maven assembly crea un jar que contiene los jar originales dentro de una carpeta lib del archivo. Hasta ahora estás cumpliendo con la LGPL.

Tal vez this question da más información sobre este tema.

(Negación: No soy un abogado, así que por favor cotejar esta información;))

+0

Gracias, estaba usando jar-with-dependencias que no hace esto, pero el assembly.xml suggsted hace esto –

5

Debe retirar la Maven Appassembler plugin. Puede obtener un paquete mucho más sólido utilizándolo que rodar su propio ensamblaje.

Genera guiones de inicio útiles para Unix y Windows que le permiten establecer opciones de VM JAVA predefinidas, parámetros de línea de comandos y classpath.

También tiene un concepto de directorio de configuración donde puede copiar configuraciones predeterminadas que el usuario puede cambiar posteriormente. También puede configurar el directorio de configuración para que esté disponible en classpath.

Las dependencias se pueden guardar en un "repo" de estilo Maven o puede usar un directorio "lib" de estilo plano.

Aún necesita el complemento de ensamblaje para crear un archivo zip o tar.

Aquí hay un ejemplo de configuración appassembler:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>appassembler-maven-plugin</artifactId> 
    <version>1.2.2</version> 
    <configuration> 
     <programs> 
      <program> 
       <mainClass>com.mytools.ReportTool</mainClass> 
       <name>ReportTool</name> 
      </program> 
     </programs> 
     <assembleDirectory>${project.build.directory}/ReportTool</assembleDirectory> 
     <repositoryName>lib</repositoryName> 
     <repositoryLayout>flat</repositoryLayout> 
    </configuration> 
    <executions> 
     <execution> 
      <id>assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>assemble</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Para obtener un archivo zip utilizo el este montaje:

<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> 
    </formats> 
    <fileSets> 
     <fileSet> 
      <directory>${project.build.directory}/ReportTool</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>/**</include> 
      </includes> 
     </fileSet> 
    </fileSets> 
</assembly> 
1

Añadir los siguientes plugins en pom.xml. Verifique el valor en las etiquetas mainClass, classpathPrefix, addClasspath.

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>org.apache.camel.spring.Main</mainClass> 
         <classpathPrefix>lib/</classpathPrefix> 
         <addClasspath>true</addClasspath> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <descriptors> 
        <descriptor>src/assembly/some-assembly.xml</descriptor> 
       </descriptors> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

Cree some-assembly.xml en src/assembly como a continuación.

<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>distribution</id> 
<formats> 
    <format>zip</format> 
</formats> 
<includeBaseDirectory>true</includeBaseDirectory> 
<fileSets> 
    <fileSet> 
     <directory>${project.build.directory}</directory> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
      <include>*.jar</include> 
     </includes> 
    </fileSet> 
</fileSets> 
<dependencySets> 
    <dependencySet> 
     <scope>runtime</scope> 
     <outputDirectory>/lib</outputDirectory> 
     <useProjectArtifact>false</useProjectArtifact> 
     <unpack>false</unpack> 
    </dependencySet> 
</dependencySets> 

Tenga en cuenta que la bandera useProjectArtifact de falsa bandera, de desempaquetado en false. Si no se requiere la carpeta raíz dentro del archivo zip, entonces se puede hacer que includeBaseDirectory sea falso.

Esto creará el archivo nombre-versión-distribución.zip. Dentro del archivo zip, habrá una carpeta nombre-versión. Dentro de esta carpeta, su jar ejecutable y la carpeta lib que contiene todos los jar de dependencia estarán presentes. Comprueba el archivo manifest.MF del archivo ejecutable jar. Contiene información de clase principal y classpath.

Cuestiones relacionadas