Sonatype Nexus Repository 3.98.0 Released

Sonatype Nexus Repository 3.98.0 is nowavailable.

This release introduces the Nexus One UI as the default experience for all users, with streamlined navigation and system health status in the global header. It also extends the Community Edition telemetry grace period and improves Repository Firewall’s component identification and container scanning accuracy.

See the Sonatype Nexus Repository 3.98.0 Release Notes for full details.

Hi,

Upgrade to 3.98.0 failed from 3.97.x

I am running on Postgres, and migration either did not run.

2026-11-03 18:29:56,994-0600 INFO  [jetty-main-1]  *SYSTEM org.sonatype.nexus.extender.NexusLifecycleManager - Start RESTORE

2026-11-03 18:29:56,995-0600 INFO  [jetty-main-1]  *SYSTEM org.sonatype.nexus.extender.NexusLifecycleManager - Start UPGRADE

2026-11-03 18:29:57,450-0600 INFO  [jetty-main-1]  *SYSTEM com.sonatype.nexus.blobstore.gcloud.internal.migration.GoogleCloudAccountKeyMigrationStep_2_173 - Migrated 0 of 0 Google Cloud Storage account key(s) to the secrets service

2026-11-03 18:29:57,475-0600 INFO  [jetty-main-1]  *SYSTEM org.sonatype.nexus.repository.content.upgrades.AssetSoftDeleteRepeatableMigrationStep - No asset tables found, skipping trash index creation

2026-11-03 18:29:57,484-0600 INFO  [jetty-main-1]  *SYSTEM org.sonatype.nexus.repository.content.upgrades.ComponentNormalizedVersionMigrationStep - validating openvsx component table

2026-11-03 18:29:57,592-0600 INFO  [jetty-main-1]  *SYSTEM org.sonatype.nexus.repository.content.upgrades.ComponentSoftDeleteRepeatableMigrationStep - No component tables found, skipping trash index creation

2026-11-03 18:29:57,598-0600 INFO  [jetty-main-1]  *SYSTEM com.sonatype.nexus.repository.content.upgrade.CopyAssetBlobSizeMigrationStep - Starting asset blob size migration

2026-11-03 18:29:57,605-0600 INFO  [jetty-main-1]  *SYSTEM org.sonatype.nexus.repository.content.internal.ComponentNormalizationIntegrityChecker - validating normalized_version columns

2026-11-03 18:29:57,633-0600 ERROR [jetty-main-1]  *SYSTEM org.sonatype.nexus.repository.content.internal.DatabaseIntegrityCheckService - Lifecycle operation start failed

org.sonatype.nexus.datastore.api.DataAccessException:

### Error querying database.  Cause: org.postgresql.util.PSQLException: ERROR: column "deleted_on" does not exist

  Position: 260

### The error may exist in org.sonatype.nexus.repository.apt.datastore.internal.store.AptComponentDAO

### The error may involve defaultParameterMap

### The error occurred while setting parameters

### SQL: SELECT       component_id, repository_id, namespace, name, kind, version,     normalized_version, attributes, created, last_updated, entity_version     FROM apt_component      WHERE (normalized_version IS NULL             OR normalized_version = '')      AND deleted_on IS NULL             ORDER BY component_id LIMIT ?;

### Cause: org.postgresql.util.PSQLException: ERROR: column "deleted_on" does not exist

  Position: 260

        at org.sonatype.nexus.datastore.mybatis.DataAccessSqlSession.unwrapMyBatisException(DataAccessSqlSession.java:120)

        at org.sonatype.nexus.datastore.mybatis.DataAccessSqlSession.selectList(DataAccessSqlSession.java:74)

        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)

        at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)

        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)

        at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)

        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)

        at jdk.proxy2/jdk.proxy2.$Proxy350.browseUnnormalized(Unknown Source)

        at org.sonatype.nexus.repository.content.store.ComponentStore.browseUnnormalized_aroundBody10(ComponentStore.java:208)

        at org.sonatype.nexus.repository.content.store.ComponentStore$AjcClosure11.run(ComponentStore.java:1)

        at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:164)

        at org.sonatype.nexus.transaction.TransactionalWrapper.proceedWithTransaction(TransactionalWrapper.java:58)

        at org.sonatype.nexus.transaction.TransactionAspect.proceedWithTransaction(TransactionAspect.java:58)

        at org.sonatype.nexus.transaction.TransactionAspect.invoke(TransactionAspect.java:49)

        at org.sonatype.nexus.repository.content.store.ComponentStore.browseUnnormalized(ComponentStore.java:204)

        at org.sonatype.nexus.repository.content.internal.ComponentNormalizationIntegrityChecker.lambda$1(ComponentNormalizationIntegrityChecker.java:102)

        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)

        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)

        at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)

        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)

        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)

        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)

        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)

        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)

        at org.sonatype.nexus.repository.content.internal.ComponentNormalizationIntegrityChecker.checkAndRepair(ComponentNormalizationIntegrityChecker.java:104)

        at org.sonatype.nexus.repository.content.internal.DatabaseIntegrityCheckService.doStart(DatabaseIntegrityCheckService.java:52)

        at org.sonatype.nexus.common.lifecycle.LifecycleSupport.start(LifecycleSupport.java:117)

        at org.sonatype.nexus.extender.NexusLifecycleManager.startComponent(NexusLifecycleManager.java:157)

        at org.sonatype.nexus.extender.NexusLifecycleManager.to(NexusLifecycleManager.java:113)

        at org.sonatype.nexus.extender.internal.NexusServletContextListener.moveToPhase(NexusServletContextListener.java:123)

        at org.sonatype.nexus.extender.internal.NexusServletContextListener.contextInitialized(NexusServletContextListener.java:78)

        at org.eclipse.jetty.ee10.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:1622)

        at org.eclipse.jetty.ee10.servlet.ServletContextHandler.contextInitialized(ServletContextHandler.java:501)

        at org.eclipse.jetty.ee10.servlet.ServletHandler.initialize(ServletHandler.java:677)

        at org.eclipse.jetty.ee10.servlet.ServletContextHandler.startContext(ServletContextHandler.java:1356)

        at org.eclipse.jetty.ee10.webapp.WebAppContext.startWebapp(WebAppContext.java:1435)

        at org.eclipse.jetty.ee10.webapp.WebAppContext.startContext(WebAppContext.java:1394)

        at org.eclipse.jetty.ee10.servlet.ServletContextHandler.lambda$doStart$0(ServletContextHandler.java:1074)

Hi, Lenny.

I did some searching through our internal comms for an answer. I’m not part of Sonatype’s Support team, but this may solve your issue.

1. Stop Nexus.
2. Run the following SQL on the Nexus Postgres database.

ALTER TABLE repository
ADD COLUMN IF NOT EXISTS deleted_on TIMESTAMP WITH TIME ZONE NULL,
ADD COLUMN IF NOT EXISTS deleted_by VARCHAR(200) NULL;

  1. Start Nexus 3.98.0.