Подтвердить что ты не робот

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

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

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

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

$ 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

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

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

Мой 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>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>

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

4b9b3361

Ответ 1

когда я пытаюсь запустить его, я получаю NoClassDefFoundError

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

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

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

Обновление: Во-первых, в отношении вашей ошибки при запуске 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 традиционно создает каталог для каждого уровня упаковки.

Ваша первоначальная проблема заключается в том, что вы не поставили банки Jackson на свой путь к классу. Когда вы запускаете java-программу из командной строки, вам нужно установить путь к классу, чтобы он знал, откуда он может загружать классы. Вы добавили свою собственную банку, но не другие необходимые. Ваш комментарий заставляет меня думать, что вы не понимаете, как вручную создать путь к классу. Короче говоря, путь класса может иметь две вещи: каталоги, содержащие файлы классов и банки, содержащие файлы классов. Каталоги, содержащие банки, не будут работать. Более подробную информацию о построении пути к классу см. В разделе "Настройка пути к классу" и java и 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 является точкой с запятой (;).

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

Ответ 2

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

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

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

Чтобы просто объединить все необходимые библиотеки, добавьте в свой 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

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

Ответ 3

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

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

Добавьте ниже фрагмент кода в раздел плагинов pom

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

Ответ 4

Вы должны сделать 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>

Ответ 5

Это происходит потому, что двоичные файлы maven помещаются в защищенную Windows папку (файлы программы в моем случае)... так что это проблема с разрешениями!

Просто поместите maven в c: и добавьте в переменную PATH, точно так же, как в официальном руководстве объясняется:

Инструкции

Это решило мою проблему!!

Ответ 6

Никто не упоминает, что эта ошибка произойдет, когда кто-то испортит номера версий в файле POM или зависимость от сервера maven будет удалена. Там нет документированного решения, пожалуйста, обновите этот ответ.

Я смог обойти это, запустив mvn install: install-file с классом -Dpackaging =. Затем добавьте запись в POM, как описано здесь: fooobar.com/questions/23282/...

Ответ 7

Выбор проекта → Чистый должен решить эту проблему