[ https://issues.apache.org/jira/browse/NETBEANS-2391?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16815736#comment-16815736 ]
Martin Weißhaupt commented on NETBEANS-2391: -------------------------------------------- This bug should be fixed but FYI this won't be enough to make NetBeans viable for Android development. There is a [project|https://github.com/NBANDROIDTEAM/NBANDROID-V2] that adds the missing bits but NetBeans 10 and NetBeans 11 support is currently in development. > NPE when opening Android projects > --------------------------------- > > Key: NETBEANS-2391 > URL: https://issues.apache.org/jira/browse/NETBEANS-2391 > Project: NetBeans > Issue Type: Bug > Components: projects - Gradle > Affects Versions: 11.0 > Environment: Gradle 5.3.1 > Netbeans 11.0 > com.android.tools.build:gradle:3.2.1 > Reporter: Dirk Steinmetz > Priority: Major > > Opening Android projects causes a NPE (as do some other operations on that > project later on). > *STR:* > 0. Download and install Android Studio, create any default project. > 1. Open that project in netbeans 11.0 (make sure to open the 'real' project, > usually called 'app') > *Expected:* > The project opens (albeit maybe some or all Android-specific features are > unavailable). > *Actual:* > {noformat} > java.lang.NullPointerException at > java.util.AbstractCollection.addAll(AbstractCollection.java:343) at > org.netbeans.modules.gradle.api.GradleBaseProjectBuilder.processDependencies(GradleBaseProjectBuilder.java:128) > at > org.netbeans.modules.gradle.api.GradleBaseProjectBuilder.build(GradleBaseProjectBuilder.java:75) > at > org.netbeans.modules.gradle.api.GradleBaseProjectBuilder$Extractor.extract(GradleBaseProjectBuilder.java:288) > at > org.netbeans.modules.gradle.GradleProjectCache.createGradleProject(GradleProjectCache.java:432) > at > org.netbeans.modules.gradle.GradleProjectCache.loadGradleProject(GradleProjectCache.java:257) > at > org.netbeans.modules.gradle.GradleProjectCache.access$100(GradleProjectCache.java:85)[catch] > at > org.netbeans.modules.gradle.GradleProjectCache$ProjectLoaderTask.call(GradleProjectCache.java:348) > at > org.netbeans.modules.gradle.GradleProjectCache$ProjectLoaderTask.call(GradleProjectCache.java:326) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) at > org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1418) at > org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45) > at org.openide.util.lookup.Lookups.executeWith(Lookups.java:278) at > org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2033){noformat} > *Reason / Potential partial fix:* > > [GradleBaseProjectBuilder.java:127f|https://github.com/apache/incubator-netbeans/blob/master/groovy/gradle/src/org/netbeans/modules/gradle/api/GradleBaseProjectBuilder.java#L127]: > {code:java} > Set<File> dirs = (Set<File>) info.get("sourceset_" + name + > "_output_classes"); > sourceSetOutputs.addAll(dirs); > {code} > expects a non-null "_output_classes" set for a source set, while > > [NbProjectInfoBuilder.groovy|https://github.com/apache/incubator-netbeans/blob/master/groovy/gradle/netbeans-gradle-tooling/src/main/groovy/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.groovy#L242] > has a separate path for Android projects that does not (always?) populate > that field. > In my tests just adding a null check works, although generated code and > android sources are still unavailable while editing. There is an exception > down the road when opening the "Sources" category in the project categories, > though: > {noformat} > java.lang.NullPointerException at > org.netbeans.modules.gradle.java.customizer.SourceSetPanel.<init>(SourceSetPanel.java:63) > at > org.netbeans.modules.gradle.java.customizer.SourcesPanel.<init>(SourcesPanel.java:55) > at > org.netbeans.modules.gradle.java.customizer.SourcesPanel$1.createComponent(SourcesPanel.java:74) > at > org.netbeans.modules.gradle.spi.customizer.support.FilterPanelProvider.createComponent(FilterPanelProvider.java:58) > at > org.netbeans.spi.project.ui.support.ProjectCustomizer$DelegateCategoryProvider.create(ProjectCustomizer.java:604) > at > org.netbeans.modules.project.uiapi.CustomizerPane.setCategory(CustomizerPane.java:234) > at > org.netbeans.modules.project.uiapi.CustomizerPane.access$200(CustomizerPane.java:47) > at > org.netbeans.modules.project.uiapi.CustomizerPane$CategoryChangeListener.propertyChange(CustomizerPane.java:320) > at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335) > at > java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327) > at > java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263) > at > org.netbeans.modules.project.uiapi.CategoryModel.firePropertyChange(CategoryModel.java:93) > at > org.netbeans.modules.project.uiapi.CategoryModel.setCurrentCategory(CategoryModel.java:67) > at > org.netbeans.modules.project.uiapi.CategoryView.propertyChange(CategoryView.java:158) > at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335) > at > java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327) > at > java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263) > at org.openide.explorer.ExplorerManager$2.run(ExplorerManager.java:866) > at > org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEvent(NbMutexEventProvider.java:95) > at > org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:70) > at > org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:66) > at org.openide.util.Mutex.readAccess(Mutex.java:235) at > org.openide.explorer.ExplorerManager.fireInAWT(ExplorerManager.java:863) > at > org.openide.explorer.ExplorerManager$1AtomicSetSelectedNodes.fire(ExplorerManager.java:269) > at > org.openide.explorer.ExplorerManager.setSelectedNodes(ExplorerManager.java:280) > at > org.openide.explorer.ExplorerManager$1SetExploredContextAndSelection.run(ExplorerManager.java:368) > at > org.netbeans.modules.openide.util.DefaultMutexImplementation.readAccess(DefaultMutexImplementation.java:172) > at > org.netbeans.modules.openide.util.DefaultMutexImplementation$1R.run(DefaultMutexImplementation.java:1016) > at > org.netbeans.modules.openide.util.DefaultMutexImplementation.doWrapperAccess(DefaultMutexImplementation.java:1033) > at > org.netbeans.modules.openide.util.DefaultMutexImplementation.readAccess(DefaultMutexImplementation.java:162) > at org.openide.util.Mutex.readAccess(Mutex.java:235) at > org.openide.explorer.ExplorerManager.setExploredContextAndSelection(ExplorerManager.java:395) > at > org.openide.explorer.view.BeanTreeView.selectionChanged(BeanTreeView.java:124) > at > org.openide.explorer.view.TreeView.callSelectionChanged(TreeView.java:808) > at > org.openide.explorer.view.TreeView$TreePropertyListener.run(TreeView.java:1450) > at > org.netbeans.modules.openide.util.DefaultMutexImplementation$1Exec.run(DefaultMutexImplementation.java:952) > at > org.openide.nodes.Children$ProjectManagerDeadlockDetector.execute(Children.java:1913) > at > org.netbeans.modules.openide.util.DefaultMutexImplementation.postRequest(DefaultMutexImplementation.java:958) > at > org.netbeans.modules.openide.util.DefaultMutexImplementation.postRequest(DefaultMutexImplementation.java:921) > at > org.netbeans.modules.openide.util.DefaultMutexImplementation.postReadRequest(DefaultMutexImplementation.java:287) > at org.openide.util.Mutex.postReadRequest(Mutex.java:346) at > org.openide.explorer.view.TreeView$TreePropertyListener.valueChanged(TreeView.java:1419) > at > javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:635) > at > javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1093) > at > javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:294) > at > javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:188) > at javax.swing.JTree.setSelectionPath(JTree.java:1641) at > javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2392) > at > javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3608) > at > javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressedDND(BasicTreeUI.java:3585) > at > javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3544) > at > java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280) at > java.awt.Component.processMouseEvent(Component.java:6536) at > javax.swing.JComponent.processMouseEvent(JComponent.java:3315) at > java.awt.Component.processEvent(Component.java:6304) at > java.awt.Container.processEvent(Container.java:2239) at > java.awt.Component.dispatchEventImpl(Component.java:4889) at > java.awt.Container.dispatchEventImpl(Container.java:2297) at > java.awt.Component.dispatchEvent(Component.java:4711) at > java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) at > java.awt.LightweightDispatcher.processMouseEvent(Container.java:4532) at > java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) at > java.awt.Container.dispatchEventImpl(Container.java:2283) at > java.awt.Window.dispatchEventImpl(Window.java:2746) at > java.awt.Component.dispatchEvent(Component.java:4711) at > java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) 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:74) > at > java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) > at java.awt.EventQueue$4.run(EventQueue.java:733) at > java.awt.EventQueue$4.run(EventQueue.java:731) at > java.security.AccessController.doPrivileged(Native Method) at > java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) > at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at > org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)[catch] > at > java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) > at > java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) > at > java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109) > at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190) at > java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235) at > java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233) at > java.security.AccessController.doPrivileged(Native Method) at > java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233) at > java.awt.Dialog.show(Dialog.java:1084) at > org.netbeans.core.windows.services.NbPresenter.superShow(NbPresenter.java:1060) > at > org.netbeans.core.windows.services.NbPresenter.doShow(NbPresenter.java:1110) > at > org.netbeans.core.windows.services.NbPresenter.run(NbPresenter.java:1082) > at org.netbeans.core.windows.services.NbPresenter.run(NbPresenter.java:105) > at > org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEventAccess(NbMutexEventProvider.java:115) > at > org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:75) > at > org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:71) > at org.openide.util.Mutex.readAccess(Mutex.java:193) at > org.netbeans.core.windows.services.NbPresenter.show(NbPresenter.java:1067) > at java.awt.Component.show(Component.java:1671) at > java.awt.Component.setVisible(Component.java:1623) at > java.awt.Window.setVisible(Window.java:1014) at > java.awt.Dialog.setVisible(Dialog.java:1005) at > org.netbeans.modules.gradle.customizer.GradleCustomizerProvider$1.run(GradleCustomizerProvider.java:95) > at > org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEvent(NbMutexEventProvider.java:95) > at > org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:70) > at > org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:66) > at org.openide.util.Mutex.readAccess(Mutex.java:235) at > org.netbeans.modules.gradle.customizer.GradleCustomizerProvider.showCustomizer(GradleCustomizerProvider.java:78) > at > org.netbeans.modules.gradle.customizer.GradleCustomizerProvider.showCustomizer(GradleCustomizerProvider.java:105) > at > org.netbeans.modules.project.ui.actions.CustomizeProject$1$1.run(CustomizeProject.java:135) > at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) > at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 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:74) > at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at > org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136) > at > java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) > 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) > {noformat} > If you need a pull request for the one line null check, I can provide that > (but it is probably faster if you just do it yourself). It seems to me as if > that is sufficient to resolve the major issues for people wanting to build a > cross-platform project without switching the IDE. > I tried to fix the android path using other means to stop netbeans from > detecting 'missing' android packages, but I did not find an obvious way to > get output folders for individual source sets. Maybe somebody with more > experience in gradle, groovy and/or the internals of the Android gradle > plugin can help here. It is also possible that the source panel issue is > unrelated. -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists