Как решить java.lang.NoClassDefFoundError?

Я пробовал использовать оба примера в Oracle Java Tutorials. Они оба компилируются отлично, но во время выполнения обе приходят с этой ошибкой:

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

Я думаю, что у меня может быть файл Main.java в неправильной папке. Вот иерархия каталогов:

graphics
├ Main.java
├ shapes
|   ├ Square.java
|   ├ Triangle.java
├ linepoint
|   ├ Line.java
|   ├ Point.java
├ spaceobjects
|   ├ Cube.java
|   ├ RectPrism.java

И вот Main.java:

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2,3,15);
        Line l = new Line(1,5,2,3);
        Cube c = new Cube(13,32,22);
    }
}

Что я здесь делаю неправильно?

UPDATE

После того, как я поместил класс Main в пакет graphics (я добавил package graphics; к нему), задайте путь к классу "_test" (папка, содержащая графику), скомпилировали его и запустили с помощью java graphics.Main (из командной строки), он работал.

Действительно поздно UPDATE # 2

Я не использовал Eclipse (только Notepad ++ и JDK), и вышеупомянутое обновление решило мою проблему. Однако, похоже, что многие из этих ответов относятся к Eclipse и IntelliJ, но они имеют схожие понятия.

Ответ 1

После компиляции кода вы получите .class файлы для каждого класса вашей программы. Эти двоичные файлы - это байт-код, который Java интерпретирует для выполнения вашей программы. NoClassDefFoundError указывает, что загрузчик классов (в данном случае java.net.URLClassLoader), который отвечает за динамическую загрузку классов, не может найти файл .class для класса, который вы пытаетесь использовать.

Ваш код не будет компилироваться, если требуемые классы не присутствуют (если классы не загружены с отражением), поэтому обычно это исключение означает, что ваш путь к классам не включает необходимые классы. Помните, что classloader (особенно java.net.URLClassLoader) будет искать классы в пакете a.b.c в папке a/b/c/в каждой записи в вашем пути к классам. NoClassDefFoundError также может указывать на то, что вам не хватает транзитивной зависимости файла .jar, который вы скомпилировали, и пытаетесь использовать.

Например, если у вас был класс com.example.Foo, после компиляции у вас будет файл класса Foo.class. Скажем, например, ваш рабочий каталог .../project/. Этот файл класса должен быть помещен в .../project/com/example, и вы должны установить свой путь к классу .../project/.

Боковое примечание: я бы рекомендовал воспользоваться удивительным инструментом, который существует для языков Java и JVM. Современные IDE, такие как Eclipse и IDEA, и инструменты управления построением, такие как Maven или Gradle, помогут вам не беспокоиться о classpaths (столько же) и сосредоточиться на коде! Тем не менее, эта ссылка объясняет, как установить путь к классу при выполнении в командной строке.

Ответ 2

Я хотел бы исправить перспективы других на NoClassDefFoundError.

NoClassDefFoundError может возникать по нескольким причинам, например,

  • ClassNotFoundException -.class не найден для этого ссылочного класса независимо от того, доступен ли он во время компиляции или нет (например, базовый/дочерний класс).
  • Файл класса находится, но исключение возникает при инициализации статических переменных
  • Файл класса, расположенный, Исключение при инициализации статических блоков

В исходном вопросе это был первый случай, который можно исправить, установив CLASSPATH в файл jar файлов ссылочных классов или в его папку пакета.

Что это означает, говоря "доступно во время компиляции"?

  • В коде используется ссылочный класс.
    Например: Два класса, A и B (продолжается A). Если B ссылается непосредственно в коде, это доступный во время компиляции, то есть A a = новый B();

Что это означает, говоря "не доступно во время компиляции"?

  • Класс времени компиляции и класс времени выполнения различны, то есть, например, базовый класс загружается с использованием имени класса дочернего класса, например Class.forName( "имя_класс" )
    Например: два класса, A и B (расширяет A). У кода есть A a = Class.forName( "B" ). NewInstance();

Ответ 3

NoClassDefFoundError означает, что класс присутствует в пути к классу Compile time, но он не существует в пути к классу в Runtime.

Если вы используете Eclipse, убедитесь, что у вас есть записи shapes, linepoints и spaceobjects в файле .classpath.

Ответ 4

если вы получили одну из этих ошибок при компиляции и запуске:

* NoClassDefFoundError

* Error: Could not find or load main class hello

