Имайте предвид, преводач Ява, където да се търси класове

Имайте предвид, преводач къде да намеря класове

Преводачът трябва да знае всички места, където могат да намерят класовете. Какво е това място? Directory и / или библиотека - буркан-файл. Моля, обърнете специално внимание на - този файл. С други думи, ако javaee.jar файл е в директория E: \ Java \ ИЪ \ - преводачът е необходимо пълния път до файла, а именно - E: \ Java \ ИЪ \ javaee.jar. Прости инструкции ДОСТАТЪЧНО директория!

Както вече казах, има няколко начина за определяне на източниците на преводач клас. Те са обсъдени по-долу. (Търсене класове в контейнери сървлет и сървъри за приложения, аз не се допират, е извън обхвата на тази статия за начинаещи.)

Метод 1: CLASSPATH Променливата среда

Методът е прост. СТАНЦИЯ CLASSPATH променлива среда, и то през сепаратор ( ";" да спечели, ':' за * NIX) са посочени всички пълни пътеките до файловете на библиотеката, и директории, които са класа дървета. Моля, имайте предвид, че директорията - точката, в която се намира в основата на всички събрани класове. Т.е. освен ако пакетни mypackage.test класове, събрани в директорията C: \ MyProject \ класове, е в CLASSPATH трябва да се появи е C: \ MyProject \ класове, вместо C: \ MyProject \ класове \ mypackage или C: \ MyProject \ класове \ mypackage \ тест.

Прост метод, обаче, има няколко недостатъци, за които аз не го харесват много. Първо. Добре, така че библиотеката може да се свърже. И дори след това с резервации. Виж по-долу. А какво да кажем за текущата класа? С тези, аз просто пиша? Те също трябва да бъдат свързани. Включете всички? Unreal, имам повече от 20 проекта за дърветата на гората няма да се виждат, ако във всеки случай в CLASSPATH да укажете пълния път. Бъдете роднина? Той също е различна. Честно казано, аз не съм приемливо решение намерен.

На второ място. Да кажем, че искате да се свържете библиотеки (JAR-файлове) чрез CLASSPATH. Въпрос. И колко имам? Surface диск търсене предоставя. повече от 1550! Е, част от тях на лъва - от заявленията. Но тези, които аз използвам, пряко или непряко, повече от 100 точно. Какво би станало, ако в CLASSPATH да се регистрират всички от тях? Ще има ли достатъчно памет размер, отпуснат за ОС променливите среда? И ако приложението ще направи същото?

Трето, най-неприятно. Стоя Log4j версии 1.2.8 и 1.3.0, скорост 1.2, 1.3 и 1.4, хибернация 2.1 и 3.0, Servlet 2.2, 2.3, 2.4 и JSP 1.1, 1.2 и 2.0, JDBC-MySQL три различни варианта, безброй XML- парсъри и т.н. и т.н. В някои проекти, аз използвам тази, в друга - от друга. Ако мога да включва всички от тях в CLASSPATH - съставител винаги ще използва първия клас по реда на обявата библиотеки. Коя версия? Не знам. Но така или иначе - едни и същи. И имам нужда от по-различно. И ако първите две точки може да се по някакъв начин да оцелеят, а след това - не.

Защото - Никога не съм се инсталира на променливата CLASSPATH среда. Особено, защото има.

Метод 2: Индикация ключ -classpath преводач (съставител)

Този метод, по мое мнение, най-добрият. Мога да посочите точния преводач библиотеката, която ми трябва. И точно на изходния код, на който трябва да изпълни този код. Нито повече, нито по-малко.

Пример. Да кажем, че имам една директория в проект в поддиректории класове директория, която съдържа събрани класове, както и либералните поддиректория, които са скорост-1.4.jar и Log4j-1.2.8.jar библиотека. След това в командния ред да тече ми клас ru.skipy.myproject.Main ще изглежда така:

Java -classpath ./classes;./lib/velocity-1.4.jar;./lib/log4j-1.2.8.jar ru.skipy.myproject.Main

Точка по точка: - ( '.' Текущата директория) Посочвам интерпретатора, че трябва да се търси в класа, в ./classes директория в ./lib/velocity-1.4.jar ./lib/log4j-1.2.8.jar библиотека и библиотека , в посочения ред.

Ако не е нужно да използвате външен библиотека, в командния ред се превръща в следното:

Java -classpath ./classes ru.skipy.myproject.Main

Обърнете внимание на -classpath ./classes. Аз не знам къде някои книги идват от Java ru.skipy.myproject.Main дизайн, без да се уточнява CLASSPATH. Аз не съм мързелив, си е поставил jdk1.1.8, но дори и там е необходимо да се уточни CLASSPATH. Това е липса на интерпретатора в параметъра CLASSPATH е източник на много проблеми. Но повече за това по-долу.

За да бъдем честни, за да говорим за трети път да се свърже библиотеки:

3. Директорията метод / Lib / вътр

Методът е може би най-лесният. Но трябва да призная, че е подходящо само за свързване на JAR-файлове. Файлът се намира в посочената директория. Всичко. Когато стартирате виртуална машина библиотека е свързан.

Недостатъкът е очевидно. Имам в системата, например, разходи за 6 виртуални машини, без да броим тези, които влязоха заедно с приложения: 1.1.8 (за които този метод не работи), 1.3.1, 1.4.2, 1.5.0, 1.4 JRockIt 0.2, JRockIt 1.5.0. Библиотеката ще трябва да постави всеки. Въпрос. Защо?

Разбира се, този метод има и достойнство. Добре е, когато имате нужда от нещо да се сложи на машината на клиента, където има само един JRE (и какво ако има такива). Има и малки разлики по отношение на безопасността (за допустимите дейности) между кода са били изтеглени през CLASSPATH и кода изтеглен от / Lib / вътр. Но това е тънкостите, които излизат извън обхвата на тази статия.

А какво ще стане, ако не укажете след CLASSPATH, или като променлива на средата или като параметър на преводача? И всичко ще известен бъг. Въпросът за това какво е, изглежда, най-малко веднъж седмично. Това между другото, ме накара да напиша тази статия. Това се нарича грешка.

Изключение в дискусия "основната" java.lang.NoClassDefFoundError.

Вместо ". "Написано име на класа, която е виртуална машина не може да бъде намерен. Тази грешка означава, че дефиницията на класа е намерен. Съгласно дефиницията на виртуална машина клас разбира своята байткод. Т.е. тя просто не може да намери файла.

Понякога има по-сложен вариант на тази грешка. Да предположим, че този клас, който искате да стартирате, наречена test.Test. Един от класическите видове действия: да се състави клас, а след това стигна до директорията, в която се намира точно Test.class и да го стартирате от там:

@rem файлови ./test/Test.class създадени

Java -classpath. тест

Грешката в този случай ще бъде:

Изключение в дискусия "основната" java.lang.NoClassDefFoundError: Test (грешно име: тест / тест)

в java.lang.ClassLoader.defineClass0 (природна метод)

в java.security.AccessController.doPrivileged (природна метод)

Какво означава това? И тук е мястото. Виртуалната машина е намерил клас, че аз се опитвам да тече - тест. Откри го само защото казах - за да изглежда в този клас директория с име Test. Моля, обърнете внимание на - пълният тест име. Машината го намерили. Но този клас е всъщност - test.Test. Това е, което казва тя - грешно име: тест / тест

Друга грешка, която причинява от появата на Изключение в дискусия "основната" java.lang.NoClassDefFoundError: името на класа, когато започнете да пишете заедно с разширение .class файл. Естествено виртуалната машина не може да намери този клас, защото продължение на упоменатата част от името, атрибути за .class името и започва да търси файл с име, завършващо в class.class

За напреднали разработчици на съществуващ член на друг начин за получаване java.lang.NoClassDefFoundError. е както следва: приложение, което използва трета страна библиотека, отидете на JAR-файла и стартирайте командния Java -jar на <имя jar-файла>, и след това да има тази грешка. Това се случва поради следната причина: когато стартирате приложението по този начин, като основната -jar преводача на CLASSPATH е включен един файл - този, който е посочен от командния ред. Всички други библиотеки - описанието на променливата CLASSPATH, чрез определена ключова -classpath - те се игнорират. Единственият начин да се избегне това (и го намерили - защото това е изумително факт - отново в документацията) - за да посочите файл MANIFEST.MF атрибут Клас-Path - списък относителните пътища (обърнете специално внимание на - роднина, в сравнение с тази bibliotki) до необходимата библиотеки. Тези пътища са разделени с интервали. Разбира се, работата и обичайния вариант - да определя изрично CLASSPATH, включително до всички библиотеки и изпълнимия името на класа.

Друг тип грешка - съставяне на съобщението "Не може да се символ". Във връзка с точката в кода си, когато променливата е декларирана, или по-скоро, от типа на променливата. Причината е същата - компилаторът не може да намери класа, посочена като вида на тази променлива, поради липсата на този клас в CLASSPATH.

Може би все още има някои типични грешки, свързани с CLASSPATH. Ако си спомняте - аз ще направя още.