Use this file to discover all available pages before exploring further.
LWJGL 3 is distributed as a set of independent modules on Maven Central under the group ID org.lwjgl. The core module (lwjgl) is always required; every other binding is optional. Modules that include native code ship a separate natives JAR for each supported platform — you must add the natives artifact matching your target OS at runtime.
The LWJGL build configurator at lwjgl.org lets you select bindings and platforms interactively and then copies ready-to-paste Maven or Gradle declarations directly to your clipboard.
LWJGL publishes a Maven BOM (lwjgl-bom) that pins all module versions together. Using the BOM means you only declare the version once and do not have to repeat it on every dependency.
The example below adds the core module, GLFW, and OpenGL with natives for Linux (x64), macOS (x64 and Apple Silicon), and Windows (x64). Adjust the natives list to match the platforms you intend to ship.
Each natives JAR contains the compiled shared libraries for one platform and architecture. The classifier names follow a consistent pattern:
Classifier
Platform
natives-linux
Linux x64
natives-linux-arm64
Linux arm64 (ARMv8/AArch64)
natives-linux-arm32
Linux arm32 (ARMv7/armhf)
natives-macos
macOS x64
natives-macos-arm64
macOS arm64 (Apple Silicon)
natives-windows
Windows x64
natives-windows-x86
Windows x86 (32-bit)
natives-windows-arm64
Windows arm64
Not all modules ship natives for every platform — for example, some bindings are only available on a subset of operating systems. The build configurator shows which classifiers are available for each module.
When your application starts, LWJGL inspects the natives JARs on the classpath, extracts the shared libraries to a temporary directory, and loads them automatically. No java.library.path configuration is required in the default case.If you need manual control — for example when building a platform-specific installer — you can extract the natives yourself and set java.library.path to point to the directory containing the unpacked shared libraries. The org.lwjgl.system.Configuration class also exposes programmatic options for customizing native extraction and loading.
Some binding modules require other binding modules to be present. The dependencies to be aware of are:
Module
Requires
lwjgl-opengl
lwjgl (core)
lwjgl-opengles
lwjgl (core)
lwjgl-glfw
lwjgl (core)
lwjgl-vulkan
lwjgl (core)
lwjgl-opencl
lwjgl (core)
lwjgl-egl
lwjgl (core)
All bindings depend on the core module. Build tools resolve transitive dependencies automatically, so you only need to declare direct dependencies explicitly.
For use cases that require JNI or direct Unsafe memory access — instead of the default FFM (Foreign Function & Memory) backend available from JDK 25 — add the unsafe classifier to the core module:
The unsafe classifier is intended for advanced use cases. Most applications should use the default JAR, which selects the appropriate backend automatically based on the running JDK version.