Извините, если это будет длинный пост, я хочу сделать его максимально понятным.Я пытаюсь импортировать пакет (мы написали, а не встроенный 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
, так и 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
.У меня есть три теории об этой проблеме:
- Это некоторая проблема конфигурации в Eclipse или в Ant (поэтому у нас есть проблема с classpath).
- Мы получаем схему при импорте.
- Пакет
com.glicha.utils.args
является так называемым «подпакетом» com.glicha.utils
, который уже импортирует пакет com.glicha.reports
.
Странная часть заключается в том, что если ясоздайте метод-обёртку, который просто возвращает Reports.getInstance().getReport(ReportTypes.REPORT_NAME)
в некотором классе, не входящем в com.glicha.utils.args
, и импортируйте его в com.glicha.utils.args
, чем он работает.Как мне отладить такую проблему?В чем может быть проблема?