【问题标题】:why a class is loaded when not in classpath?为什么不在类路径中时加载一个类?
【发布时间】:2013-02-13 20:34:39
【问题描述】:

我的应用程序由某个进程 (control-m) 启动。它从一个我可以修改的 bash 脚本开始(该脚本由另一个进程调用)。

应用程序正在使用错误版本的 spring 运行。问题是 - 我知道正在加载哪个 jar,但它不在类路径上!类路径在 bash 脚本中提供。我也通过执行验证了它:

ClassLoader cl = ClassLoader.getSystemClassLoader();
java.net.URL[] urls = ((URLClassLoader)cl).getURLs();
for(java.net.URL url: urls){
    System.out.println(url.getFile());
}

但仍有一些不应该的罐子被装入。我在命令行中有 -verbose:class 。我怎样才能找出为什么我需要的类是从无效的 jar 中加载的?为什么这些 jars 甚至被加载?如何调试类加载过程?

当我从我的用户帐户运行脚本(而不是其他进程)时,一切都很好。

【问题讨论】:

  • 环境中会不会有 CLASSPATH 环境变量之类的东西?
  • 还要确保您使用的是同一个 JVM。

标签: java jar classpath classloader


【解决方案1】:

我找到了原因。类路径上有一个 jar,其权限设置为普通用户无权访问,但 control-m 有。从我的帐户运行时,它忽略了这个 jar,一切正常。

但是,当通过 control-m 运行时,它正在加载该 jar,该 jar 在清单中还有“Class-Path”条目,并且正在改变类加载过程。

【讨论】:

    猜你喜欢
    • 2014-08-08
    • 2011-03-21
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多