有没有类似于VirtualEnv的Java工具?

54

是否有类似于Python virtualenv 的Java或JVM语言的工具?


你为什么问这个问题?(是否有其他更深层次的问题?) - Rob Audenaerde
8个回答

48
据我所知,virtualenv 可以使您拥有独立的库安装路径,从而实现分离的“虚拟” Python 安装。
Java 没有“系统范围内安装”的库的概念(*):它总是在类路径中搜索要加载的库。由于每个应用程序都可以(并且需要)定义类路径,因此每个应用程序都可以挑选和选择想要加载的库和版本。
如果您更深入地了解并且需要在同一时间使用某个应用程序中两个不同版本的同一库,则可以使用一些类路径技巧来完成。这可能会变得复杂,但肯定是可行的(OSGi 是支持该操作的一个示例,甚至 Tomcat 执行两个单独的 Web 应用程序也可以实现)。
我在 virtualenv 的描述中看到了一些安全性方面的参考:Java 内置了相当彻底的安全系统。在服务器应用程序中,它通常被关闭,因为以这种方式进行配置更加容易,但您可以轻松配置 Java 应用程序允许执行的确切操作。(*) 几乎没有,有些扩展或扩展库,但它们并不常用,即使这些库也可以从任意目录加载。

7
对于软件包来说这可能是正确的,但 Python 虚拟环境帮助管理的另一件事是 Python 本身的版本。Java 开发人员如何处理需要使用不同 Java 版本的项目? - Mike B
启动需要特定 Java 虚拟机版本的 Java 应用程序脚本,通常在 JAVA_HOME 变量中设置路径。 - greenmarker
Java的安装也依赖于一些系统库。 - Rob Audenaerde
当第三方将其Java版本注入路径时,问题就会出现,因此您的Java会得到错误的版本。 Maven、Gradle处理工件,并可以强制使用Java版本,但如果找到的第一个Java版本不正确,则会停止。目前最好的解决方案似乎是使用容器。 - MortenB

7

构建工具,例如Ant,Maven和gradle是最接近pipeasy_install的东西。

虚拟环境的概念是通过类路径来实现的。因此,在Java中没有真正需要使用虚拟环境。


5
是的(参见http://www.jenv.be/),和许多其他语言一样(Ruby、Python、Go、R、Php等等)。

3
我一直在寻找类似的解决方案,以简化在不修改M2_HOMEJAVA_HOME设置的情况下,在使用不同Maven版本/设置和/或Java SDK的项目之间切换上下文的步骤。
为此,我开发了一种解决方案,它可以根据存储在.mvn文件夹中的每个项目设置,帮助执行带有适当配置的mvn命令。
请参见:https://github.com/AlejandroRivera/maven-env 请注意,只有在使用Maven构建和/或运行项目时,这才会有所帮助。

为什么不使用Maven配置文件 - Vüsal

3

我知道可能有些晚了,但是Groovy/Java有gvm http://gvmtool.net/,这是Ruby renv的Groovy版本。

我尊重Gautam K和luthur的观点。项目的依赖和软件包版本管理与维护不同项目的隔离自包含虚拟环境并不相同。

我的两分钱 -W


2
我对“Java没有‘系统范围安装’库的概念”这个说法感到困惑。那么$JAVA_HOME/jre/lib和$JAVA_HOME/jre/lib/ext中的jar文件该怎么称呼呢?
无论Java是否“需要”像virtualenv这样的工具,似乎允许您快速切换不同的Java环境(例如带有某些安全扩展的Java 6,Java 7等)的东西都会很方便 - 即使它实际上在底层所做的只是操作PATH,JAVA_HOME和CLASSPATH env变量。

2
我认为这应该是对我的答案的评论。我之前没有看到它,所以很抱歉我的回复晚了:jre/lib/ext保存扩展库,我在脚注中简要提到过,它们确实没有被广泛使用。是的,我同意快速切换JREs/JDKs有一定的效用,并且存在一些这样的工具(例如Debian/Ubuntu拥有“alternatives”系统,允许您切换用于不同Java命令的JDK(以及许多其他事情))。 - Joachim Sauer

1
Maven可以明确指定在Java项目中使用哪些包。

1
Maven是一个构建工具,与virtualenv没有任何共同之处!这是完全不同的概念。 - Gautam
2
Maven的配置文件可以指定在特定Java项目中使用哪个版本和包,是不是? - luthur
3
OP的问题是一个经典的XY问题。他询问如何将Python解决方案转换为Java,而不是询问如何解决问题。问题应该是“如何在Java中管理依赖关系?”,正确的答案是使用Maven或其竞争对手之一。 - jiggy
@jiggy 你不知道他试图解决什么问题(因为他没有提问)。他也可能只是“好奇”。 - Rob Audenaerde

0

Java作为一种语言不需要virtualenv的沙盒功能,但像Jython这样的JVM语言可以使用VirtualEnv来使用不同的环境而不产生冲突。

这篇博客文章中有说明

引用:

为Jython安装virtualenv。只需键入“jeasy_install virtualenv”。完成后,您应该在Jython安装的bin文件夹中拥有“virtualenv”工具。

因此,在使用Jython时,可以使用不同的框架和包,而不会与全局包发生冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接