netbeans icon indicating copy to clipboard operation
netbeans copied to clipboard

Technical debt reduction (compatibility with future JDKs)

Open mbien opened this issue 10 months ago • 1 comments

open-ended meta issue for JDK compatibility problems of the netbeans codebase

see sub-issues for details

easy way to get a list of for-removal deprecated calls is to start NB with JFR enabled (put into conf so that userdir can be resolved):

-J-XX:StartFlightRecording:filename=${netbeans_default_userdir}/var/nb.jfr,settings=default.jfc,dumponexit=true

then list with:

jfr print --events jdk.DeprecatedInvocation nb.jfr

(or open in tools like VisualVM, Mission Control etc)

unfortunately the stored stack is limited to displaying only the first non-jdk frame https://bugs.openjdk.org/browse/JDK-8211238

The event will have a stack trace but will be truncated to the immediate caller. Take note JMC, as the existing heuristics about reporting truncated stack traces will need to be updated.

which can make finding the usage a bit more difficult

The most obvious method would have been to grep the build log with

ant -Djavac.add.compilerargs="-Xmaxwarns 10000 -Xlint:deprecation -Xlint:removal"

which is possible since https://github.com/apache/netbeans/pull/8796, but for that we have too many modules still which haven't been moved to the javac release flag yet (https://github.com/apache/netbeans/issues/8813).

mbien avatar Feb 18 '25 20:02 mbien

this is the list of deprecated calls during netbeans startup using a dev build based on master (before NB 26 branch)

