NoClassDefFoundError в проекте maven с локальной зависимостью

Я пытаюсь запустить файл .jar, созданный maven, с одной локальной зависимостью (библиотекой обработки), которая не распознается. Я использовал maven-install-plugin. JAR библиотеки находится в root/lib. После запуска

$ mvn validate
$ mvn clean package
$ java -cp target/my-app-1.0.jar com.mycompany.app.App

Я получаю сообщение об ошибке:

Error: Could not find or load main class com.mycompany.app.App
Caused by: java.lang.NoClassDefFoundError: processing/core/PApplet

Однако приложение работает нормально, когда я запускаю:

$ java -cp target/classes:$HOME/.m2/repository/org/processing/core/10/core-10.jar com.mycompany.app.App

Вот мой 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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>14</maven.compiler.source>
    <maven.compiler.target>14</maven.compiler.target>
  </properties>

  <dependencies>
    <!--  LOCAL  -->
    <dependency>
      <groupId>org.processing</groupId>
      <artifactId>core</artifactId>
      <version>10</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-install-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
          <groupId>org.processing</groupId>
          <artifactId>core</artifactId>
          <version>10</version>
          <packaging>jar</packaging>
          <file>${pom.basedir}/lib/processing-core.jar</file>
          <generatePom>true</generatePom>
        </configuration>
        <executions>
          <execution>
            <id>install-jar-lib</id>
            <goals>
              <goal>install-file</goal>
            </goals>
            <phase>validate</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  
</project>

А вот и исходник:

package com.mycompany.app;

import processing.core.PApplet;

public class App extends PApplet{
    public static void main( String[] args ) {
        PApplet.main(App.class, args);
        System.out.println( "Hello World!" );
    }
}

Моя среда:

$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 14.0.2, vendor: Private Build, runtime: /usr/lib/jvm/java-14-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.8.0-33-generic", arch: "amd64", family: "unix"

Спасибо за все предложения.

Проблема в том, что ваш скрипт Maven не встраивает «processing.core.PAplet» в ваш .jar, как вы надеялись. Следуйте приведенным ниже советам SilverNak — это должно вас успокоить. Пожалуйста, не забудьте «проголосовать» и «принять» его ответ, если вы нашли его полезным.

paulsm4 22.12.2020 20:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
715
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Плагин maven-install-plugin используется для установки артефакта в ваш локальный репозиторий maven. Это не то, что вы хотите делать здесь. Ваша цель — получить зависимость в пути к классам.

Чтобы иметь возможность запускать свой код с помощью этой команды

java -cp target/my-app-1.0.jar com.mycompany.app.App

Вы должны убедиться в двух вещах

  1. Манифест jar-файла приложения должен содержать путь к jar-файлу зависимостей.
  2. Банка зависимостей должна находиться в указанном месте

Для первой части вы можете использовать maven-jar-plugin:

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>

Имейте в виду, что это добавит все зависимости к пути к классам, что может быть, а может и не быть тем, что вам нужно.

Для второй части вы можете использовать maven-dependency-plugin. Это скопирует все зависимости (или с соответствующей конфигурацией только выбранные зависимости) в target/lib

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.2</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.directory}/lib</outputDirectory>
    </configuration>
</plugin>

В этой конфигурации целевой каталог должен выглядеть примерно так, отображая только соответствующие файлы/каталоги:

target
|- lib
|  |- core-10.jar
|- my-app-1.0.jar

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