Переменная среды CLASSPATH <> CLASSPATH Clojure.Зачем? - PullRequest
6 голосов
/ 04 сентября 2010

Здесь я проверяю переменную среды CLASSPATH
daniel @ daniel-laptop: ~ / ps / clojure / projects / ring-tutorial $ echo $ CLASSPATH
/ Главная / Даниель / пс / Clojure / проекты / кольцо учебник / ЦСИ

Здесь я проверяю, что думает ява.
daniel @ daniel-laptop: ~ / ps / clojure / projects / ring-tutorial $ lein repl
Clojure 1.1.0 user => (System / getProperty "java.class.path")
«SRC /: классы /: / Главная / Даниель / .m2 / хранилище / Leiningen / Leiningen / 1.1.0 / Leiningen-1.1.0-standalone.jar: Библиотека / Clojure-1.1.0.jar: Библиотека / сервлет-апи -2.5-6.1.14.jar: Библиотека / Обще-IO-1.4.jar: Библиотека / CLJ-StackTrace-0.1.0.jar: Библиотека / Clojure-вно-1.1.0.jar: Библиотека / кольцо-Devel-0,2 .0.jar: Библиотека / причал-Util-6.1.14.jar: Библиотека / CLJ-HTML-0.1.0.jar: Библиотека / кольцо-причал-адаптер-0.2.0.jar: Библиотека / причал-6.1.14 .jar: Библиотека / кольцо-ядро-0.2.0.jar: Библиотека / Обще-FileUpload-1.2.1.jar: Библиотека / кольцо-сервлет-0.2.0.jar: Библиотека / Обще-кодек-1.4.jar:»

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

Ответы [ 3 ]

9 голосов
/ 04 сентября 2010

$CLASSPATH действительно совершенно не имеет значения здесь. Это то, что java -the-JVM-launcher-program будет использовать, если в командной строке ему не будет предоставлена ​​информация о пути к классам; Leiningen предоставляет JVM classpath, соответствующий любому проекту, над которым вы работаете.

В данном конкретном случае "/home/.../ring-tutorial/src" не будет очень полезным путем к классу для урока Ring, поскольку он включает только исходный код урока Ring и не включает в себя jar Clojure (который необходим для запуска кода Clojure), Ring jars (Ring - это многомодульный проект) или любой другой jars зависит от Ring. Путь к классам, создаваемый Leiningen, может показаться довольно длинным, но все его компоненты действительно должны быть там.

Между прочим, если вы только начинаете с Clojure, я бы порекомендовал вам по возможности использовать средства управления classpath вашей инструментальной цепочки (это может означать Emacs + lein swank или некоторый IDE + плагин Clojure), если это вообще возможно. В противном случае, здесь много вопросов о проблемах пути к классу Clojure в SO, а также множество других ресурсов по теме, по которой вы можете поискать в Google ... но теперь эта поддержка инструментов довольно надежна, и вам обычно не нужно прикоснуться к classpath вручную, это просто боль, которую лучше всего избегать в начале.

2 голосов
/ 04 сентября 2010

Проблема с использованием переменной CLASSPATH для управления вашими зависимостями заключается в том, что все Java и другие языки JVM должны манипулировать ею в своих целях. Это не займет много времени, прежде чем вы нарисовали себя в углу.

Это работает, когда вы запускаете сервер, который запускает только сервер. Он полностью выходит из строя на компьютере разработчика Java, у которого есть десятки программ и проектов, нуждающихся в различных зависимостях, и затем он тратит больше времени на отладку сценариев bash для управления переменной CLASSPATH, которая пишет исходный код.

Следовательно, этот способ управления classpath стал неиспользуемым, предпочитая другие методы загрузки классов, или при использовании CLASSPATH, только используя его очень локально.

0 голосов
/ 04 сентября 2010

Путь к классу Clojure - это путь к классу Java.

$CLASSPATH игнорируется, когда исполняемый файл java вызывается с аргументом -cp, что делает Leiningen (и большинство других скриптов сборки Clojure).

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

...