* Exception in thread "main" java.lang.NoClassDefFoundError:javaTest/test/hello 
(wrong name: test/hello)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

-------------------------- РЕШЕНИЕ -----------------------

проблема в основном заключается в организации пакетов. Вы должны правильно упорядочить свои классы в папках в соответствии с классификациями пакетов в исходном коде.

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]

Ответ 5

Если вы получаете NoClassDefFoundError для некоторого внешнего файла jar, который вы добавили в проект, попробуйте добавить файл jar в папку lib и добавить его в путь к классам по свойствам → Путь сборки Java → Добавить переменную → Настроить переменные → Новая запись переменной. И перестройте.

Ответ 6

java.lang.NoClassDefFoundError

указывает, что что-то было найдено в compiletime, но не во время выполнения. возможно, вам просто нужно добавить его в путь к классам.

Ответ 7

Это иногда происходит в IntelliJ IDEA после крупного рефакторинга.

Щелкните правой кнопкой мыши на своем проекте и выберите → Скомпилировать модуль, а затем заново запустите проект и он должен снова работать.

Ответ 8

Отсутствие исключения класса происходит, когда предполагаемый класс не найден в пути класса. В классе времени компиляции: класс был создан из компилятора Java, но почему-то во время выполнения зависимый класс не найден.

Давайте рассмотрим один простой пример:

public class ClassA{
public static void main(String args[]){
     //Some gibberish Code...
     String text = ClassB.getString();
     System.out.println("Text is :" + text);
}

}

public class ClassB{
    public static String getString(){
      return "Testing Some Exception";
 }
}

Теперь Предположим, что вышеупомянутые два исходных кода Java помещены в какую-либо папку, и пусть "NoClassDefinationFoundExceptionDemo"

Теперь откройте оболочку (предположим, что Java уже настроена правильно)

  • Перейдите в папку "NoClassDefinationFoundExceptionDemo"
  • Скомпилировать исходные файлы Java  javac ClassB  javac ClassA
  • Оба файла скомпилированы. Существенно и сгенерированные файлы классов в одной папке как ClassA.class и ClassB.class
  • Теперь, поскольку мы переопределяем ClassPath в текущий рабочий каталог поэтому мы выполняем следующую команду java -cp. ClassA и он успешно работал, и вы увидите вывод на экране
  • Теперь скажем, вы удалили файл ClassB.class из Current Directory. и теперь вы снова выполняете команду. java -cp. ClassA Теперь он будет приветствовать вас с NoClassDefFoundException. поскольку ClassB, который является зависимостью для ClassA, не найден в пути к классам (например, в рабочем каталоге).

Ответ 9

Если ваш проект находится в пакете типа com.blahcode, а ваш класс называется Main, скомпилированные файлы могут выводиться в структуре каталогов, например ./out/com/blahcode/Main.class. Это особенно справедливо для IntelliJ IDEA.

При попытке запустить из оболочки или cmd вам нужно cd к тому, что содержит com в качестве подкаталога.

cd out
java -classpath . com.blahcode.Main

Ответ 10

NoClassDefFoundError в Java:

Определение:

NoClassDefFoundError появится, если класс присутствовал во время компиляции, но не доступен в java classpath во время выполнения. Обычно вы увидите строку ниже в журнале, когда вы получаете NoClassDefFoundError: Исключение в потоке "main" java.lang.NoClassDefFoundError

Возможные причины:

  • Класс недоступен в пути Java Classpath.

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

  • Любой запуск script переопределяет переменную среды Classpath.

  • Поскольку NoClassDefFoundError является подклассом java.lang.LinkageError, он также может появиться, если некоторая его зависимость, например, родная библиотека, недоступна.

  • Проверьте java.lang.ExceptionInInitializerError в вашем файле журнала. NoClassDefFoundError из-за сбоя статической инициализации довольно распространен.

  • Если вы работаете в среде J2EE, чем видимость класса среди нескольких Classloader также может вызвать java.lang.NoClassDefFoundError, см. примеры и сценарий для подробного обсуждения.

Возможные разрешения:

  • Убедитесь, что все необходимые классы Java включены в путь класса приложений. Наиболее распространенная ошибка заключается не в том, чтобы включить все необходимые классы, прежде чем приступить к выполнению приложения Java, которое имеет зависимости от некоторых внешних библиотек.

  • Путь к классу приложения верен, но переменная среды Classpath переопределяется перед выполнением приложений.

  • Убедитесь, что вышеупомянутый ExceptionInInitializerError не отображается в трассировке стека приложения.

