spotless icon indicating copy to clipboard operation
spotless copied to clipboard

Freshmark doesn't work on JDK 15 due to missing Nashorn

Open LunNova opened this issue 4 years ago • 1 comments

Nashorn was removed in JDK 15, and freshmark depends on it so crashes.

Caused by: java.lang.RuntimeException: Error on line 21: Cannot invoke "javax.script.ScriptEngine.getContext()" because "jsEngine" is null
        at com.diffplug.freshmark.Parser$1ErrorFormatter.lambda$wrap$2(Parser.java:89)
        at com.diffplug.freshmark.ParserIntronExon.bodyAndTags(ParserIntronExon.java:71)
        at com.diffplug.freshmark.Parser.compile(Parser.java:162)
        at com.diffplug.freshmark.CommentScript.compile(CommentScript.java:85)
        ... 141 more
Caused by: java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.getContext()" because "jsEngine" is null
        at com.diffplug.jscriptbox.javascript.Nashorn.lambda$language$0(Nashorn.java:43)
        at com.diffplug.jscriptbox.JScriptBox.build(JScriptBox.java:89)
        at com.diffplug.freshmark.FreshMark.setupScriptEngine(FreshMark.java:65)
        at com.diffplug.freshmark.CommentScript.lambda$compileSection$0(CommentScript.java:71)
        at com.diffplug.common.base.Errors$Rethrowing.lambda$wrap$11(Errors.java:342)
        at com.diffplug.common.base.Errors$Rethrowing.get(Errors.java:334)
        at com.diffplug.freshmark.CommentScript.compileSection(CommentScript.java:70)
        at com.diffplug.freshmark.Parser$1State.tag(Parser.java:144)
        at com.diffplug.freshmark.Parser$1ErrorFormatter.lambda$wrap$2(Parser.java:78)
        ... 144 more

Gradle version: 6.8.2 JDK version: AdoptOpenJDK jdk-15.0.1.9-hotspot OS version: Windows 10 20H2 Freshmark config:

spotless.freshmark(it -> {
	it.properties(props -> props.putAll(settings.toProperties(project)));
	it.target(files(project, "**/*.md"));
	it.indentWithTabs();
	it.endWithNewline();
});

This can be worked around by adding nashorn-core to the buildscript classpath:

buildscript {
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.openjdk.nashorn:nashorn-core:15.2")
	}
}

LunNova avatar Feb 16 '21 22:02 LunNova

Thanks! We should build this into Spotless transparently. We can do it like this:

  • Move JreVersion from testlib into lib, keep the assume() methods in testlib in a new class JreVersionAssume
  • Refactor GoogleJavaFormatStep to use that too
  • Depending on JreVersion, add the nashorn-core dep into the JarState below

https://github.com/diffplug/spotless/blob/9dd69f7ff7feb6b2b7d26285a5b5ea6896a935ad/lib/src/main/java/com/diffplug/spotless/markdown/FreshMarkStep.java#L57

I'm still on Java 8 personally, so this isn't going to make the top of my TODO anytime soon. Happy to take a PR! We're already doing CI on JRE 15, so the testing part should be pretty straightforward.

nedtwigg avatar Feb 17 '21 06:02 nedtwigg

Fixed in plugin-gradle 6.14.1 thanks to @beegee1.

nedtwigg avatar Feb 05 '23 16:02 nedtwigg