答案 0 :(得分:7)
每当分发应用程序以在不同环境中运行时,都要避免类路径中的冲突。在大多数情况下,您希望应用程序独立于特定于平台的配置。如果$CLASSPATH
包含对具有(无意识或无意识)相同包和类名的类的引用,则它将在您在应用程序的类路径中包含的类之前的类加载中获得优先权。这可能会导致意外的应用程序行为或潜在的安全漏洞。
答案 1 :(得分:5)
jar应该是一个带有自包含库的独立程序。如果要包含其他类路径,可能需要执行类似
的操作java -cp jar1:jar2:$CLASSPATH some.class.with.main
BalusC回答了另一个问题。
答案 2 :(得分:2)
如果您确实希望使用“-jar”启动应用程序并通过用户的$ CLASSPATH环境变量获取类,则应该能够通过让应用程序创建自己的类加载器来实现。 (你甚至可以让你的应用程序在“-jar”参数之后查找“-cp”参数。)
但是,我认为这样做是不错的主意。可执行JAR文件的要点是将应用程序与用户碰巧启动应用程序的环境的变幻莫测。
如果你想用你的应用程序类路径做hacky事情,一个更简单的方法是创建一个包装器脚本,根据你的需要组装有效的类路径,然后使用“-cp”选项启动应用程序。您甚至可以从各种JAR文件的清单中提取“类路径”并合并......
答案 3 :(得分:1)
有几个原因导致环境变量CLASSPATH被忽略(并且应该被忽略):
我在任何使用的计算机上都没有全局CLASSPATH。这不是必需的。我建议学习CLASSPATH如何工作并停止依赖环境变量。
答案 4 :(得分:1)
正确与否,我渴望-jar-cp
旗帜。这将是显而易见的,直接的,不会成为安全风险或打破目前的行为。
使用像java.util.ServiceLoader这样的API,希望在类路径中添加/删除服务是完全合理的。您不必放弃该功能,因为您在清单中使用了Main-Class
。
答案 5 :(得分:0)
在我的话中,没有足够的理由来解释这种明显的“荒谬”。从one of the bugs in the Sun bug database开始,只能推断开发人员没有考虑可以通过CLASSPATH环境变量或-cp选项指定类路径的事实。在发现问题时,发布或多或少是公开的,导致修复会导致向后兼容性问题。