Java NoClassDefFoundError, несмотря на установленный путь к классам

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

Вот общая настройка моего применение: классы находятся в пакетах model, view и controller. controller.Controller - это класс с основным методом. Я использую objectdb в качестве поставщика JPA.

Я использую Ant для компиляции моего приложения.

После компиляции я могу запустить свое приложение из ant с помощью следующего скрипта:

<target name="run" description="default build process">
    <java fork="true" classname="${main-class}">
        <classpath>
            <path refid="classpath" />
        </classpath>
    </java>
</target>

где $ {main-class} - controller.Controller и classpath состоят из папок / lib и / dist (файл jar приложения скомпилирован в / dist)

Теперь я попытался скопировать все файлы .jar из / lib и / dist в одну отдельную папку и запустить их с помощью java -jar Cooking.jar -cp. , что приводит к

Exception in thread "main" java.lang.NoClassDefFoundError: javax/persistence/Persistence
    at model.jpa.JPAModelFactory.<init>(JPAModelFactory.java:28)
    at model.jpa.JPAModelFactory.<init>(JPAModelFactory.java:24)
    at controller.Controller.<init>(Controller.java:59)
    at controller.Controller.main(Controller.java:116)
Caused by: java.lang.ClassNotFoundException: javax.persistence.Persistence
    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)
    ... 4 more

Итак, я попробовал ant и немного изменил указанную выше цель сборки на:

<target name="run2" description="default build process">
    <java fork="true" jar="${dist.dir}/${ant.project.name}.jar">
        <classpath>
            <path refid="classpath" />
        </classpath>
    </java>
</target>

, что приводит к той же ошибке. Я не понимаю почему.

Чтобы проверить это, я попытался запустить из командной строки, указав напрямую основной класс: java -cp. controller.Controller , который по какой-то причине не может даже определить местонахождение класса (он там, я это подтвердил):

Exception in thread "main" java.lang.NoClassDefFoundError: controller/Controller
Caused by: java.lang.ClassNotFoundException: controller.Controller
    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)
Could not find the main class: controller.Controller.  Program will exit.

Я установил JAVA_HOME на свой путь JDK, а CLASSPATH на мой путь JRE / lib. ОС - это 64-разрядная версия Windows 7, версия Java - 1.6.0_25-b06

Меня озадачивают две вещи: a) Почему Java не может найти controller.Controller, даже если он присутствует в файле .jar, а файл .jar находится в текущем каталоге? б) Что я делаю не так, что вызов Java с -jar, похоже, нарушает механизмы поиска.

Любая помощь приветствуется.

8
задан vbence 28 May 2011 в 21:17
поделиться