Pregunta

Estoy tratando de generar un jar ejecutable para un hogar pequeño proyecto llamado "logmanager" el uso de maven, tal como esto:

¿Cómo puedo crear un JAR ejecutable con las dependencias de uso de Maven?

He añadido el fragmento que se muestra allí a la pom.xml y corrió mvn de la asamblea:la asamblea.Genera dos archivos jar en logmanager/destino:logmanager-0.1.0.jar y logmanager-0.1.0-jar-with-dependencies.jar.Me sale un error cuando hago doble click en el primer tarro:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

Un poco diferente de error cuando hago doble clic en el jar-with-dependencies.jar:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

He copiado y pegado la ruta de acceso y el nombre de la clase, y se comprueba la ortografía en el POM.Mi clase principal de la lanza multa de un eclipse de configuración de inicio.Alguien me puede ayudar a averiguar por qué mi archivo jar no se ejecutan?También, ¿por qué hay dos frascos para empezar?Déjeme saber si usted necesita más información.

Aquí es el completo pom.xml, para que sirva de referencia:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gorkwobble</groupId>
  <artifactId>logmanager</artifactId>
  <name>LogManager</name>
  <version>0.1.0</version>
  <description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.2</version>
            <!-- nothing here -->
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-4</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
                </manifest>
              </archive>
            </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- commons-lang -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.4</version>
    </dependency> 

    <!-- Quartz scheduler -->
    <dependency>
        <groupId>opensymphony</groupId>
        <artifactId>quartz</artifactId>
        <version>1.6.3</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons collections -->
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.1</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons logging -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
    </dependency>
    <!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
      <version>1.1</version>
      <scope>runtime</scope>
    </dependency>

    <!-- junitx test assertions -->
    <dependency>
        <groupId>junit-addons</groupId>
        <artifactId>junit-addons</artifactId>
        <version>1.4</version>
        <scope>test</scope>
    </dependency>

    <!-- junit dependency; FIXME: make this a separate POM -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.1</version>
    </dependency>

  </dependencies>
  <dependencyManagement>
  </dependencyManagement>
</project>
¿Fue útil?

Solución

En realidad, creo que la respuesta dada en el pregunta usted ha mencionado es sólo mal (ACTUALIZACIÓN - 20101106: alguien se fija, este la respuesta se refiere a la la versión anterior a la edición) y esto explica, al menos parcialmente, por qué estás en problemas.


Genera dos archivos jar en logmanager/destino:logmanager-0.1.0.jar y logmanager-0.1.0-jar-with-dependencies.jar.

El primero es el TARRO de la logmanager módulo generados durante el package fase de jar:jar (debido a que el módulo tiene un envase de tipo jar).La segunda es la asamblea generado por assembly:assembly y debe contener las clases del módulo actual y sus dependencias (si utiliza el descriptor de jar-with-dependencies).

Me sale un error cuando hago doble click en el primer tarro:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

Si se aplica la propuesta de configuración del enlace publicado como referencia, configura el frasco plugin para producir un ejecutable artefacto, algo como esto:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

Así logmanager-0.1.0.jar es, de hecho, ejecutable, sino 1.esto no es lo que usted quiere (porque no tiene todas las dependencias) y 2.no contiene com.gorkwobble.logmanager.LogManager (esto es lo que el error es decir, comprobar el contenido de la jarra).

Un poco diferente de error cuando hago doble clic en el jar-with-dependencies.jar:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

De nuevo, si se ha configurado la asamblea plugin como se ha sugerido, tienes algo como esto:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>

Con esta configuración, logmanager-0.1.0-jar-with-dependencies.jar contiene las clases del módulo actual y sus dependencias, pero, según el error, su META-INF/MANIFEST.MF no contienen un Main-Class entrada (su probabilidad no es el mismo MANIFIESTO.MF como en logmanager-0.1.0.jar).El frasco es en realidad no ejecutable, que de nuevo no es lo que usted desea.


Por lo tanto, mi sugerencia sería la de eliminar la configuration elemento de la maven-jar-plugin y configurar maven-asamblea-plugin como este:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Por supuesto, sustituir org.sample.App con la clase que usted quiere que se han ejecutado.Bono poco, he enlazado assembly:single a la package fase, así que usted no tiene que correr assembly:assembly ya.Sólo tiene que ejecutar mvn install y la asamblea producidos durante la construcción estándar.

Así que, por favor, actualice su pom.xml con la configuración dada anteriormente y ejecutar mvn clean install.Entonces, el cd en la target directorio y vuelve a intentarlo:

java -jar logmanager-0.1.0-jar-with-dependencies.jar

Si recibe un error, por favor, actualice su cuestión y publicar el contenido de la META-INF/MANIFEST.MF archivo y la parte pertinente de su pom.xml (los plugins de configuración de partes).También por favor publicar el resultado de:

java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager

para demostrar que está funcionando bien en la línea de comandos (independientemente de lo que eclipse está diciendo).

EDITAR:Para Java 6, usted necesita para configurar maven-compilador-plugin.Agregue esto a su pom.xml:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>

Otros consejos

La respuesta de Pascal Thivent también me ayudó. Pero si administra sus complementos dentro del elemento <pluginManagement>, debe definir el ensamblaje nuevamente fuera de la administración de complementos, de lo contrario, las dependencias no se empaquetarán en el jar si ejecuta mvn install.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <build>
        <pluginManagement>
            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>main.App</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

            </plugins>

        </pluginManagement>

        <plugins> <!-- did NOT work without this  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
            </plugin>
        </plugins>

    </build>


    <dependencies>
       <!--  dependencies commented out to shorten example -->
    </dependencies>

</project>

Si no desea ejecutar el objetivo de ensamblaje en el paquete, puede usar el siguiente comando:

mvn package assembly:single

Aquí paquete es palabra clave.

Haz clic derecho en el proyecto y da a maven build, maven clean, maven generate resource e maven install. El archivo jar se generará automáticamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top