$ CLASSPATH和-cp with Java

时间:2010-08-03 22:35:07

标签: java jar classpath

  • 在此post中,使用-jar选项会忽略所有-cp和$ CLASSPATH。
  • 在此post中,使用-cp选项也会忽略$ CLASSPATH。

他们有什么好理由吗?

6 个答案:

答案 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被忽略(并且应该被忽略):

  1. 所有项目的全局CLASSPATH都毫无意义。它对于所有项目都不一样,并且您不希望将一个大型项目重新应用于所有项目。
  2. 你不能指望它被设置,所以取决于它是一个坏主意。在一台机器上运行的代码在移动时突然不起作用。您如何沟通必要的环境设置?最好不要使用它们。
  3. Java EE应用服务器都有自己的约定(例如,WEB-INF / lib中的所有JAR和WEB-INF /类中的所有.class文件都自动在Web应用程序的CLASSPATH中)。
  4. Java EE应用服务器全部忽略全局CLASSPATH。他们不指望它。
  5. Java IDE都有自己的约定来设置项目CLASSPATH。学习它们。
  6. 所有Java IDE都忽略全局CLASSPATH。他们不指望它。
  7. 我在任何使用的计算机上都没有全局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选项指定类路径的事实。在发现问题时,发布或多或少是公开的,导致修复会导致向后兼容性问题。