java - 由多个类加载器加载的同一个类 - Intellij 插件

标签 java android intellij-idea intellij-plugin

正在开发一个插件来使用 Intellij 为 android studio 扩展新项目向导。

当我尝试调用 AndroidSdkUtils.isAndroidSdkAvailable() 时,出现 Assertion:null,粘贴了下面的错误,

null
java.lang.AssertionError
at com.intellij.openapi.projectRoots.SdkType.findInstance(SdkType.java:207)
at org.jetbrains.android.sdk.AndroidSdkType.getInstance(AndroidSdkType.java:231)
at org.jetbrains.android.sdk.AndroidSdkUtils.getAllAndroidSdks(AndroidSdkUtils.java:462)
at org.jetbrains.android.sdk.AndroidSdkUtils.getAndroidSdkPathsFromExistingPlatforms(AndroidSdkUtils.java:443)
at org.jetbrains.android.sdk.AndroidSdkUtils.tryToChooseAndroidSdk(AndroidSdkUtils.java:853)
at com.android.tools.idea.npw.ConfigureAndroidProjectPath.putSdkDependentParams(ConfigureAndroidProjectPath.java:97)
at com.android.tools.idea.npw.ConfigureAndroidProjectPath.init(ConfigureAndroidProjectPath.java:59)
at com.android.tools.idea.wizard.dynamic.DynamicWizardPath.attachToWizard(DynamicWizardPath.java:98)
at com.android.tools.idea.wizard.dynamic.DynamicWizard.addPath(DynamicWizard.java:242)
at com.android.tools.idea.npw.NewProjectWizardDynamic.addPaths(NewProjectWizardDynamic.java:84)
at tru.NewModuleWizardDynamicExtension.init(NewModuleWizardDynamicExtension.java:27)
at NewProAction.actionPerformed(NewProAction.java:30)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:182)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter$1.run(ActionMenuItem.java:311)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:958)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:124)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:281)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:109)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at com.apple.laf.ScreenMenuItemCheckbox.itemStateChanged(ScreenMenuItemCheckbox.java:193)
at java.awt.CheckboxMenuItem.processItemEvent(CheckboxMenuItem.java:389)
at java.awt.CheckboxMenuItem.processEvent(CheckboxMenuItem.java:357)
at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:351)
at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:339)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:761)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:866)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:654)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:381)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

发生这种情况是因为 findInstance 方法尝试将 AndroidSdkType.Class 与 for 循环内的 sdkType 类之一进行比较,类实际上相同,但由两个不同的加载器加载,一个来自 (org.jetbrains.android),另一个来自本地加载器 (com.sample.sample)

如何解决这个问题?

由于这个类加载器问题,我也经常遇到 classcastException。因此,当我尝试使用不同的方法来开发插件时,我对这个类加载器问题感到震惊。

最佳答案

您需要将 Android 插件的 .jar 文件添加到 IntelliJ IDEA SDK 的类路径中,而不是将它们添加为库。

关于java - 由多个类加载器加载的同一个类 - Intellij 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36305398/

相关文章:

Java GUI 不会显示我想要的提示

java - 找不到类 'android.graphics.drawable.RippleDrawable' 错误

css - 日期选择器弹出窗口

maven - 无法在 build.gradle 的发布 block 中定义任何内容

java - openfire 错误没有答案

java - 使用 "su -c"燕子运行 Android NDK 可执行文件 printf()

java - 如何轮询 FTP 位置以触发其中的更改?

java - 从 AsyncTask 返回位图

java - 使用 ThreadPoolExecutor 检查服务器端口是否打开时,Android 应用程序挂起并显示黑屏 5-6 秒

intellij-idea - WebStorm && Android Studio 设置代理失败