wake-up-neo.com

Erstellen von ausführbaren Dosen mit Maven?

Ich versuche, ein ausführbares Glas für ein kleines Home-Projekt namens "Logmanager" mit Maven zu erstellen, genau wie folgt:

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

Ich habe das dort gezeigte Snippet der pom.xml hinzugefügt und mvn Assembly: Assembly ausgeführt. Es generiert zwei JAR-Dateien in logmanager/target: logmanager-0.1.0.jar und logmanager-0.1.0-jar-with-dependencies.jar. Ich bekomme eine Fehlermeldung, wenn ich auf das erste Glas doppelklicke:

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

Ein etwas anderer Fehler, wenn ich auf jar-with-dependencies.jar doppelklicke:

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

Ich habe den Pfad und den Klassennamen kopiert und eingefügt und die Rechtschreibung im POM überprüft. Meine Hauptklasse startet mit einer Eclipse-Startkonfiguration. Kann mir jemand helfen herauszufinden, warum meine Jar-Datei nicht läuft? Warum gibt es auch zwei Gläser, um damit anzufangen? Lassen Sie mich wissen, wenn Sie weitere 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>
117
RMorrisey

Eigentlich denke ich, dass die Antwort in der Frage die Sie erwähnt haben, nur falsch ist (UPDATE - 20101106: jemand hat sie behoben, diese Antwort bezieht sich auf die Version vor dem Editieren ) und dies erklärt zumindest teilweise, warum Sie in Schwierigkeiten geraten.


Es generiert zwei JAR-Dateien in logmanager/target: logmanager-0.1.0.jar und logmanager-0.1.0-jar-with-dependencies.jar.

Die erste ist die JAR-Datei des Logmanager-Moduls, die während der Phase package von jar:jar generiert wurde (da das Modul eine Verpackung des Typs jar hat). Die zweite ist die von Assembly:assembly erzeugte Assembly und sollte die Klassen des aktuellen Moduls und seine Abhängigkeiten enthalten (wenn Sie den Deskriptor jar-with-dependencies verwendet haben).

Ich bekomme eine Fehlermeldung, wenn ich auf das erste Glas doppelklicke:

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

Wenn Sie die vorgeschlagene Konfiguration des als Referenz veröffentlichten Links angewendet haben, haben Sie das Jar-Plugin so konfiguriert, dass ein ausführbares Artefakt erzeugt wird. 

  <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 ist logmanager-0.1.0.jar zwar ausführbar, aber 1. das ist nicht das, was Sie wollen (weil es nicht alle Abhängigkeiten hat) und 2. es enthält nicht com.gorkwobble.logmanager.LogManager (dies ist, was der Fehler sagt, überprüfen Sie den Inhalt des Jars).

Ein etwas anderer Fehler, wenn ich auf jar-with-dependencies.jar doppelklicke:

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

Wenn Sie das Assembly-Plugin wie vorgeschlagen konfiguriert haben, haben Sie Folgendes:

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

Bei diesem Setup enthält logmanager-0.1.0-jar-with-dependencies.jar die Klassen aus dem aktuellen Modul und und dessen Abhängigkeiten, aber entsprechend dem Fehler enthält META-INF/MANIFEST.MFnicht einen Main-Class-Eintrag (wahrscheinlich nicht das gleiche MANIFEST.MF wie in logmanager-0.1.0.jar). Das jar ist eigentlich not ausführbar, was wiederum nicht das ist, was Sie wollen.


Mein Vorschlag wäre also, das configuration -Element aus dem maven-jar-plugin zu entfernen und das maven-Assembly-plugin folgendermaßen 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>

Ersetzen Sie org.sample.App natürlich durch die Klasse, die Sie ausführen möchten. Kleiner Bonus, ich habe Assembly:single an die package-Phase gebunden, so dass Sie Assembly:assembly nicht mehr ausführen müssen. Führen Sie einfach mvn install aus und die Assembly wird während des Standard-Builds produziert.

Aktualisieren Sie daher Ihre pom.xml mit der oben angegebenen Konfiguration und führen Sie mvn clean install aus. Dann cd in das Verzeichnis target und noch einmal versuchen:

Java -jar logmanager-0.1.0-jar-with-dependencies.jar

Wenn Sie eine Fehlermeldung erhalten, aktualisieren Sie bitte Ihre Frage und veröffentlichen Sie den Inhalt der META-INF/MANIFEST.MF-Datei und den entsprechenden Teil Ihres pom.xml (die Plugins-Konfigurationsteile). Bitte posten Sie auch das Ergebnis von:

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

um zu zeigen, dass es in der Befehlszeile einwandfrei funktioniert (unabhängig davon, was Eclipse sagt).

BEARBEITEN: Für Java 6 müssen Sie das Maven-Compiler-Plugin konfigurieren. Fügen Sie dies zu Ihrer pom.xml hinzu:

  <plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>
238
Pascal Thivent

Die Antwort von Pascal Thivent hat mir auch geholfen. Aber Wenn Sie Ihre Plugins innerhalb des <pluginManagement>-Elements verwalten, müssen Sie die Assembly außerhalb der Plugin-Verwaltung erneut definieren. Andernfalls werden die Abhängigkeiten nicht in die jar gepackt, wenn Sie mvn install ausführen.

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

Wenn Sie Assembly-Ziel nicht für Paket ausführen möchten, können Sie den nächsten Befehl verwenden:

mvn package Assembly:single

Hier Paket ist Schlüsselwort.

5
leonidv

Klicken Sie mit der rechten Maustaste auf das Projekt, und geben Sie Maven Build, Maven Clean, Maven Ressource und Maven Install. Die JAR-Datei wird automatisch generiert.

0
dolly doll