Создание исполняемого банку с maven?

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

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

Я добавил фрагмент, показанный там в pom.xml, и выполнил сборку mvn: 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. Мой основной класс отлично запускается из конфигурации запуска eclipse. Может ли кто-нибудь помочь мне разобраться, почему мой файл 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>

Ответы

Ответ 1

На самом деле, я думаю, что ответ, указанный в question, который вы упомянули, просто неверно (UPDATE - 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 содержит классы из текущего модуля и его зависимостей, но, согласно ошибке, в < <2 → нет Main-Class (вероятно, это не тот же MANIFEST.MF, что и в logmanager-0.1.0.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 к фазе package, поэтому вам больше не нужно запускать assembly:assembly. Просто запустите mvn install, и сборка будет создана во время стандартной сборки.

Итак, обновите свой pom.xml с приведенной выше конфигурацией и запустите mvn clean install. Затем cd в каталог target и повторите попытку:

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

Если вы получили сообщение об ошибке, обновите свой вопрос и опубликуйте содержимое файла META-INF/MANIFEST.MF и соответствующую часть вашего pom.xml (части конфигурации плагинов). Также, пожалуйста, опубликуйте результат:

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

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

EDIT: для 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>

Ответ 2

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

Ответ 3

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

mvn package assembly:single

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

Ответ 4

Щелкните правой кнопкой мыши проект и дайте maven build, maven clean, maven generate resource и maven install.The файл jar будет автоматически генерироваться.