Правильная настройка java classpath и java_home в Ubuntu

я получаю сообщение об ошибке

Исключение в основном потоке java.lang.NoClassDefFoundError:

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

Однако я отредактировал etc/environment в правильных папках, а также в текущей папке:

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

JAVA_HOME=/usr/lib/jvm/java-1.5.0-солнце/

ПУТЬ К КЛАССУ=.:/usr/lib/jvm/java-1.5.0-sun/lib

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

судо-java-cp. myfirstjavaprog.class

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

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


person Huguenot    schedule 29.12.2009    source источник
comment
cyberciti.biz/faq/set-environment-variable-linux   -  person Fathah Rehman P    schedule 07.05.2012


Ответы (8)


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

java -cp . myfirstjavaprog
person Pace    schedule 29.12.2009
comment
Я так подавлен, что не заметил этого. - person Huguenot; 29.12.2009

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

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

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

person Carl Smotricz    schedule 29.12.2009
comment
Вы совершенно правы, оказывается, проблема заключалась в том, что когда я пытаюсь скомпилировать что-либо, что импортирует компоненты Swing, выдается точно такая же ошибка. тогда как пример HelloWorld.java в порядке... Это кажется странным. - person Huguenot; 29.12.2009
comment
О... обратите внимание, что Windows по умолчанию поставляется с сильно поврежденной Java, а исполняемые файлы находятся в системном пути к классам Windows. Пожалуйста, введите java -version из командной строки DOS и посмотрите, является ли версия Java, которую вы используете, той версией, которая вам нужна! - person Carl Smotricz; 29.12.2009
comment
то же самое можно сказать и об Ubuntu; потому что он поставляется с java GNU (по крайней мере, с парой систем Ubuntu, которые я видел), а не с java Sun. 'к, он не сильно покалечен - но это не Sun's java. - person NDP; 30.12.2009
comment
Я голосую за, потому что в Google не так много вещей об установке CLASSPATH для Java. у меня было ошибочное впечатление, что вам все еще нужно настроить CLASSPATH... но я ошибался. - person Trevor Boyd Smith; 03.02.2011
comment
как насчет JAVA_HOME... вам все еще нужно настроить эту переменную пути? - person Trevor Boyd Smith; 03.02.2011
comment
@Trevor: Есть несколько инструментов, которым нравится это видеть; Кажется, я помню, что среди них были Tomcat и ant. Но и без них можно обойтись, и в обычном случае они вам не нужны. - person Carl Smotricz; 04.02.2011

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

java -cp pathelement1:pathelement2... MyClass

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

java -cp $CLASSPATH MyClass

Другими словами, это просто ярлык для повторного ввода пути к классам.

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

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

person Steve B.    schedule 29.12.2009

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

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

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

  1. Это артефакт Java 1.0, который потерял популярность.
  2. У JVM нет гарантии, что вы установили ее в качестве переменной среды.
  3. У IDE есть свои требования, поэтому они на них не полагаются.
  4. Серверы приложений Java EE имеют свои собственные требования, поэтому они не полагаются на них.
  5. Вы должны каждый раз указывать весь путь, потому что каждый проект, скорее всего, будет другим. Как только вы продвинетесь дальше «Hello, World», вы обнаружите, что пишете сценарий или используете такие инструменты, как Ant и Maven, которые помогут вам установить CLASSPATH для вашего проекта.
person duffymo    schedule 29.12.2009
comment
это будет плохой идеей..потому что каждый раз ему придется давать полный путь - person Anand; 29.12.2009
comment
Почему переменные среды пути к классам игнорируются? - person Huguenot; 29.12.2009
comment
@lakshamanan - неправильно. Ему придется научиться делать это так, чтобы это подходило для будущих проектов, которые вряд ли будут компилироваться и запускаться в командной строке. - person duffymo; 29.12.2009
comment
Этот ответ как золото. Однако - DOS-люди облажались. 255-символьные командные строки. Еще раз спасибо, Билл! - person NDP; 30.12.2009
comment
Дело в том, что никто не использует командные оболочки для компиляции или запуска чего-либо значимого после того, как они прошли Hello, World и туториалы. Это далеко не та проблема, которую вы представляете. Настольные приложения используют сценарии и Ant; развернутые приложения используют встроенные в них соглашения. Если бы это было так важно, Java давно бы вымерла. - person duffymo; 30.12.2009

Использовать

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

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

person haasdas    schedule 14.05.2011

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

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

и

classpath можно установить аналогичным образом

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

Я настоятельно рекомендую вам потратить некоторое время на изучение учебника Sun. Это поможет вам позже — классовые пути — печально известные создатели проблем.

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

person Thorbjørn Ravn Andersen    schedule 29.12.2009

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

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

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

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

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

person Huguenot    schedule 29.12.2009