2009-12-29 1 views
8

Я получаю ошибкуНастройка Java и JAVA_HOME путь к классам правильно в Ubuntu

Exception in thread "main" java.lang.NoClassDefFoundError:

Когда я пытаюсь запустить скомпилированный класс на Ubuntu. Я использую очень простой пример Helloworld, и миллионы ответов, которые уже существуют в Интернете, показывают, что мои переменные CLASSPATH и JAVA_HOME были неправильно установлены.

Однако я редактировал и т.д./окружающей среды в соответствующие папки, а также текущую папку:

PATH=".:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

JAVA_HOME="/usr/lib/jvm/java-1.5.0-sun/"

CLASSPATH=".:/usr/lib/jvm/java-1.5.0-sun/lib"

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

sudo java -cp . myfirstjavaprog.class

Я получаю ту же ошибку. Где еще я должен смотреть? Это должна быть проблема конфигурации.

Большое спасибо

+0

http://www.cyberciti.biz/faq/set-environment-variable-linux/ –

ответ

6

Вы хотите отбрасывать .class с конца. Просто введите ...

java -cp . myfirstjavaprog 
+0

Я настолько подавлен, что не заметил этого. – Huguenot

+4

Происходит к лучшему из нас. – Pace

1

Нет, я думаю, что переменные среды CLASSPATH игнорируются.

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

Почему CLASSPATH игнорируется? Несколько причин:

  1. Это артефакт Java 1.0, который выпал из употребления.
  2. JVM не гарантирует, что вы установили его как переменную окружения.
  3. У IDE есть свои требования, поэтому они не полагаются на него.
  4. Серверы приложений Java EE имеют свои собственные требования, поэтому они не полагаются на него.
  5. Вы должны каждый раз давать весь путь, потому что каждый проект может быть другим. После того, как вы пройдёте мимо «Hello, World», вы обнаружите, что скриптируете его или используете такие инструменты, как Ant и Maven, которые помогут вам установить CLASSPATH для вашего проекта.
+0

это будет плохая идея .. потому что каждый раз он должен дать полный путь – Anand

+0

Почему переменные среды classpath игнорируются? – Huguenot

+0

@lakshamanan - неправильно. Ему нужно научиться делать это таким образом, который подходит для будущих проектов, которые вряд ли будут скомпилированы и запущены в командной строке. – duffymo

0

для установки переменной java_home, вот инструкции.

http://luckydev07.blogspot.com/2009/08/setting-javahome-in-ubuntu-linux.html

и

классам может быть установлен аналогично

+0

Эти переменные были установлены, но по какой-то причине они игнорируются. У меня должна быть какая-то проблема синтаксиса. – Huguenot

+0

Ссылка больше не работает .. рассмотрим обновление .. –

0

Я настоятельно рекомендую вам потратить некоторое время, глядя на учебник Солнца. Это поможет вам в дальнейшем - классовые пути являются известными создателями проблем.

http://java.sun.com/docs/books/tutorial/getStarted/TOC.html

5

Я настоятельно рекомендую, чтобы избавиться от переменной окружения CLASSPATH, или по крайней мере с вашей JRE/JDK из него.

"." неявно находится в пути к классам, если не указано иное. А так как в Java 1.3 Java достаточно умен, чтобы найти собственную среду выполнения и библиотеки на основе пути выполнения исполняемых файлов javac/java. С тех пор было излишним, если не совсем неправильно, указать те, которые указаны в пути к классам. Разумеется, .../lib неверен, так как там есть только банки, нет классов, и они не выбраны из пути к классам, если они не указаны индивидуально и явно.

Современные javas достаточно умны, что вы можете просто набрать java <classname>, когда находитесь в корневом каталоге пути к классам, и это будет просто работать ™.

+0

Вы совершенно правы, оказалось, что проблема была в том, что я пытаюсь скомпилировать все, что импортирует компоненты swing, что дает точно такую ​​же ошибку. тогда как пример HelloWorld.java в порядке ... Это кажется странным. – Huguenot

+1

Ох ... обратите внимание, что Windows по умолчанию поставляется с плохо искалеченной Java, причем исполняемые файлы находятся в системном пути Windows. Пожалуйста, сделайте «java -version» из приглашения DOS и узнайте, является ли версия Java, на которой вы работаете, версию, которую вы хотите! –

+1

То же самое можно сказать о Ubuntu; потому что он поставляется с GNU java (по крайней мере, пару систем Ubuntu, которые я видел), а не Java. «k, это не« сильно искалечено »- но это не Java-Java. – NDP

1

Вы смешиваете яблоки и апельсины. Необработанный вызов java или javac в командной строке требует пути к классу, чтобы узнать, где он может получить доступ к своим классам. Когда вы запустите

java -cp pathelement1:pathelement2... MyClass 

Вы предоставляете java список мест для поиска классов runnable. Это не будет выглядеть нигде, включая «.», Если вы не скажете об этом. Так «CLASSPATH» не поможет вам, если вы не запустите

java -cp $CLASSPATH MyClass 

Inotherwords, его просто ярлык, чтобы того, чтобы перепечатать классам.

Многие программы сконфигурированы для использования JAVA_HOME, но в конечном итоге для запуска java-программ требуется только сконфигурированный путь к классам и путь к java (они находят его через переменную JAVA_HOME, поэтому вам все еще нужно это для вещей, таких как ant, но его «все еще концептуально просто ярлык).

ваш PATH - это путь, по которому система ищет двоичные файлы. Если java не находится на вашем пути (введите «java», он покажет вам, какой из них java находится на вашем пути) running/full/path/to/java идентичен только запущенному «java» и имеет систему найдите двоичный файл в переменной PATH.

0

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

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

Когда я попытался запустить пример HelloWorld, я случайно включил расширение .class.

Обе эти проблемы дали мне ошибки ClassNotFound.

Большое спасибо за вашу помощь.

1

Использование

sudo update-java-alternatives -s java-6-openjdk 

Он устанавливает много вещей в переменной CLASSPATH.