我正在尝试为 IntelliJ Idea 社区版开发一个插件,我正在创建如图所示的插件项目 创建插件项目
我使用Java来开发插件,并使用gradle作为我的构建工具,我能够成功地开发和部署插件。我使用Java Swing库来开发UI部分,现在我想使用JetBrains库,例如com.intellij。 ui.*、图标等
当我尝试使用 JB 库时,我收到 NoClassDefFoundError。
Exception in thread "main"
Exception in thread "main" java.lang.NoClassDefFoundError: com/intellij/ui/components/JBLabel
at Test.main(Test.java:8)
Caused by: java.lang.ClassNotFoundException: com.intellij.ui.components.JBLabel
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 1 more
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':Test.main()'.
> Process 'command '/home/dharun/.jdks/jbr-17.0.11/bin/java'' finished with non-zero exit value 1
我猜这是因为在运行时没有找到类或库,但我可以在编译时使用 JB 库,大多数 UI 组件都可以使用并使用它进行编码。但我在运行/执行时遇到错误。 在编译时使用JB库
我尝试为项目配置不同的 JDK 并检查了我的依赖项 当我能够在编译时使用 JetBrains 库但在运行时抛出异常时
如果我使用 main 方法执行,我可以创建 swing 库的 new JLabel() 但同样不适用于 jetbrains 库的 new JBLabel()
java swing 库在使用 main 方法执行时工作的原因是类在类加载和执行时也是可用的。 使用 main 方法执行时 jetbrains 库无法工作的原因是类不可用。
通常在开发插件时,使用 gradle 中的 runIde 任务在本地部署插件,这会创建一个新的 IDE 实例并加载该实例的插件,这会加载用于插件的所有类、库。
因此,使用 main 方法执行程序时不可用的 JetBrains 库将可用并在使用 runIde 任务时加载,该任务创建一个新的 IDE 实例,对于此实例,用于创建新 IDE 实例的所有 JetBrains UI 组件开发插件将按设计加载并可见。
总而言之,当我使用 runIde 任务时,JB 库正在工作,如果从 main 方法完成相同的操作并抛出错误