[澄清] 请原谅最初描述中缺乏明确性。请允许我重新表述这个问题。
是否存在使用 API 执行运行时编译的方法javax.tools
,可用于 OSGi(再次强调运行时),它了解包的依赖关系和安全约束?
[更新] 请看https://github.com/rotty3000/phidias
这是一个结构良好的 OSGi 包。自述文件提供了非常小的 4 类 API(8k 模块)的所有细节。
[澄清] 请原谅最初描述中缺乏明确性。请允许我重新表述这个问题。
是否存在使用 API 执行运行时编译的方法javax.tools
,可用于 OSGi(再次强调运行时),它了解包的依赖关系和安全约束?
[更新] 请看https://github.com/rotty3000/phidias
这是一个结构良好的 OSGi 包。自述文件提供了非常小的 4 类 API(8k 模块)的所有细节。
到目前为止,我发现真正的答案是“不,没有!”
当前用于 java 的主要运行时编译方案是 JSP 编译。对我有机会审查的应用服务器的调查使用以下方法之一:
javac
(通过系统调用)javax.tools
非 OSGi 感知方式使用所有这些方法都基于通过直接内省文件系统中的 jar 或类来收集可用的类路径。
当前的方法都没有意识到 OSGi 的特性,例如环境的动态特性或框架本身施加的底层限制。
为了从一组包导入和导出中获取可用于编译的包列表,您需要某种候选包的存储库,以及一个配置器来确定哪些包最好地提供哪些包。如果您使用“Require-Bundle”(不是最佳实践),您会知道捆绑包名称,但不一定知道版本,因此仍然需要一些配置。
例如,在 Eclipse PDE 中,目标平台用作编译的基本存储库。您还可以做更复杂的事情,例如使用Eclipse 的 p2 供应来供应您的目标平台,因此您可以使用外部 p2 存储库作为您的存储库,而不是自己设置一个。对于命令行构建,Tycho允许 Maven 构建使用与 Eclipse 本身使用的相同类型的机制来解析类路径。
另一种方法是将您的“类路径”列为 Maven 依赖项,并让maven 捆绑插件(基于bnd)为您生成清单。
如果您因为以编程方式编译而无法利用现有的命令行工具(从您的问题中并不能完全清楚您要解决什么问题),那么最好的办法可能是利用现有的配置技术,像 OBR、Eclipse p2 或 Apache Ace 来计算应该在类路径上进行编译的包。
当然可以,您只需要编写一个自定义 JavaFileManager,它将提供正确的类来编译 JavaCompiler。
例如,您可以编写一个从 OSGi 运行时获取其类的程序。如果您不介意将编译器捆绑包依赖于所需的库,那么这很容易,否则您也可以使用接线 api来查看其他捆绑包。(仅限 OSGi 4.3+)。如果在编译时拦截它请求的包,则可以生成 Package-Import 语句,以便生成包。
几个月前我做了一个粗略的 GitHub 示例:
https://github.com/flyaruu/test-dynamic-compiler
有一些问题(例如,我无法让 Eclipse ecj 编译器工作,我根本没有研究包安全性,并且由于 OSGi 的动态特性,您必须听取包更改以更新编译路径.),但它工作正常。
这正是我们在 bndtools 中所做的……如果我有一点时间,我会在 bnd 中添加一个编译器,这样它也可以做到这一点。