这是为了避免在将应用程序分发到不同环境中运行时出现类路径冲突。在大多数情况下,您希望应用程序独立于特定平台的配置。如果$CLASSPATH
包含对具有相同包和类名的类的引用(无论是无意识还是有意识的),它将在类加载之前优先于您在应用程序类路径中包含的类。这可能导致意外的应用程序行为或潜在的安全漏洞。
jar应该是一个独立的程序,具有自包含的库。如果您想包含其他类路径,您可能需要执行以下操作:
java -cp jar1:jar2:$CLASSPATH some.class.with.main
BalusC回答了另一个问题。
有几个原因说明为什么环境变量CLASSPATH被(并且应该被)忽略:
我在任何我使用的机器上都没有全局CLASSPATH。这是不必要的。我建议学习CLASSPATH的工作原理,停止依赖环境变量。
无论对错,我都渴望一个-jar-cp
标志。这将足够明显和直接,不会成为安全风险或破坏当前行为。
有了像java.util.ServiceLoader这样的API,希望从类路径中添加/删除服务是完全合理的。您不应该因为在清单中使用了Main-Class
而失去该功能。
没有足够合理的理由来解释这个明显的“荒谬”,用我的话来说。从Sun bug数据库中的一个漏洞中,我们只能推断出开发人员没有考虑到类路径可以通过CLASSPATH环境变量或-cp选项指定。当问题被发现时,发布已经是公开的了,修复将会导致向后兼容性问题。