用户可选的IntelliJ插件中的运行时Java依赖项

时间:2019-03-13 15:43:21

标签: java jar dependencies classloader intellij-plugin

任务

我们想为自定义语言创建IntelliJ IDEA插件。已经有一个大的(独立于IntelliJ的)项目,用Scala编写,叫做MyLang,它为自定义语言提供了解析和类型检查。

一个主要问题是我们希望插件与MyLang依赖项的特定来源脱钩,但是我们曾经或曾经被告知的所有尝试和想法都有缺点。

tl; dr:是否可以通过IntelliJ插件来实现用户可选的运行时Java依赖关系,从而实现以下目标?

目标

  1. 将插件与实际使用的MyLang依赖项源(也从版本,至少是非主要的)中解耦
  2. 能够让MyLang依赖项指向本地JAR和/或已编译的源目录。

    基本原理是让MyLang的开发人员使用该插件测试其最新更改。例如,如果一个开发人员改进了MyLang语言的类型检查,那么他可能想立即在IntelliJ中对其进行测试以获取视觉反馈。
  3. 非关键:能够为每个IntelliJ项目配置MyLang依赖性。

    插件提供了一种自定义项目类型。插件范围的设置不是完美的,但是可以接受的。
  4. 能够使用插件中MyLang中的数据结构(即类和函数)。

尝试/想法

  1. 部署具有MyLang依赖项的插件

    • ✅1、2、3
    • ❌4
    • ❌插件的大小很大。
  2. 部署没有MyLang的插件,让用户选择MyLang构建JAR并使用反射。

    • ✅1、2、3
    • ❌4,尤其是插件中的难看代码和非类型安全代码。
    • ❌只能通过反射通道传递Java或Scala标准API的基本数据结构。
  3. 针对(稳定)MyLang编译插件,无需使用部署程序即可使用classloader魔术

    1. 选项1:访问[IntelliJ的插件类加载器](https://github.com/JetBrains/intellij-community/blob/b3ce5e06d44058eb119b53ed0d4b7e2ac3e57722/platform/core-impl/src/com/intellij/ide/plugins/cl/PluginClassLoader.java ),并使用(用户提供的)JAR的URL调用addUrl
      • ✅1、2、4
      • ❌3(尽管不是很关键)
      • ❌其他缺点:addUrl被标记为已弃用,也许将来会被删除。
    2. 选项2:创建自定义parent-last-child-first classloader
      • ✅1,2,3,4(全部!)
      • ❌有了IntelliJ的类加载器并安装了新的类加载器,会使插件开发人员感到困惑,并且很容易出错!必须非常谨慎,将实例从新创建的类加载器的外部传递到其内部。例如。 IntelliJ提供的数据结构中的实例(编辑器组件,PSIFile实例,...)仅在旧的普通IntelliJ插件类加载器中有效。
        因此,几乎无法访问IntelliJ数据结构

IntelliJ论坛中有一个(未解决的)讨论,其中OP需要完全相同的设置:https://intellij-support.jetbrains.com/hc/en-us/community/posts/206121299-classloader-in-plugin

0 个答案:

没有答案