Maven сборка без основного атрибута манифеста - PullRequest
0 голосов
/ 01 июня 2019

Я создаю небольшое приложение с Maven, которое имеет зависимости и представляет собой исполняемый файл JAR.

Вот мой pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.company</groupId>
    <artifactId>site-downloader</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>com.company.siteripper</groupId>
            <artifactId>common-interfaces</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>
                                        com.company.Main
                                    </mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Сборка завершается без проблем, но при выполнении jar пишет:

нет основного атрибута манифеста, в локальное репозиторий Maven / my jar .

Я обратился за помощью в документы и Baeldung тоже безрезультатно.

Я обращаюсь за помощью, чтобы включить в jar свои зависимости и одновременно выполнять.

Edit:

Я обновил свой pom, чтобы использовать вместо сборки плагины jar и зависимостей. Вот обновленный пом:

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.company</groupId>
    <artifactId>site-downloader</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>com.company.siteripper</groupId>
            <artifactId>common-interfaces</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>
                                com.company.Main
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>
                                ${project.build.directory}/libs
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Но я получаю NoClassDefFoundError при запуске:

C: \ Users \ myusername \ Documents \ Commands> call java -jar D: .m2 \ репозиторий \ ком \ компания \ сайт-загрузчик \ 1.0.0 \ сайт-загрузчик-1.0.0.jar -9gag https://9gag.com/gag/arGEvRX?ref C: \ Users \ myusername \ Documents \ sites \ data \ android Ошибка: ошибка JNI произошло, пожалуйста, проверьте вашу установку и попробуйте еще раз Исключение в теме "основной" java.lang.NoClassDefFoundError: орг / OpenQA / селен / WebDriver в java.lang.Class.getDeclaredMethods0 (собственный метод) at java.lang.Class.privateGetDeclaredMethods (неизвестный источник) в java.lang.Class.privateGetMethodRecursive (Неизвестный источник) at java.lang.Class.getMethod0 (неизвестный источник) at java.lang.Class.getMethod (неизвестный источник) at sun.launcher.LauncherHelper.validateMainClass (неизвестный источник) at sun.launcher.LauncherHelper.checkAndLoadMain (Неизвестный источник) Причина: java.lang.ClassNotFoundException: org.openqa.selenium.WebDriver на java.net.URLClassLoader.findClass (неизвестный источник) в java.lang.ClassLoader.loadClass (Неизвестный источник) at sun.misc.Launcher $ AppClassLoader.loadClass (неизвестный источник) в java.lang.ClassLoader.loadClass (Неизвестный источник) ... еще 7

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Вот как я решил вашу проблему:
Пожалуйста, игнорируйте бизнес-логику, так как я использую MongoDB, добавил драйвер MongoDB в качестве зависимости и могу работать с командой java -jar.
Конечная цель такая же, как
Я использую плагин Maven-Shade.

Оформление проекта из Исходный код Github:
распаковка, сборка, тестирование
ИЛИ
1. Создан проект maven
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

Обновите pom.xml следующим образом, добавьте код клиента mongo из OP и напечатайте имена коллекций Выполните mvn clean package Выполните java -jar test.jar Вывод, который я получил:
INFO: Opened connection [connectionId{localValue:1, serverValue:9}] to localhost:27017
Jun 01, 2019 8:17:22 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[4, 0, 5]}, minWireVersion=0, maxWireVersion=7, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=2249770}
Jun 01, 2019 8:17:22 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Opened connection [connectionId{localValue:2, serverValue:10}] to localhost:27017
admin
config
local
test
[XenonSuite] Successfully connected to MongoDB

pom.xml (игнорировать имена пакетов)
Проверить настройка плагина Shade

<?xml version="1.0" encoding="UTF-8"?>

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

  <groupId>test</groupId>
  <artifactId>test</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>test</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <mainClass>test.App</mainClass>
  </properties>

  <packaging>jar</packaging>

  <dependencies>

  <!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.10.2</version>
    </dependency>


    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>3.1.1</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>3.1.1</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.1.1</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>3.2.1</version>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>shade</goal>
              </goals>
              <configuration>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <transformers>
                  <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    <mainClass>test.App</mainClass>
                  </transformer>
                </transformers>
                <finalName>test</finalName>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
  </build>
</project>

Существует несколько способов решения этой проблемыСсылка задачи: https://www.baeldung.com/executable-jar-with-maven

1 голос
/ 01 июня 2019

Чтобы создать исполняемый файл jar, вы должны использовать следующий плагин maven jar. Ниже приведен фрагмент кода.

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>
                                your main class
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

Для получения более подробной информации обратитесь к ссылке на github, чтобы получить представление о том, как создать исполняемый / исполняемый файл.

https://github.com/debjava/runnableJar

Согласно документации, Maven Assembly Plugin для Maven в первую очередь предназначен для позволяют пользователям агрегировать результаты проекта вместе с его зависимости, модули, документация сайта и другие файлы в Единый распространяемый архив.

См. Ниже информацию о плагине Maven Assembly. http://maven.apache.org/plugins/maven-assembly-plugin/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...