Исключение Maven NoClassDefFoundError ClassNotFoundException, но существует зависимость Maven от командной строки - PullRequest
0 голосов
/ 27 мая 2019

У меня проблема с мавеном.Я включил зависимость как таковую в свой pom.xml:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-csv</artifactId>
  <version>1.6</version>
</dependency>

Я использую Intellij в качестве IDE, и я не получаю там никаких предупреждений компиляции или чего-либо еще.Я использую командную строку для запуска команд maven и могу без проблем запускать mvn install compile package.

Однако, когда я пытаюсь запустить jar как таковой:

java -cp target/stride-1.0-SNAPSHOT.jar com.myapp.maven.App

Я получаю эту ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/csv/CSVFormat
    at com.stride.maven.App.parseCsv(App.java:43)
    at com.stride.maven.App.main(App.java:25)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.csv.CSVFormat
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

Очевидно, Maven не может найти этот путь.Я попытался удалить .m2, перестроить и, в основном, все, что нашел в stackoverflow, но не могу найти проблему или получить представление о проблеме.Обратите внимание, в моем Intellij я вижу зависимость во внешних библиотеках.

Я также пытался использовать shade для копирования зависимостей в jar:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <shadedArtifactAttached>true</shadedArtifactAttached>
            <transformers>
              <transformer implementation=
                                   "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>com.myapp.maven.App</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>

После чего я перезапускаю mvn clean install package и затем мою команду build.Не повезло.

Я также попробовал подключаемый модуль Maven Assembly.Угадайте, что, не повезло!

<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.myapp.maven.App
                    </mainClass>
                </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

Я подтвердил, что зависимости даже не встраиваются.

Спасибо!

1 Ответ

0 голосов
/ 27 мая 2019

Maven прекрасно работает в этом случае. Однако вы, похоже, упускаете точку зависимости.

Когда вы определяете зависимость, maven использует ее во время компиляции (следовательно, нет ошибок как в intelliJ, так и при выполнении mvn install)

Но это не значит, что зависимость находится прямо в банке.

Существуют более сложные типы упаковки приложений, в которых оно действительно работает следующим образом (зависимые файлы включены в артефакт), например загрузочное приложение Spring, веб-архивы (WAR) и т. Д. Но так как вы компилируете обычный JAR, он будет включать только классы вашего модуля и не будет включать классы commons-csv в этом случае.

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

  • Поместите Jar of commons-csv (а также другие ваши зависимости) в путь к классу: java -classpath <path-to-commons-csv> -jar YourApp

  • Используйте Maven Shade Plugin , чтобы создать банку, которая действительно будет включать все зависимости как классы

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