Есть ли что-то вроде VirtualEnv для Java?
Есть ли что-нибудь похожее на Python virtualenv для языков Java или JVM?
7 ответов
Насколько я понимаю, virtualenv позволяет вам иметь отдельные пути установки библиотек, эффективно отделяя "виртуальные" установки Python.
У Java нет концепции "общесистемной установленной" библиотеки(*): она всегда ищет путь к классам для библиотек, которые будут загружены. Поскольку classpath может быть (и должен быть!) Определен для каждого приложения, каждое приложение может выбирать, какие библиотеки и какие версии оно хочет загрузить.
Если вы спуститесь на один уровень глубже и у вас будет одно приложение, которому каким-то образом понадобятся две разные версии одной и той же библиотеки одновременно, то вы можете сделать это даже с помощью некоторой хитрости пути к классам. Это может быть сложно, но это определенно возможно (OSGi - один из примеров, где это поддерживается, даже Tomcat с двумя отдельными веб-приложениями делает это).
Я видел несколько ссылок на безопасность в описании virtualenv: в Java встроена довольно тщательная система безопасности. В серверных приложениях она часто отключается, потому что так проще настроить, но вы можете легко настроить, что именно является Java-приложением. разрешено делать
(*) Почти есть расширения или библиотеки расширений, но они не используются часто, и даже они могут быть легко загружены из произвольных каталогов.
Инструменты сборки, такие как Ant, Maven и Gradle, являются самыми близкими pip
или же easy_install
,
Понятие virtualenv сделано классным путем. Так что в Java нет реальной необходимости в virtualenv
Да (см. http://www.jenv.be/), как и многие другие языки (Ruby, Python, Go, R, Php и т. Д. И т. Д.).
Я также искал подобное решение для упрощения переключения контекста между проектами, которые используют разные версии / настройки Maven и / или Java SDK без необходимости изменения M2_HOME
а также JAVA_HOME
настройки каждый раз.
С этой целью я разработал решение, которое помогает выполнить mvn
Команды с соответствующей конфигурацией, основанной на настройках проекта (хранятся в .mvn
папка).
Смотрите: https://github.com/AlejandroRivera/maven-env
Имейте в виду, что это помогает, только если вы используете Maven для создания и / или запуска проекта.
Я знаю, что это может быть немного поздно, но в Groovy/Java есть gvm http://gvmtool.net/ который является Groovy-версией Ruby Renv.
Я бы с уважением согласился с Gautam K, luthur. Зависимость и управление версиями пакетов для проектов - это не то же самое, что изолированная автономная виртуальная среда для поддержки другого проекта.
Мои 2 цента -W
Меня смущает утверждение, что "в Java нет концепции" общесистемной установленной "библиотеки". Как бы вы назвали файлы jar в $JAVA_HOME/jre/lib и $JAVA_HOME/jre/lib/ext?
Независимо от того, нуждается ли Java в таком инструменте, как virtualenv, кажется, что то, что позволило бы вам быстро переключаться между различными средами Java (например, Java 6 с такими-то расширениями безопасности, Java 7 и т. Д.), Было бы удобно - даже если все, что он на самом деле делал под прикрытием, это манипулирование переменными env PATH, JAVA_HOME и CLASSPATH.
Maven, вы можете явно указать, какие пакеты вы будете использовать в проекте Java
Java как язык не нуждается в функциях песочницы в virtualenv, но язык JVM, такой как Jython, может иметь VirtualEnv для использования в различных средах без каких-либо конфликтов.
Это изложено в этом сообщении в блоге
Цитата:
Установите virtualenv для Jython. Просто введите "jeasy_install virtualenv". Как только это закончится, вы должны иметь инструмент virtualenv в папке bin установки Jython.
Таким образом, при использовании Jython могут использоваться разные фреймворки и пакеты без какого-либо конфликта с глобальными пакетами.