我正在使用datanucleus作为数据存储平台开发OSGi应用程序。
我的做法是将所有模型(实体/持久)类放在 api bundle 中,并将实现保留在 impl bundle 中,这是一个开发OSGi应用程序的任何人的良好实践。
这是我的项目设置/依赖项的简化版本:
捆绑" security.api"
// JDO Persistent Class
public class User {
// ... some code ommitted ....
public String getUserId();
// ... some code ommitted ....
}
捆绑" app.api"
// JDO Persistent Class
public class UserSubClass extends User {
}
// App Logic Facade (OSGi Service Intf)
public interface MyAppFacade {
// ... some code ommitted ....
public UserSubClass createUserSubClass(UserSubClass account);
// ... some code ommitted ....
}
捆绑" app.impl"
// Facade/OSGi Service Impl
public class MyAppFacadeImpl implements MyAppFacade {
// ... some code ommitted ....
public UserSubClass createUserSubClass(UserSubClass account) {
// Eclipse java editor will report:
// "The method getUserId() is undefined for the type ...."
account.getUserId();
}
// ... some code ommitted ....
}
正如您在此图片中看到的那样:
上图中的变量account
是类UserSubClass
的一个实例,它扩展了User
。所以,我希望我们可以调用方法getUserId()
,但是,我们无法做到。 Eclipse Java Editor 将报告错误:
"方法getUserId()未定义类型UserSubClass",如图所示。
更奇怪的是......似乎java编译器可以看到继承自类getUserId()
的{{1}}方法,也不是未报告为错误在 Project Explorer 中我可以编译&正常构建bundle jar文件!
我猜这可能是 Datanucleus Enhancer与Eclipse Java编辑器之间的问题,因为我的所有捆绑包都在构建时增强。
仅当 Bnd构建路径指向存储库缓存中已发布的捆绑jar时才会出现此问题,该缓存是JDO已经增强的版本。
更清楚地说,如果 Bnd Build Path 直接指向依赖bnd项目(将User
放在依赖包名称后面,例如;version=latest
& ; security.api;version=latest
),这个问题就会消失。
在项目开始时,我没有遇到这种情况,因为所有 Bnd Build Path 都直接指向bnd项目。但是,在这个时候,该项目更加扩展和发展,我们目前有50多个捆绑。因此,我们决定将所有稳定的捆绑包发布到存储库中,并让每个人都从中导入。当你重新启动Eclipse时,这有助于我们减少大量的编译时间(你不需要等待数据核增强器将所有类从低级别的稳定包增强到最高层)。
我的解决方法(这些都不起作用):
app.api;version=latest
文件中的包jar。.classpath
文件夹中分发源代码和捆绑jar。 !!!编辑!!! OSGI-OPT/src
&的已编译版本User
类UserSubClass
的反编译版本:
您可以看到它实际上包含User
方法。并且,它是 JDO Enhanced 版本,因为方法内容将方法调用委托给getUserId()
。
类dnGetuserId(this)
的反编译版本:
您可以看到它实际上延长了课程UserSubClass
。并且,它是 JDO增强版本,因为增强器会根据User
注释自动注入接口Detachable
和Persistable
。
PS。我不认为这是 JDO Enhancer 和 Java Compiler (javac)的问题,因为在增强类的反编译版本中没有任何明显的错误,并且,正如我之前提到的,我可以编译和正常构建bundle jar文件!
唯一奇怪的是:
为什么ECLIPSE JAVA编辑不能看到JDO增强的超级课程中隐藏的方法?