很抱歉,如果要发表很长的文章,我想让它尽可能地易于理解。 我正在尝试将一个包(我们写的,不是内置的Jar或Java)导入另一个包。我们使用Eclipse和Ant。 我们将编写的每个软件包都用作插件。
程序包资源管理器中的最小层次结构(为简便起见,没有其他程序包)如下所示:
com.glicha
Plug-in Dependecies:
- com.glicha.utils
- com.glicha.reports
com.glicha.utils
Plug-in Dependecies:
- com.glicha.reports
com.glicha.utils.args
Plug-in Dependecies:
- com.glicha.utils
com.glicha.reports
我想使用com.glicha.reports
包中的com.glicha.utils.args
。在com.glicha.utils.args
中,我有以下方法:
public boolean getData() {
return data;
}
我在getData()
方法中添加了以下行(返回之前),因此可以检查是否可以打印(我也导入了com.glicha.reports
包):
System.out.println(Reports.getInstance().getReport(ReportTypes.REPORT_NAME));
此精确命令在com.glicha
和com.glicha.utils
中使用,它们完美地工作。
然后,将以下行插入MAINFEST.MF
文件中:
Require-Bundle:
// ... more packages ...
com.glicha.reports;bundle-version="1.0.0",
同一行位于MAINFEST.MF
和com.glicha
的{{1}}文件中。
它可以编译,没有任何问题,但是当我运行我的工具时(在运行时),它变得很奇怪。当他得到我们插入的打印命令时,出现以下错误:
com.glicha.utils
从先前的线程(讨论此异常)中,他们暗示类路径中存在问题。虽然,如果它们使用相同的java.lang.NoClassDefFoundError: com/glicha/reports/Reports
at com.glicha.utils.args.Args.getData(Args.java:349)
at com.glicha.core.MainC.start(MainC.java:1137)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
Caused by: java.lang.ClassNotFoundException: com.glicha.reports
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 15 more
,我似乎无法理解它在com.glicha
和com.glicha.utils
中是如何工作的。
关于这个问题,我有三种理论:
build.xml
是com.glicha.utils.args
的所谓“子软件包”,已经导入了com.glicha.utils
软件包。奇怪的是,如果我创建了一个“包装器”方法,该方法只返回不在com.glicha.reports
中的某个类中的Reports.getInstance().getReport(ReportTypes.REPORT_NAME)
,然后将其导入到com.glicha.utils.args
中,那么它将起作用。
我应该如何调试此类问题?我们能解决什么问题?