在OSGi中为javax.tools.JavaCompiler生成类路径的明确方法

时间:2012-09-13 14:30:02

标签: java compiler-construction classpath osgi

[澄清]原谅初始描述中缺乏清晰度。请允许我重新说出这个问题。

是否存在使用javax.tools API执行运行时编译的方法,该API可在OSGi中使用(再次强调运行时),它理解了bundle的依赖关系和安全限制?

[更新] 请参阅https://github.com/rotty3000/phidias

这是一个结构良好的OSGi包。 自述文件提供了非常小的4类API(8k模块)的所有细节。

4 个答案:

答案 0 :(得分:0)

为了从一组包导入和导出到可用于编译的包列表,您需要某种repository个候选包和一个provisioner找出哪些捆绑包最能提供哪些包。如果您使用的是“Require-Bundle”(not a best practice),您将知道软件包名称,但不一定是版本,因此仍需要进行一些配置。

例如,在Eclipse PDE中,target platform用作编译的基本存储库。您还可以执行更复杂的操作,例如使用Eclipse's p2 provisioning来配置目标平台,这样您就可以使用外部p2存储库作为存储库而不是自己设置存储库。对于命令行构建,Tycho允许Maven构建使用与Eclipse本身使用的相同类型的机制来解析类路径。

另一种方法是将您的“类路径”列为Maven依赖项,并让maven bundle plugin(基于bnd)为您生成清单。

如果你不能利用现有的命令行工具,因为你是以编程方式编译的(你的问题并不完全清楚你要解决的是什么问题),你最好的可能是利用现有的配置技术,如OBR,Eclipse p2或Apache Ace,用于计算应该在类路径上进行编译的包。

答案 1 :(得分:0)

这正是我们在bndtools中所做的...如果我有一点时间,我会添加一个编译器,以便它也可以这样做。

答案 2 :(得分:0)

到目前为止,我发现真正的答案是“没有!”

目前针对java的主要运行时编译方案是JSP编译。我有机会审查的应用服务器的调查使用以下方法之一:

  • javac的调用(通过系统调用)
  • 使用ecj / jdt
  • 以非OSGi识别方式使用javax.tools

所有这些方法都是基于通过直接内省文件系统中的jar或类来收集可用的类路径。

目前的方法都没有意识到OSGi的特征,如环境的动态特性或框架本身所施加的潜在限制。

答案 3 :(得分:0)

当然可以,您只需要编写一个自定义JavaFileManager,它将提供正确的类来编译到JavaCompiler。

例如,您可以编写一个从OSGi运行时获取其类的程序。如果你不介意从你的编译器包到你需要的库的依赖,那么它很容易,否则你也可以使用wiring api查找其他包。 (仅限OSGi 4.3+)。如果在编译时拦截它请求的包,则可以生成Package-Import语句,以便生成包。

几个月前我做了一个粗略的GitHub示例:

https://github.com/flyaruu/test-dynamic-compiler

存在一些问题(例如,我无法让Eclipse ecj编译器工作,我根本没有考虑捆绑安全性,并且由于OSGi的动态特性,您必须监听捆绑包更改以进行更新你的编译路径。),但它工作正常。