【问题标题】:the definitive way to generate a classpath for javax.tools.JavaCompiler in OSGi在 OSGi 中为 javax.tools.JavaCompiler 生成类路径的最终方法
【发布时间】:2012-09-06 16:19:50
【问题描述】:

[澄清] 原谅最初的描述不够清晰。请允许我重新表述问题。

是否存在使用javax.tools API 执行 runtime 编译的方法,可在 OSGi 中使用(再次强调 runtime),它了解包的依赖关系和安全约束?

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

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

【问题讨论】:

  • 那么问题是什么??
  • 如何加载已编译的类?类> myCompiledClass = bundleFileManager.getClassLoader().loadClass("org/apache/jsp/view_jsp");抛出 ClassNotFoundException

标签: java compiler-construction classpath osgi


【解决方案1】:

为了从一组包导入和导出中获得可用于编译的包列表,您需要某种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 来计算应该在类路径上进行编译的包。

【讨论】:

  • 谢谢,但是这里的假设是运行时,我的管理员在最初的问题中并不清楚。
【解决方案2】:

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

【讨论】:

  • 再次,如上所述,假设是运行时。但是,这可能是你的幸运日,因为我认为我已经解决了问题。 (请参阅我即将发布的答案。)
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 我创建了一个完全动态的实现,因此您不必手动更改类路径,甚至无需事先使用大量代码。 BundleJavaManager 负责使用连线 API 在运行时自动了解可用的内容。如果您需要或需要访问未直接安装在运行时中的类,您还可以传递传统的类路径。 (请参阅上面的 phidias 链接)
【解决方案4】:

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

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

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

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

当前的方法都没有意识到 OSGi 的特性,例如环境的动态特性或框架本身施加的底层限制。

【讨论】:

  • 因为我找不到我要找的东西,所以我实现了一个完全支持 OSGi 的原型。我将看看是否有任何基于 OSGi 的项目愿意接受贡献。
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 2011-03-26
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多