Вопрос

Я пытаюсь сгенерировать исполняемый файл jar для небольшого домашнего проекта с именем " logmanager " используя maven, вот так:

Как создать исполняемый файл JAR с зависимостями, использующими Maven?

Я добавил показанный там фрагмент в pom.xml и запустил mvn assembly: assembly. Он генерирует два файла jar в logmanager / target: logmanager-0.1.0.jar и logmanager-0.1.0-jar-with-dependencies.jar. Я получаю сообщение об ошибке, когда дважды щелкаю первую банку:

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

Немного другая ошибка, когда я дважды щелкаю по jar-with-dependencies.jar:

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

Я скопировал и вставил путь и имя класса и проверил написание в POM. Мой основной класс запускается нормально из конфигурации запуска затмения. Может кто-нибудь помочь мне понять, почему мой файл jar не запускается? Кроме того, почему для начала есть две банки? Дайте мне знать, если вам нужна дополнительная информация.

Вот полный текст pom.xml для справки:

<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>
Это было полезно?

Решение

На самом деле я думаю, что ответ дан в вопрос , который вы упомянули, просто неверный ( ОБНОВЛЕНИЕ - 20101106: кто-то это исправил, этот ответ относится к версия, предшествующая изменению ), и это хотя бы частично объясняет, почему у вас возникают проблемы.

<Ч>
  

Он генерирует два файла jar в logmanager / target: logmanager-0.1.0.jar и logmanager-0.1.0-jar-with-dependencies.jar.

Первый - это JAR модуля logmanager, сгенерированного на этапе package jar:jar (поскольку модуль имеет упаковку типа jar). Второй - это сборка, сгенерированная assembly:assembly, которая должна содержать классы из текущего модуля и его зависимостей (если вы использовали дескриптор jar-with-dependencies).

  

Я получаю сообщение об ошибке, когда дважды щелкаю первую банку:

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

Если вы применили предложенную конфигурацию ссылки, опубликованной в качестве ссылки, вы настроили подключаемый модуль jar для создания исполняемого артефакта, что-то вроде этого:

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

Так что logmanager-0.1.0.jar действительно исполняемый файл, но 1. это не то, что вам нужно (потому что он не имеет всех зависимостей) и 2. он не содержит com.gorkwobble.logmanager.LogManager (это то, что говорит ошибка, проверьте содержимое банки).

  

Немного другая ошибка, когда я дважды щелкаю по jar-with-dependencies.jar:

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

Опять же, если вы настроили сборочный плагин, как предложено, у вас есть что-то вроде этого:

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

В этой настройке logmanager-0.1.0-jar-with-dependencies.jar содержит классы текущего модуля и его зависимости, но, согласно ошибке, его META-INF/MANIFEST.MF не содержит Main-Class запись (скорее всего, она не та же MANIFEST.MF, как в logmanager-0.1.0.jar). Jar на самом деле не исполняемый файл, что опять-таки не то, что вы хотите.

<Ч>

Итак, я предлагаю удалить элемент configuration из maven-jar-plugin и настроить maven-assembly-plugin следующим образом:

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

Конечно, замените org.sample.App классом, который вы хотите выполнить. Небольшой бонус, я привязал assembly:single к фазе mvn install, поэтому вам больше не нужно запускать mvn clean install. Просто запустите target, и сборка будет произведена во время стандартной сборки.

Итак, обновите ваш pom.xml конфигурацией, указанной выше, и запустите pom.xml. Затем перейдите в каталог <=> и повторите попытку:

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

Если вы получили сообщение об ошибке, обновите свой вопрос и опубликуйте содержимое файла <=> и соответствующую часть вашего <=> (части конфигурации плагинов). Также, пожалуйста, опубликуйте результат:

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

чтобы продемонстрировать, что он работает нормально в командной строке (независимо от того, что говорит eclipse).

РЕДАКТИРОВАТЬ: для Java 6 вам необходимо настроить плагин maven-compiler-plugin. Добавьте это в ваш 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>

Другие советы

Ответ Pascal Thivent тоже помог мне. Но , если вы управляете своими плагинами в элементе <pluginManagement>, вам нужно снова определить сборку вне управления плагинами, иначе зависимости не будут упакованы в jar, если вы запустите 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>

Если вы не хотите выполнять цель сборки для пакета, вы можете использовать следующую команду:

mvn package assembly:single

Здесь package - это ключевое слово.

Щелкните правой кнопкой мыши проект и выполните сборку maven, очистите maven, создайте ресурс maven и установите maven. Файл jar будет создан автоматически.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top