【发布时间】:2011-09-04 15:15:35
【问题描述】:
对于 Java 或 JVM 语言有没有类似于 Python virtualenv 的东西?
【问题讨论】:
标签: java python virtualenv jvm-languages
对于 Java 或 JVM 语言有没有类似于 Python virtualenv 的东西?
【问题讨论】:
标签: java python virtualenv jvm-languages
据我了解,virtualenv 使您能够拥有单独的库安装路径,有效地分离“虚拟”Python 安装。
Java 没有“系统范围安装”库的概念(*):它总是在类路径中搜索要加载的库。由于可以(并且需要!)为每个应用程序定义类路径,因此每个应用程序都可以选择要加载的库和版本。
如果您更深入一层并且有一个应用程序同时需要同一库的两个不同版本,那么您甚至可以使用一些类路径技巧来做到这一点。它可能会变得复杂,但绝对有可能(OSGi 是支持此功能的一个示例,甚至具有两个独立 Web 应用程序的 Tomcat 也可以这样做)。
我在 virtualenv 描述中看到了一些对安全性的引用:Java 内置了一个非常彻底的安全系统。在服务器应用程序中,它经常被关闭,因为这样配置更容易,但您可以轻松配置究竟是什么Java应用程序是允许做的。
(*) 差不多,有extensions or extension libraries,但它们用得不多,甚至可以从任意目录轻松加载。
【讨论】:
Ant、Maven 和 gradle 等构建工具最接近 pip 或 easy_install。
virtualenv 的概念是由类路径完成的。所以对于 Java 来说并没有真正需要 virtualenv
【讨论】:
我知道这可能有点晚了,但是 Groovy/Java 有 gvm http://gvmtool.net/,这是 Ruby 的 renv 的 Groovy 版本。
我会恭敬地同意 Gautam K,luthur。项目的依赖和包版本管理不同于一个独立的自包含虚拟环境来维护不同的项目。
我的 2 美分 -W
【讨论】:
我对“Java 没有‘系统范围内安装’库的概念”的断言感到困惑。 $JAVA_HOME/jre/lib 和 $JAVA_HOME/jre/lib/ext 中的 jar 文件叫什么?
不管 Java 是否“需要”像 virtualenv 这样的工具,似乎它可以让您在不同的 Java 环境之间快速切换(例如,带有某某安全扩展的 Java 6、Java 7 等)会很方便 - 即使它实际上只是在操纵 PATH、JAVA_HOME 和 CLASSPATH 环境变量。
【讨论】:
jre/lib/ext 包含扩展库,我在脚注中简要提到了它们,它们确实没有被大量使用。是的,我同意在 JRE/JDK 之间快速切换有一些实用程序,并且存在一些这样的工具(例如,Debian/Ubuntu 有替代系统,它允许您切换用于不同 java 命令的 JDK(以及许多其他东西)) .
我也一直在寻找类似的解决方案,以简化使用不同 Maven 版本/设置和/或 Java SDK 的项目之间的切换上下文,而无需每次都修改 M2_HOME 和 JAVA_HOME 设置。
为此,我开发了一个解决方案,可以根据每个项目 设置(存储在.mvn 文件夹中)使用适当的配置来帮助执行mvn 命令。
见:https://github.com/AlejandroRivera/maven-env
请注意,这仅在您使用 Maven 构建和/或运行您的项目时才有帮助。
【讨论】:
是的(请参阅http://www.jenv.be/),就像许多其他语言(Ruby、Python、Go、R、Php 等)一样。
【讨论】:
Maven,您可以明确指定您将在 java 项目中使用哪些包
【讨论】:
Java 作为一种语言不需要 virtualenv 的沙盒功能,但是像 Jython 这样的 JVM 语言可以让 VirtualEnv 使用不同的环境而不会发生任何冲突。
在this blog post中有概述
引用:
为 Jython 安装 virtualenv。只需输入“jeasy_install virtualenv”。一旦完成,你应该有一个“virtualenv”工具 Jython 安装的 bin 文件夹。
因此,当使用 Jython 时,可以使用不同的框架和包,而不会与全局包发生任何冲突。
【讨论】: