Frage

Ich versuche, eine ausführbare jar für ein kleines home-Projekt namens „logmanager“ mit Maven, wie dies zu generieren:

Wie kann ich eine ausführbare JAR mit Abhängigkeiten mit Maven?

Ich habe die Schnipsel in die pom.xml dort gezeigten und lief mvn assembly: Montage. Er erzeugt zwei JAR-Dateien in logmanager / target: logmanager-0.1.0.jar und logmanager-0.1.0-jar-with-dependencies.jar. Ich erhalte eine Fehlermeldung, wenn ich einen Doppelklick auf dem ersten Glas:

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

Eine etwas andere Fehler, wenn ich einen Doppelklick auf das jar-with-dependencies.jar:

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

ich kopiert und eingefügt den Pfad und den Klassennamen, und überprüft die Rechtschreibung in der POM. Meine Hauptklasse startet von einer Eklipse Startkonfiguration in Ordnung. Kann mir jemand helfen, herauszufinden, warum meine JAR-Datei nicht ausgeführt werden? Auch, warum gibt es zwei Gläser zu beginnen? Lassen Sie uns wissen, wenn Sie mehr Informationen benötigen.

Hier ist der vollständige pom.xml, als Referenz:

<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>
War es hilfreich?

Lösung

Eigentlich, denke ich, dass die Antwort in dem Frage erwähnt ist nur falsch ( UPDATE - 20.101.106: jemand es fest, diese Antwort bezieht sich auf die Version vor dem bearbeiten ) und dies erklärt, zumindest teilweise, warum man in Schwierigkeiten läuft.


  

Es erzeugt zwei JAR-Dateien in logmanager / Ziel:. Logmanager-0.1.0.jar und logmanager-0.1.0-jar-with-dependencies.jar

Die erste ist die JAR des LogManager Modul während der package Phase durch jar:jar erzeugt (weil das Modul eine Verpackung vom Typ jar hat). Die zweite ist die Montage von assembly:assembly erzeugt und sollte die Klassen aus dem aktuellen Modul und seine Abhängigkeiten enthalten (wenn Sie den Deskriptor jar-with-dependencies verwendet wird).

  

Ich erhalte eine Fehlermeldung, wenn ich einen Doppelklick auf dem ersten Glas:

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

Wenn Sie die vorgeschlagene Konfiguration des Link gepostet als Referenz angelegt, können Sie die jar-Plugin konfigurierten ein ausführbares Artefakt, um so etwas zu produzieren:

  <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>

So logmanager-0.1.0.jar tatsächlich ausführbar ist aber 1. ist dies nicht das, was Sie wollen (weil es nicht alle Abhängigkeiten hat) und 2. es enthält keine com.gorkwobble.logmanager.LogManager (das ist, was der Fehler sagt, überprüfen Sie den Inhalt der jar).

  

Eine etwas andere Fehler, wenn ich einen Doppelklick auf das jar-with-dependencies.jar:

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

Noch einmal, wenn Sie die Assembly-Plugin, wie vorgeschlagen konfiguriert, haben Sie so etwas wie folgt aus:

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

Mit diesem Setup logmanager-0.1.0-jar-with-dependencies.jar enthält die Klassen aus dem aktuellen Modul und seine Abhängigkeiten, aber nach dem Fehler, sein META-INF/MANIFEST.MF nicht enthält einen Main-Class Eintrag (sein wahrscheinlich nicht das gleiche MANIFEST.MF wie in logmanager-0.1.0.jar). Das Glas ist eigentlich nicht ausführbare Datei, die wiederum ist nicht das, was Sie wollen.


Also, wäre mein Vorschlag, das configuration Element aus der Maven-jar-Plugin zu entfernen und die Maven-Montage-Plugin wie folgt zu konfigurieren:

  <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>

Natürlich ersetzen org.sample.App mit der Klasse, die Sie ausgeführt haben möchten. Kleiner Bonus habe ich assembly:single an die package Phase gebunden, so dass Sie müssen mehr assembly:assembly nicht laufen. Führen Sie einfach mvn install und die Montage wird während der Standard-Build hergestellt werden.

So aktualisieren Sie bitte Ihre pom.xml mit der angegebenen Konfiguration, die oben und mvn clean install läuft. Dann CD in das Verzeichnis target und versuchen Sie es erneut:

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

Wenn Sie eine Fehlermeldung erhalten, aktualisieren Sie bitte Ihre Frage mit ihm und poste den Inhalt der META-INF/MANIFEST.MF Datei und dem betreffenden Teil Ihrer pom.xml (die Plugins Konfigurationsteile). Auch bitte poste das Ergebnis:

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

zeigen, es funktioniert gut auf der Kommandozeile (unabhängig davon, was Eclipse sagt).

EDIT: Für Java 6, benötigen Sie die Maven-Compiler-Plugin zu konfigurieren. Fügen Sie diese auf Ihre 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>

Andere Tipps

Die Antwort von Pascal Thivent hat mir geholfen, auch. Aber , wenn Sie Ihre Plugins im <pluginManagement>element verwalten, müssen Sie außerhalb des Plug-ins Management die Baugruppe wieder definieren, oder auch die Abhängigkeiten werden in dem Glas nicht gepackt, wenn Sie mvn install ausgeführt werden.

<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>

Wenn Sie nicht ausführen Montag Ziel auf Paket wollen, können Sie die nächsten Befehl:

mvn package assembly:single

Hier Paket ist Schlüsselwort.

Recht das Projekt klicken und Maven Build geben, Maven sauber, Maven erzeugen Ressource und Maven install.The JAR-Datei automatisch generieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top