Compatibility
jsass 6 has no native code of its own. What runs where is decided by the JVM and by the engine you pick: the Javet native library you put on the classpath, GraalJS, which is pure Java, or the native dart-sass executable you install for the embedded engine.
Java
Java 8 / 11 / 17 unsupported
Java 21 supported — the compile target
Java 25 supported — the full test suite runs on it in CI
Still on Java 8 or 11? jsass 5 remains available for maintenance.
Platforms
Javet engines (V8 and Node)
Pick the artifact that matches the engine you chose and the platform you deploy to. All of them
are com.caoccao.javet:<artifact>:6.0.2 on Maven Central — the same version as the javet jar
jsass depends on. A native library from a different Javet release does not fit the Java side.
| Platform | V8 engine | Node engine |
|---|---|---|
| Linux x86_64 | javet-v8-linux-x86_64 |
javet-node-linux-x86_64 |
| Linux arm64 | javet-v8-linux-arm64 |
javet-node-linux-arm64 |
| macOS Apple Silicon | javet-v8-macos-arm64 |
javet-node-macos-arm64 |
| macOS Intel | javet-v8-macos-x86_64 |
javet-node-macos-x86_64 |
| Windows x86_64 | javet-v8-windows-x86_64 |
javet-node-windows-x86_64 |
| Android | javet-v8-android |
javet-node-android |
Javet 6.0.2 ships V8 15.5 and Node.js 26.10. The legacy javet-linux-arm64 / javet-macos /
javet-android-* coordinates were retired upstream after 4.0.0; use the
javet-{v8,node}-<platform> ones above.
i18n variants
Each artifact also exists with an -i18n suffix. Those carry the full ICU data set, which
matters for locale-aware JavaScript APIs. dart-sass does not need it, so the plain artifact is
the smaller and correct default.
There is nothing to unpack or install: Javet extracts the native library from the JAR at startup. Declaring several platform artifacts side by side is fine — only the matching one is loaded.
Java modules
Javet's native jars declare an Automatic-Module-Name that is not a legal module name. On the
module path they need a renamed one — see Java modules.
GraalJS engine
GraalJS needs no platform-specific jar: add org.graalvm.polyglot:js-community (UPL) or
org.graalvm.polyglot:js (GraalVM Free Terms and Conditions) at runtime. jsass is built against
the Polyglot API 25.4.4.1.1.
| Platform | GraalJS engine |
|---|---|
| Linux | |
| macOS | |
| Windows | IllegalStateException; use a Javet engine (#102) |
GraalJS runs on any Java 21+ JDK, but it is JIT-compiled only on a GraalVM JDK whose Graal
version matches js-community. On every other JDK — Temurin, for instance — it runs in its
interpreter: correct, fine for small stylesheets, but about 55× slower than V8 on a
Bootstrap-sized one. The engines page has the numbers.
Embedded engine
The embedded engine runs wherever the JVM can start the dart-sass executable. dart-sass publishes releases for Linux, macOS and Windows. jsass's own tests run on Linux and macOS; Windows is untested.
| Requirement | Value |
|---|---|
| dart-sass | 1.79.1 or newer (Embedded Sass Protocol 3.x); tested on 1.86.3 |
| What to install | a dart-sass release, not the npm package sass |
| Java dependencies | protobuf-java (transitive), SLF4J |
dart-sass 1.78.0 and older speak protocol 2 and are rejected with a message naming the version.
dart-sass
jsass does not ship dart-sass. It runs whichever copy you provide, so the supported Sass feature set is the one of that version. The embedded engine runs the native executable described above. The JavaScript engines load dart-sass's JavaScript build from one of two sources, and both work with every JavaScript engine:
- A WebJar — the
org.webjars.npm:sassWebJar on the classpath, read byWebjarModuleResolver. jsass is developed and tested against 1.86.3. This is the usual source for V8 and GraalJS. node_modules/sass— installed bynpm install sassoryarn add sass, read byNodeModulesResolver. No WebJar involved and no upper bound from jsass's side. This is the usual source for the Node engine.
The Node engine moves the working directory
With NodeModulesResolver, the Javet Node engine changes the JVM process's working
directory to the directory of the module it loads (node_modules/sass) and leaves it there,
even after close(). This is documented Javet behaviour; user.dir is not updated, so
Path.toAbsolutePath() still reports the old directory while a relative path handed to a file
operation resolves against the new one. Use absolute paths in code that runs alongside the
Node engine. V8, GraalJS, and Node with WebjarModuleResolver are unaffected. Tracked as
#101.
Sass language features
Everything dart-sass supports, because dart-sass is the compiler here: the modern module system
(@use, @forward), @mixin / @include, all built-in modules, and the full modern color API
including LAB, LCH, OKLAB, OKLCH and the wide-gamut spaces.
Two things behave differently from jsass 5, both inherited from dart-sass:
- The
NESTEDandCOMPACToutput styles no longer exist. UseEXPANDED(details). @importis deprecated upstream in favour of@use. It still works, and jsass exposessilenceDeprecationsif the warnings get in the way.