2016-03-30 70 views
1

我正在开发一个插件,以使用Intellij扩展android studio的新项目向导。多个类加载器加载的相同类 - Intellij插件

当我尝试调用AndroidSdkUtils.isAndroidSdkAvailable()我得到断言:空,粘贴了以下错误,

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方法试图与里面的sdkType类的一个比较AndroidSdkType.Class一个for循环,类实际上是相同的,但由两个不同的加载器加载,一个来自(org.jetbrains.android)和其他来自本地加载器(com.sample.sample)

如何解决此问题?

由于这个类加载器的问题,我也经常得到classcastexception。所以,当我尝试使用不同的方式来开发插件时,我遇到了这个类加载器问题。

回答

0

是的,因为Yole说我昨天做了这个,并成功执行了插件。

本文档给出了我的问题的完美答案。认为可能对其他人有用。

http://www.jetbrains.org/intellij/sdk/docs/basics/plugin_structure/plugin_dependencies.html

为他人着想,附上其中“的android.jar”在插件SDK的类路径中添加了屏幕截图。

以下是我添加到plugin.xml文件的代码片段,其中“org.jetbrains.android”是“android.jar”插件的插件ID。

org.jetbrains.android

同时也可作为正在开发此为Android工作室,我没能在的IntelliJ IDE中运行,但能够在Android Studio中执行。

Intellij SDK classpath screenshot

0

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