Ресурсы:

3 способа решения java.lang.NoClassDefFoundError в Java J2EE

java.lang.NoClassDefFoundError - Как решить ошибку определения не класса

Ответ 11

Сегодня я столкнулся с проблемой. У меня есть проект Android, и после включения multidex проект больше не запускается.

Причина заключалась в том, что я забыл вызвать конкретный метод multidex, который должен быть добавлен в Application class и вызываться перед всем остальным.

 MultiDex.install(this);

Следуйте этому руководству, чтобы правильно включить multidex. https://developer.android.com/studio/build/multidex.html

Вы должны добавить эти строки в свой класс приложения

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

Ответ 12

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

Ответ 13

После работы над проектом NetBeans в течение многих месяцев я неожиданно получил сообщение NoClassDefFoundError вскоре после получения предупреждения о "низкой памяти". Выполнение Clean rebuild не помогло, но полностью закрыло Netbeans и снова открыло проект. Отчеты об ошибках не поступали.

Ответ 14

Этот ответ специфичен для java.lang.NoClassDefFoundError, который происходит в службе:

Моя команда недавно увидела эту ошибку после обновления rpm, которая предоставляла сервис. Rpm и программное обеспечение внутри него были построены с Maven, поэтому казалось, что у нас была зависимость времени компиляции, которая просто не была включена в число оборотов в минуту.

Однако при исследовании класс, который не был найден, находился в том же модуле, что и несколько классов в трассировке стека. Кроме того, это был не модуль, который недавно был добавлен в сборку. Эти факты указывают, что это может быть не проблема зависимости Maven.

Возможное решение: Перезапустить службу!

Похоже, что обновление rpm аннулирует дескриптор файла службы в базовом файле jar. Затем служба увидела класс, который не был загружен в память, искал его среди своего списка файлов jar файлов и не смог найти его, потому что дескриптор файла, из которого он мог загрузить класс, был недействителен. Перезапуск службы заставил ее перезагрузить все свои дескрипторы файлов, что позволило ему загрузить этот класс, который не был найден в памяти сразу после обновления rpm.

Надеюсь, что конкретный случай поможет кому-то.

Ответ 15

Ну.. у меня была такая же ошибка после добавления в classpath. Решение, которое я нашел, это удалить папку bin для моего проекта. После этого папка была создана автоматически только с файлом манифеста... а затем ошибка исчезла.

Надеюсь, это поможет.

Ответ 16

Мои две центы в этой цепочке:

Убедитесь, что classpath содержит полные пути (/home/user/lib/some_lib.jar вместо ~/lib/some_lib.jar), в противном случае вы можете столкнуться с ошибкой NoClassDefFoundError.

Ответ 17

Я получаю NoClassFoundError, когда классы, загруженные загрузчиком классов времени выполнения, не могут обращаться к классам, уже загруженным корневым загрузчиком java. Поскольку разные загрузчики классов находятся в разных доменах безопасности (в соответствии с java), jvm не разрешит классы, уже загруженные корневым загрузчиком, которые будут разрешены в адресном пространстве загрузчика времени выполнения.

Запустите свою программу с помощью java -javaagent: tracer.jar [YOUR java ARGS] '

Он производит вывод, показывающий загруженный класс, и загрузчик env, который загружал класс. Очень полезно отслеживать, почему класс не может быть разрешен.

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}

Ответ 18

Это очень часто случается с моими модулями genymotion. Убедитесь, что на вашем диске имеется достаточное количество памяти, где установлен Genymotion.

Ответ 19

Это случилось со мной в Android Studio.

Решение, которое сработало для меня: просто перезапустите студию.

Ответ 20

У меня была такая же проблема с моей разработкой Android с помощью студии Android. Предлагаемые решения являются общими и мне не помогают (по крайней мере, для меня). После нескольких часов исследований я нашел следующее решение и может помочь разработчикам Android, которые занимаются разработкой с помощью студии Android. измените настройку ниже Настройки → Сборка, выполнение, развертывание → Мгновенный запуск → отменить первый вариант.

С этим изменением я работаю. Надеюсь, это поможет моим друзьям-друзьям.

Ответ 21

