NoClassDefFoundError на зависимости Maven

Мое первое использование Maven и я застряли с зависимостями.

Я создал проект Maven с Eclipse и добавил зависимости, и он работал без проблем.

Но когда я пытаюсь запустить его через командную строку:

<code>$ mvn package  # successfully completes
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App # NoClassDefFoundError for dependencies
</code>

Он загружает зависимости, успешно строит, но когда я пытаюсь его запустить, я получаю NoClassDefFoundError:

<code>Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException
        at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:16)
        at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:22)
        at tr.edu.hacettepe.cs.b21127113.bil138_4.App.main(App.java:10)
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonParseException
        at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
        ... 3 more
</code>

Мой pom.xml выглядит так:

<code><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>tr.edu.hacettepe.cs.b21127113</groupId>
  <artifactId>bil138_4</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>bil138_4</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>        
    <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>           
    </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>             
        </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.6</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.6</version>
    </dependency>
    </dependencies>
  </dependencyManagement>
</project>
</code>

Может кто-нибудь мне помочь?

Ответы на вопрос(5)

Решение Вопроса

when I try to run it, I get NoClassDefFoundError

Запустить это как? Вы, вероятно, пытаетесь запустить его с помощью eclipse, не импортировав правильно свой путь к классу maven. Увидетьm2eclipse плагин для интеграции Maven с затмением для этого.

Чтобы проверить правильность конфигурации maven, вы можете запустить приложение сплагин exec с помощью:

mvn exec:java -D exec.mainClass=<your main class>

Update: Во-первых, относительно вашей ошибки при запускеexec:javaВаш основной классtr.edu.hacettepe.cs.b21127113.bil138_4.App, Когда речь идет об именах классов, они (почти) всегда разделены точками. Простое имя класса - это только последняя часть:App в твоем случае. Полное имя - это полный пакет плюс простое имя класса, и это то, что вы даете maven или java, когда хотите что-то запустить. Вы пытались использовать путь файловой системы к исходному файлу. Это совершенно другой зверь. Имя класса обычно преобразуется непосредственно в файл класса, который найден в пути к классу, по сравнению с исходным файлом в файловой системе. В вашем конкретном случае рассматриваемый файл класса, вероятно, будет вtarget/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class потому что Maven компилируется вtarget/classesи Java традиционно создает каталог для каждого уровня упаковки.

Ваша первоначальная проблема заключается в том, что вы просто не поместили банки Джексона на путь своего класса. Когда вы запускаете Java-программу из командной строки, вы должны установить путь к классу, чтобы он знал, откуда она может загружать классы. Вы добавили свой собственный сосуд, но не другие необходимые. Ваш комментарий заставляет меня думать, что вы не понимаете, как вручную построить путь к классу. Короче говоря, путь к классу может иметь две вещи: каталоги, содержащие файлы классов, и файлы jar, содержащие файлы классов. Каталоги, содержащие банки, не будут работать. Подробнее о создании пути к классу см. & Quot;Установка пути к классу& Quot; иДжава а такжеJavac инструментальная документация.

Ваш путь к классу должен быть как минимум и без перевода строки:

target/bil138_4-0.0.1-SNAPSHOT.jar:
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.6/jackson-core-asl-1.9.6.jar:
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.6/jackson-mapper-asl-1.9.6.jar

Обратите внимание, что разделитель в Windows является точкой с запятой (;).

Я прошу прощения за то, что не заметил этого раньше. Проблема сидела там в твоем оригинальном посте, но я пропустил это.

 14 мар. 2019 г., 14:13
Даунвот не у всех есть основной класс.
 13 мая 2012 г., 06:46
Обновил мой ответ.
 utdemir13 мая 2012 г., 02:15
Получение этой ошибки:pastebin.com/g2txkMY6, Я могу запустить его на Eclipse с помощью плагина m2eclipse, я разработал приложение на нем. Я не могу просто понять, как запустить его через командную строку. И как импортировать мой Maven classpath? Изменить: Попытка с добавлением параметра -classpath /home/utdemir/.m2/repository/ в команду Java, все еще не повезло.
 utdemir13 мая 2012 г., 14:40
