2016-03-28 3 views
0

У меня есть эта структура каталогов:Импорт пакета из вложенной папки: Исключение в потоке «главный» java.lang.NoClassDefFoundError

src 
    MyPackageFile1.java 
    MyPackageFile2.java 
vendor 
    something.jar 
Example.java 

Обратите внимание, что все файлы в src имеют package com.example; декларацию, в то время как Example.java не принадлежит этот пакет: это пример использования этого пакета (поэтому он имеет import xyz.pushpad.*;).

Я успешно компилировать с:

javac -classpath vendor/something.jar src/*.java Example.java 

Однако, когда я бегу:

java Example 

я получаю:

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/DeliveryException 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048) 
    at java.lang.Class.getMethod0(Class.java:3018) 
    at java.lang.Class.getMethod(Class.java:1784) 
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) 
Caused by: java.lang.ClassNotFoundException: com.example.MyPackageFile1 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 7 more 
+0

Вызвано: java.lang.ClassNotFoundException: com.example.MyPackageFile1 – Shark

ответ

1

MyPackageFile1.java Если и MyPackageFile1.java объявлены в пакете com.example, то есть три проблемы:

  1. Ваша структура каталогов источник является неправильным. Это должно быть так:

    src 
        com 
         example 
         MyPackageFile1.java 
         MyPackageFile2.java 
    
  2. Вы используете неправильный разделитель путей. Поскольку вы используете Linux (на основе синтаксиса пути), разделитель classpath равен :, а не ;.

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

    java -cp vendor/something.jar:src:. Example 
    

Однако, все это очень Hacky.

  • Если ваш кодовая не должно быть, как на модули нескольких кодовых деревьев, то вы должны поместить ваш пример исходного кода в каталог src; например

    src 
        Example.java 
        com 
         example 
         MyPackageFile1.java 
         MyPackageFile2.java 
    
  • Это плохая идея, чтобы поместить исходный код и скомпилированный код в том же дереве. Лучше всего использовать опцию -d; например

    mkdir bin 
    javac -cp bin:vendor/something.jar -d bin 
        src/Example.java 
        src/com/example/MyPackageFile1.java 
        src/com/example/MyPackageFile12java 
    
    java -cp bin:vendor/something.jar Example 
    
  • Вы должны использовать инструмент сборки какой-то ... если вы хотите, чтобы ваши сборки должны быть последовательными и воспроизводимым.

1

Подобно команде компиляции команда запуска также нуждается в баночку файл на пути к классу

java -cp vendor/something.jar;src com.example.Example 

где Example.java перемещается в новый каталог src/com/something

Смежные вопросы