Убедитесь, что если у вас есть статический обработчик в вашем классе. Если да, будьте осторожны, причина, по которой статический обработчик может быть инициирован только в потоке, который имеет циклытель, авария может быть вызвана следующим образом:

1. Прежде всего, создайте экземпляр класса в простой поток и поймайте сбой.

2. Затем вызовите метод поля класса в основном потоке, вы получите NoClassDefFoundError.

вот тестовый код:

public class MyClass{
       private static  Handler mHandler = new Handler();
       public static int num = 0;
}

в вашем методе onCrete основной активности добавьте часть тестового кода:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //test code start
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                MyClass myClass = new MyClass();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }).start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    MyClass.num = 3;
    // end of test code
}

существует простой способ исправить его с помощью обработчика handlerThread для init:

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}

Ответ 22

Если вы используете более одного модуля, вы должны иметь

dexOptions {
    preDexLibraries = false
}

в вашем файле сборки.

Ответ 23

Я столкнулся с этой проблемой при работе с Apache Axis. Отработанные часы возились с конфигурацией classpath/build, основанной на большей части обратной связи здесь и в похожих потоках. Оказывается, у меня отсутствовали необходимые поддерживающие библиотеки XML для определенных транзакций веб-сервиса. Добавили их в проект, и все стало хорошо

Ответ 24

(1) Первый метод: я решил эту проблему. Удалив некоторый класс Dependencies, удалите их из ниже кода этой проблемы, я столкнулся с 4.2.2

compile 'com.google.android.gms:play-services-gcm:11.0.4'
compile 'com.google.android.gms:play-services:11.0.4'

это лишние в моем коде, я удалил их

 dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
compile files('libs/ypylibs.jar')
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.google.android.gms:play-services-gcm:11.0.4'
compile 'com.google.android.gms:play-services:11.0.4'
compile 'com.google.android.gms:play-services-ads:11.0.4'
compile 'com.dailymotion.dailymotion-sdk-android:sdk:0.1.12'
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'commons-io:commons-io:1.3.2'
compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'

}

(2) Метод: Еще один способ решить эту проблему - создать новый класс Myapplication

public class MyApplication extends Application {

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

}

затем добавьте его в файл mainfest и в теге приложения

 <application
    android:allowBackup="true"
    android:name=".gps.navigation.map.MyApplication"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"></application>

после этого в вашем основном действии удалите appcompactactivity, если это необходимо, и расширьте свой класс активностью, он будет работать тогда.

Ответ 25

Один источник ошибок для этого исключения может быть обусловлен противоречивыми определениями для Proguard, например. отсутствует

-libraryJars "path.to.a.missing.jar.library".

Это объясняет, почему компиляция и работа отлично работают, учитывая, что там есть банка, а чистая и сборка не выполняется. Не забудьте определить новые добавленные библиотеки jar в настройках proguard!

Обратите внимание, что сообщения об ошибках от Proguard действительно не соответствуют стандарту, так как их легко путать с аналогичными сообщениями ant, поступающими, когда банку вообще нет. Только на самом дне будет небольшой намек на пролога в беде. Следовательно, вполне логично начать поиск традиционных ошибок classpath и т.д., Но это будет напрасно.

Очевидно, исключение NoClassDefFound будет результатом при запуске, например. результирующая исполняемая банка построена и основана на отсутствии последовательности proguard. Некоторые называют его proguard "Ад"

Ответ 26

Я использую FileSync для Eclipse, поэтому я могу отлаживать Tomcat, и я получил NoClassFoundError, потому что добавил запись синхронизации для каталога bin в рабочей области Eclipse => classes в metadata для Tomcat, но также не добавил синхронизацию папок для каталога extlib в Eclipse =>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib

Ответ 27

Я разрабатываю приложение на основе Eclipse, также известное как RCP (Rich Client Platform). И я столкнулся с этой проблемой после рефакторинга (перемещение одного класса из подключаемого модуля в новый).

Очистка проекта и обновление Maven не помогли.

Проблема была вызвана Bundle-Activator, которые не обновлялись автоматически. Ручное обновление Bundle-Activator под MANIFEST.MF в новом подключаемом модуле устранило мою проблему.

Ответ 28

если вы недавно добавили поддержку multidex в студию Android, вот так:

// To Support MultiDex
implementation 'com.android.support:multidex:1.0.1'

поэтому ваше решение просто расширяется из MultiDexApplication вместо приложения

public class MyApp extends MultiDexApplication {