Technical debt reduction (compatibility with future JDKs)
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).
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)