在它确实存在时找不到主类

时间:2014-12-13 10:12:31

标签: java classpath bnd

我遇到了运行bnd启动器的问题。在使用gradle构建期间出现了实际问题,但是当我直接调用jar时它也不起作用。 Launcher类确实存在于那个jar中,它确实有一个main方法。有谁知道我为什么会收到这个错误?

$ java -cp cnf/cache/biz.aQute.launcher/biz.aQute.launcher-1.4.0.jar aQute.launcher.Launcher
Error: Could not find or load main class aQute.launcher.Launcher

当我读到jar的内容时,我可以看到Launcher类确实存在。

$ jar tvf cnf/cache/biz.aQute.launcher/biz.aQute.launcher-1.4.0.jar
  1490 Fri Sep 26 06:49:00 CEST 2014 META-INF/MANIFEST.MF
       ...
  1586 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$1.class
  2270 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$2.class
   794 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$3.class
  1133 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$4.class
  1100 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$5.class
  1260 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$AllPermissionCollection.class
  1149 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$AllPolicy.class
 37566 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher.class
       ...

我还尝试从另一个随机jar加载另一个随机类,这确实有效。只有当缺少main方法时,才会出现不同的错误(类中没有找到Main方法)。

此外,所有这些文件的权利都相同,否则我也无法运行'jar tvf'。

那么,有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。似乎我错过了依赖,但它是一个OSGi框架。当我将felix框架添加到类路径时,它确实启动了。显然,Launcher类实现了OSGi框架的接口,当它无法找到这个类时,它根本不会加载该类。这可能是对java运行时的改进(主要是详细输出可能会提到这个问题)。

现在的问题是为什么bnd尝试用框架启动启动器,但这是我向他们提出的问题。