Skip to content

Fix NPE: SqliteDatabase.dataDirectory null on Velocity startup (Guice 6 javax.inject incompatibility) - #2

Merged
SrBedrock merged 3 commits into
updatefrom
copilot/fix-npe-data-directory-null
Mar 24, 2026
Merged

Fix NPE: SqliteDatabase.dataDirectory null on Velocity startup (Guice 6 javax.inject incompatibility)#2
SrBedrock merged 3 commits into
updatefrom
copilot/fix-npe-data-directory-null

Conversation

Copilot AI commented Mar 24, 2026

Copy link
Copy Markdown

Guice 6.0.0 migrated from javax.inject to jakarta.inject, making javax.inject an optional dependency. On Velocity 3.5.0+ (which ships Guice 6 without javax.inject on the classpath), Guice silently skips field injection for @javax.inject.Inject-annotated fields — leaving SqliteDatabase.dataDirectory as null and causing an NPE when load() calls dataDirectory.resolve("linked-players.db").

Changes

  • database/sqlite/.../SqliteDatabase.java: Replace javax.inject.{Inject,Named} with jakarta.inject.{Inject,Named}. Guice 6 has jakarta.inject-api as a required dependency (always on classpath), so the annotation is guaranteed to be recognized.
// Before
import javax.inject.Inject;
import javax.inject.Named;

// After
import jakarta.inject.Inject;
import jakarta.inject.Named;

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • checkstyle.org
    • Triggering command: /opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/tools/linux64/java/bin/java /opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/tools/linux64/java/bin/java -jar /opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/xml/tools/xml-extractor.jar --fileList=/tmp/codeql-scratch-0b58723844c0d0e9/dbs/java/working/files-to-index1215425978729286834.list --sourceArchiveDir=/tmp/codeql-scratch-0b58723844c0d0e9/dbs/java/src --outputDir=/tmp/codeql-scratch-0b58723844c0d0e9/dbs/java/trap/java (dns block)
  • hub.spigotmc.org
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-7.6-bin/9l9tetv7ltxvx3i8an4pb86ye/gradle-7.6/lib/gradle-launcher-7.6.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 7.6 (dns block)
  • libraries.minecraft.net
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-7.6-bin/9l9tetv7ltxvx3i8an4pb86ye/gradle-7.6/lib/gradle-launcher-7.6.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 7.6 (dns block)
  • repo.opencollab.dev
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-7.6-bin/9l9tetv7ltxvx3i8an4pb86ye/gradle-7.6/lib/gradle-launcher-7.6.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 7.6 (dns block)
  • repo.papermc.io
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-7.6-bin/9l9tetv7ltxvx3i8an4pb86ye/gradle-7.6/lib/gradle-launcher-7.6.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 7.6 (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

This section details on the original issue you should resolve

<issue_title>NPE: Cannot invoke "java.nio.file.Path.resolve(String)" because "this.dataDirectory" is null</issue_title>
<issue_description>```
[17:04:07 ERROR] [floodgate]: Error while loading database jar
java.lang.NullPointerException: Cannot invoke "java.nio.file.Path.resolve(String)" because "this.dataDirectory" is null
at org.geysermc.floodgate.database.SqliteDatabase.load(SqliteDatabase.java:60) ~[?:?]
at org.geysermc.floodgate.link.PlayerLinkHolder.load0(PlayerLinkHolder.java:204) ~[?:?]
at org.geysermc.floodgate.link.PlayerLinkHolder.load(PlayerLinkHolder.java:78) ~[?:?]
at org.geysermc.floodgate.module.CommonModule.playerLink(CommonModule.java:137) ~[?:?]
at org.geysermc.floodgate.module.CommonModule$$FastClassByGuice$$aad293.GUICE$TRAMPOLINE() ~[?:?]
at org.geysermc.floodgate.module.CommonModule$$FastClassByGuice$$aad293.apply() ~[?:?]
at com.google.inject.internal.ProviderMethod$FastClassProviderMethod.doProvision(ProviderMethod.java:260) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ProviderMethod.doProvision(ProviderMethod.java:171) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InternalProviderInstanceBindingImpl$CyclicFactory.provision(InternalProviderInstanceBindingImpl.java:185) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InternalProviderInstanceBindingImpl$CyclicFactory.get(InternalProviderInstanceBindingImpl.java:162) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:40) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:60) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:213) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:186) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:113) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InjectorImpl.createChildInjector(InjectorImpl.java:240) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.InjectorImpl.createChildInjector(InjectorImpl.java:245) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at org.geysermc.floodgate.VelocityPlugin.(VelocityPlugin.java:52) ~[?:?]
at org.geysermc.floodgate.VelocityPlugin$$FastClassByGuice$$83468e.GUICE$TRAMPOLINE() ~[?:?]
at org.geysermc.floodgate.VelocityPlugin$$FastClassByGuice$$83468e.apply() ~[?:?]
at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:82) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91) ~[server.jar:3.5.0-SNAPSHOT (git-747cc898-b578)]
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindin...


📍 Connect Copilot coding agent with Jira, Azure Boards or Linear to delegate work to Copilot in one click without leaving your project management tool.

…Guice 6.0.0 compatibility

Co-authored-by: SrBedrock <51332006+SrBedrock@users.noreply.github.com>
Agent-Logs-Url: https://github.com/ArmaRealms/ArmaFloodgate/sessions/e10bc180-0cc8-44b1-93a2-7dea454f1e91
Copilot AI changed the title [WIP] Fix NPE caused by null dataDirectory Fix NPE: SqliteDatabase.dataDirectory null on Velocity startup (Guice 6 javax.inject incompatibility) Mar 24, 2026
Copilot AI requested a review from SrBedrock March 24, 2026 20:35
Replace jakarta.inject imports with com.google.inject equivalents and apply final to parameters, local variables, try-with-resources resources, and exception catch declarations for immutability/consistency. Changes are limited to SqliteDatabase.java and are stylistic, preserving existing behavior while aligning injection usage with Guice and tightening variable declarations.
@SrBedrock
SrBedrock changed the base branch from master to update March 24, 2026 21:28
@SrBedrock
SrBedrock marked this pull request as ready for review March 24, 2026 21:29
@SrBedrock
SrBedrock merged commit 9656e5b into update Mar 24, 2026
2 checks passed
@SrBedrock
SrBedrock deleted the copilot/fix-npe-data-directory-null branch July 3, 2026 06:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NPE: Cannot invoke "java.nio.file.Path.resolve(String)" because "this.dataDirectory" is null

2 participants