java '/home/mbien/NetBeansProjects/JFRLog/cli/src/main/java/dev/mbien/jfrlog/cli/JFRPrint.java' "*" jdk.DeprecatedInvocation "{method.type.name}#{method.name} {stackTrace}" nb.jfr | sort -u
java/lang/Boolean#<init>     org.eclipse.core.internal.registry.ExtensionsParser.initializeExtractNamespace(Line:699)
java/lang/Boolean#<init>     org.openide.util.WeakSet.<clinit>(Line:60)
java/lang/Character#<init>     org.netbeans.lib.editor.codetemplates.CodeTemplateManagerOperation.getExpandKeyStrokeText(Line:455)
java/lang/Integer#<init>     org.eclipse.core.internal.registry.CombinedEventDelta.rememberExtensionPoint(Line:105)
java/lang/Integer#<init>     org.eclipse.core.internal.registry.ExtensionsParser.startDocument(Line:591)
java/lang/Integer#<init>     org.eclipse.core.internal.registry.RegistryObjectManager.getAssociatedObjects(Line:663)
java/lang/Integer#<init>     org.eclipse.core.runtime.internal.adaptor.EclipseLogHook.registerPerformanceLog(Line:143)
java/lang/Integer#<init>     org.eclipse.osgi.framework.internal.core.SystemBundleActivator.register(Line:105)
java/lang/Integer#<init>     org.eclipse.osgi.framework.internal.reliablefile.ReliableFile.getFileGenerations(Line:203)
java/lang/Integer#<init>     org.eclipse.osgi.internal.baseadaptor.AdaptorUtil.register(Line:181)
java/lang/Integer#<init>     org.eclipse.osgi.internal.resolver.ComputeNodeOrder$Digraph.DFS(Line:365)
java/lang/Integer#<init>     org.eclipse.osgi.internal.resolver.ExportPackageDescriptionImpl.<clinit>(Line:23)
java/lang/Integer#<init>     org.eclipse.osgi.internal.resolver.ExportPackageDescriptionImpl.getDirective(Line:136)
java/lang/Integer#<init>     org.eclipse.osgi.internal.resolver.ExportPackageDescriptionImpl.getDirectives(Line:64)
java/lang/Integer#<init>     org.eclipse.osgi.internal.resolver.StateImpl.addSystemExports(Line:844)
java/lang/Integer#<init>     org.eclipse.osgi.internal.resolver.StateWriter.addToObjectTable(Line:38)
java/lang/Integer#<init>     org.eclipse.osgi.internal.signedcontent.SignedBundleHook.frameworkStart(Line:96)
java/lang/Integer#<init>     org.netbeans.core.multiview.MultiViewPeer.initComponents(Line:220)
java/lang/Integer#<init>     org.netbeans.modules.classfile.CPIntegerInfo.<init>(Line:35)
java/lang/Integer#<init>     org.netbeans.modules.masterfs.filebasedfs.children.ChildrenCache.<clinit>(Line:29)
java/lang/Integer#<init>     org.netbeans.modules.masterfs.filebasedfs.fileobjects.FileObjectFactory.initRealExists(Line:247)
java/lang/Integer#<init>     org.netbeans.modules.openide.filesystems.declmime.DefaultParser.parse(Line:107)
java/lang/Integer#<init>     org.netbeans.modules.openide.text.Installer.add(Line:46)
java/lang/Integer#<init>     org.netbeans.modules.quicksearch.QuickSearchPopup.updatePopup(Line:387)
java/lang/Integer#<init>     org.netbeans.swing.plaf.AllLFCustoms.createGuaranteedKeysAndValues(Line:87)
java/lang/Integer#<init>     org.netbeans.swing.tabcontrol.event.ArrayDiff.getDeletedIndices(Line:109)
java/lang/Integer#<init>     org.netbeans.swing.tabcontrol.plaf.DefaultTabSelectionModel.indicesChanged(Line:204)
java/lang/Integer#<init>     org.netbeans.swing.tabcontrol.plaf.TabState.isAlarmTab(Line:425)
java/lang/Integer#<init>     org.netbeans.swing.tabcontrol.plaf.TabState.removeAlarmTab(Line:468)
java/lang/Integer#<init>     org.netbeans.swing.tabcontrol.TabbedContainer.<init>(Line:368)
java/lang/Integer#<init>     org.openide.awt.Toolbar$Folder.createInstance(Line:453)
java/lang/Integer#<init>     org.openide.NotifyDescriptor.<clinit>(Line:137)
java/lang/Integer#<init>     org.openide.text.CloneableEditor.writeExternal(Line:544)
java/lang/Integer#<init>     org.openide.util.RE13.placeString(Line:203)
java/lang/Integer#<init>     org.openide.util.SharedClassObject.createInstancePrivileged(Line:629)
java/lang/Integer#<init>     org.openide.util.SharedClassObject.createInstancePrivileged(Line:641)
java/lang/Integer#<init>     org.openide.WizardDescriptor.updateButtonAccessibleDescription(Line:1402)
java/lang/Long#<init>     org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(Line:117)
java/lang/Long#<init>     org.eclipse.osgi.framework.internal.core.AbstractBundle.getKey(Line:1345)
java/lang/Long#<init>     org.eclipse.osgi.framework.internal.core.BundleRepository.getBundle(Line:61)
java/lang/Long#<init>     org.eclipse.osgi.internal.module.ResolverBundle.<init>(Line:53)
java/lang/Long#<init>     org.eclipse.osgi.internal.resolver.BundleDescriptionImpl.getKey(Line:503)
java/lang/Long#<init>     org.eclipse.osgi.internal.resolver.StateImpl.getBundle(Line:236)
java/lang/Long#<init>     org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.createProperties(Line:297)
java/lang/Object#finalize     org.apache.http.impl.conn.PoolingHttpClientConnectionManager.finalize(Line:209)
java/lang/SecurityManager#getClassContext     org.eclipse.core.runtime.internal.adaptor.ContextFinder$Finder.getClassContext(Line:23)
java/lang/SecurityManager#getClassContext     org.eclipse.osgi.internal.loader.BundleLoader$ClassContext.getClassContext(Line:1253)
java/lang/SecurityManager#<init>     org.eclipse.core.runtime.internal.adaptor.ContextFinder$Finder.<init>(Line:21)
java/lang/SecurityManager#<init>     org.eclipse.osgi.framework.internal.protocol.MultiplexingFactory$InternalSecurityManager.<init>(Line:34)
java/lang/SecurityManager#<init>     org.eclipse.osgi.internal.loader.BundleLoader$ClassContext.<init>(Line:1250)
java/lang/SecurityManager#<init>     org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.<init>(Line:65)
java/lang/System#getSecurityManager     jdk.internal.jrtfs.JrtFileSystemProvider.checkPermission(Line:71)
java/lang/System#getSecurityManager     jdk.internal.jrtfs.JrtFileSystemProvider.checkPermission(Line:72)
java/lang/System#getSecurityManager     org.eclipse.core.runtime.internal.adaptor.ContextFinder.findClassLoaders(Line:89)
java/lang/System#getSecurityManager     org.eclipse.core.runtime.internal.adaptor.EclipseStorageHook.getGeneratedManifest(Line:396)
java/lang/System#getSecurityManager     org.eclipse.equinox.internal.app.Activator.getLocation(Line:189)
java/lang/System#getSecurityManager     org.eclipse.equinox.log.internal.ExtendedLogReaderServiceFactory.isLoggable(Line:108)
java/lang/System#getSecurityManager     org.eclipse.equinox.log.internal.ExtendedLogServiceFactory.checkLogPermission(Line:69)
java/lang/System#getSecurityManager     org.eclipse.osgi.baseadaptor.BaseData.getEntry(Line:104)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.AbstractBundle.checkAdaptPermission(Line:1514)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.BundleContextImpl.getProperty(Line:106)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.BundleFragment.load(Line:50)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.BundleHost.load(Line:63)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.EquinoxLauncher.checkAdminPermission(Line:256)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.Framework.checkAdminPermission(Line:1292)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.FrameworkProperties.getProperty(Line:49)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Line:1511)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.internal.core.InternalSystemBundle.load(Line:119)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.util.SecureAction.exists(Line:245)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.util.SecureAction.getProperty(Line:72)
java/lang/System#getSecurityManager     org.eclipse.osgi.framework.util.SecureAction.getZipFile(Line:311)
java/lang/System#getSecurityManager     org.eclipse.osgi.internal.baseadaptor.StateManager.initializeSystemState(Line:182)
java/lang/System#getSecurityManager     org.eclipse.osgi.internal.baseadaptor.weaving.WovenClassImpl.callHooks(Line:177)
java/lang/System#getSecurityManager     org.eclipse.osgi.internal.loader.BundleLoader.getClassLoader(Line:564)
java/lang/System#getSecurityManager     org.eclipse.osgi.internal.loader.BundleLoader.getParentPrivileged(Line:1240)
java/lang/System#getSecurityManager     org.eclipse.osgi.internal.loader.BundleLoaderProxy.getBundleLoader(Line:59)
java/lang/System#getSecurityManager     org.eclipse.osgi.internal.resolver.BundleDescriptionImpl$DescriptionWiring.getClassLoader(Line:1224)
java/lang/System#getSecurityManager     org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.notifyListenerHooks(Line:1323)
java/lang/System#getSecurityManager     org.eclipse.osgi.launch.Equinox.createImpl(Line:50)
java/lang/System#getSecurityManager     org.eclipse.osgi.launch.Equinox.<init>(Line:40)
java/lang/System#getSecurityManager     org.eclipse.osgi.util.NLS.initializeMessages(Line:143)
java/lang/ThreadGroup#checkAccess     org.openide.util.RequestProcessor$Processor.checkAccess(Line:1906)
java/security/AccessController#doPrivileged     com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.<clinit>(Line:1360)
java/security/AccessController#doPrivileged     com.google.inject.internal.aop.UnsafeClassDefiner.tryPrivileged(Line:130)
java/security/AccessController#doPrivileged     com.google.inject.internal.InternalFlags.getSystemOption(Line:189)
java/security/AccessController#doPrivileged     jdk.internal.jimage.BasicImageReader.isSystemProperty(Line:54)
java/security/AccessController#doPrivileged     jdk.internal.jimage.BasicImageReader.isSystemProperty(Line:55)
java/security/AccessController#doPrivileged     jdk.internal.jrtfs.SystemImage.<clinit>(Line:91)
java/security/AccessController#doPrivileged     jdk.internal.jrtfs.SystemImage.<clinit>(Line:92)
java/security/AccessController#doPrivileged     org.apache.commons.logging.impl.LogFactoryImpl.getSystemProperty(Line:211)
java/security/AccessController#doPrivileged     org.apache.commons.logging.LogFactory.getSystemProperty(Line:1098)
java/security/AccessController#doPrivileged     org.eclipse.core.runtime.internal.adaptor.ContextFinder.<clinit>(Line:33)
java/security/AccessController#doPrivileged     org.eclipse.core.runtime.internal.adaptor.EclipseLogWriter.<clinit>(Line:68)
java/security/AccessController#doPrivileged     org.eclipse.equinox.internal.app.EclipseAppContainer.createAppDescriptor(Line:188)
java/security/AccessController#doPrivileged     org.eclipse.osgi.baseadaptor.bundlefile.BundleFile.<clinit>(Line:36)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.debug.EclipseDebugTrace.<clinit>(Line:67)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.eventmgr.EventManager.getEventThread(Line:195)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.internal.core.AbstractBundle.setStatus(Line:488)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(Line:702)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.internal.core.FilterImpl.setAccessible(Line:1188)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.internal.core.Framework.<clinit>(Line:124)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.internal.core.Framework.installWorker(Line:912)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.internal.protocol.StreamHandlerFactory.<clinit>(Line:34)
java/security/AccessController#doPrivileged     org.eclipse.osgi.framework.util.SecureAction.<clinit>(Line:33)
java/security/AccessController#doPrivileged     org.eclipse.osgi.internal.baseadaptor.BaseStorage.<clinit>(Line:55)
java/security/AccessController#doPrivileged     org.eclipse.osgi.internal.loader.BundleLoader.<clinit>(Line:49)
java/security/AccessController#doPrivileged     org.eclipse.osgi.internal.loader.BundleLoaderProxy.<clinit>(Line:36)
java/security/AccessController#doPrivileged     org.eclipse.osgi.internal.module.ResolverImpl.<clinit>(Line:58)
java/security/AccessController#doPrivileged     org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.checkServiceClass(Line:1061)
java/security/AccessController#doPrivileged     org.eclipse.osgi.internal.serviceregistry.ServiceUse.getService(Line:139)
java/security/AccessController#doPrivileged     org.eclipse.osgi.storagemanager.StorageManager.<clinit>(Line:89)
java/security/AccessController#doPrivileged     org.eclipse.osgi.util.NLS.<clinit>(Line:60)
java/security/AccessController#doPrivileged     org.eclipse.sisu.bean.BeanPropertyField.set(Line:69)
java/security/AccessController#doPrivileged     org.eclipse.sisu.bean.BeanPropertySetter.set(Line:73)
java/security/AccessController#doPrivileged     org.eclipse.sisu.space.CloningClassSpace.<init>(Line:48)
java/security/AccessController#doPrivileged     org.eclipse.sisu.space.QualifiedTypeBinder.newInstance(Line:324)
java/security/AccessController#doPrivileged     org.netbeans.libs.git.jgit.commands.GitCommand.execute(Line:53)
java/security/AccessController#doPrivileged     org.openide.filesystems.NbfsUtil.getURL(Line:64)
java/security/AccessController#doPrivileged     org.openide.util.RequestProcessor$TopLevelThreadGroup.getTopLevelThreadGroup(Line:1056)
java/security/AccessController#doPrivileged     org.openide.util.SharedClassObject.findObject(Line:507)
java/security/AccessController#doPrivileged     org.openide.xml.XMLUtil.write(Line:392)
java/security/AccessController#doPrivileged     org.slf4j.impl.SimpleLoggerConfiguration.loadProperties(Line:109)
java/security/AccessController#getContext     org.eclipse.osgi.framework.internal.core.Framework.installBundle(Line:847)
java/security/AccessController#getContext     org.eclipse.osgi.framework.util.SecureAction.<init>(Line:46)
sun/misc/Unsafe#addressSize     org.apache.lucene.util.Constants.<clinit>(Line:79)
sun/misc/Unsafe#arrayBaseOffset     org.apache.lucene.util.RamUsageEstimator.<clinit>(Line:210)
sun/misc/Unsafe#arrayIndexScale     org.apache.lucene.util.RamUsageEstimator.<clinit>(Line:171)
sun/misc/Unsafe#compareAndSwapObject     com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.casValue(Line:1430)
sun/misc/Unsafe#getAndSetObject     com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.gasListeners(Line:1418)
sun/misc/Unsafe#getAndSetObject     com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.gasWaiters(Line:1424)
sun/misc/Unsafe#getObject     com.google.inject.internal.aop.HiddenClassDefiner.define(Line:62)
sun/misc/Unsafe#objectFieldOffset     com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.<clinit>(Line:1381)
sun/misc/Unsafe#objectFieldOffset     org.apache.lucene.util.RamUsageEstimator.<clinit>(Line:191)
sun/misc/Unsafe#staticFieldBase     com.google.inject.internal.aop.HiddenClassDefiner.<clinit>(Line:46)
sun/misc/Unsafe#staticFieldOffset     com.google.inject.internal.aop.HiddenClassDefiner.<clinit>(Line:48)

mbien avatar Apr 02 '25 01:04 mbien