Спасибо. Настройка пути к классу, как вы говорите, решает проблему, помечая вопрос как решенный. Но у меня есть еще несколько вопросов: 1. Почему я не должен добавлять Джексона в classpath для exec plugin? 2- Плагину Exec нужен мой проект для компиляции, поэтому я должен был запустить mvn compile или package, верно? 3- Этот код является моим назначением, входит ли в их обязанности добавление библиотек в их пути к классам, или я должен что-то с этим сделать?
 13 мая 2012 г., 19:09
1) Практически все, что вы запускаете через maven, включая плагин exec, будет автоматически устанавливать путь к классам для вас на основе зависимостей вашего проекта, как указано в pom. Это главная причина популярности Maven. 2) Да, ты должен бежать хотя быmvn compile до запуска плагина exec. 3) Наконец, если бы я сдавал задание, я был бы уверен, что оно полностью выполнимо любым указанным способом. Если у вас есть вопрос о том, как ваш проект должен быть упакован или что-то для сдачи, я предлагаю начать новый вопрос SO.

Вы должны сделать classpath в файле pom для вашей зависимости. Поэтому вы должны скопировать все зависимости в одном месте.

Проверьте мой блог.

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.1</version>
      <executions>
        <execution>
          <id>,;copy-dependencies</id>
          <phase>package</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <outputdirectory>${project.build.directory}/lib</outputdirectory>
            <overwritereleases>false</overwritereleases>
            <overwritesnapshots>false</overwritesnapshots>
            <overwriteifnewer>true</overwriteifnewer>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>$fullqualified path to your main Class</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

По умолчанию Maven не связывает зависимости в создаваемом им JAR-файле, и вы не предоставляете их в classpath, когда пытаетесь выполнить JAR-файл из командной строки. Вот почему Java VM не может найти файлы классов библиотеки при попытке выполнить ваш код.

Вы можете вручную указать библиотеки на пути к классам с помощью-cp параметр, но это быстро становится утомительным.

Лучшее решение состоит в том, чтобы "затенить" код библиотеки в ваш выходной файл JAR. Существует плагин Maven под названиемMaven-тень-плагин сделать это. Вам нужно зарегистрировать его в своем POM, и он автоматически создаст & quot; uber-JAR & quot; содержащие ваши классы и классы для кода вашей библиотеки тоже при запускеmvn package.

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

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.6</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

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

$ mvn package
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App

Если вы хотите выполнить дальнейшую настройку плагина shade с точки зрения того, какие JAR-файлы должны быть включены, указав Main-Class для исполняемого файла JAR и т. Д., См. «Примеры». раздел насайт maven-shade-plugin.

 01 авг. 2018 г., 07:08
Не будет ли единственным отличием & lt; версия & gt; 3.1.1 & lt; / версия & gt; (вместо 1.6)? Запуск & quot; mvn package & quot; кажется, автоматически загружать Maven-Shade
 18 окт. 2018 г., 23:10
Моя команда использует<groupId>org.apache.maven.plugins</groupId> а также<artifactId>maven-dependency-plugin</artifactId> с<goals><goal>copy-dependencies</goal></goals>.
 13 авг. 2015 г., 12:05
В случае, если кто-то столкнется с этим ответом, вот где вы можете получить актуальную версию плагина, потому что 1.6 сейчас довольно старая:mvnrepository.com/artifact/org.apache.maven.plugins/…

Это связано с тем, что кувшин Морфия не является частью вашей войны / кувшина. Eclipse или локальная сборка включают их как часть пути к классам, но удаленные сборки или автоматическая / запланированная сборка не считают их частью пути к классам.

Вы можете включить зависимые банки с помощью плагина.

Добавьте приведенный ниже фрагмент в раздел плагинов вашего pom'а.

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>

Выбор Project - & gt; Чистый должен решить эту проблему

Ваш ответ на вопрос