There is a sample intellij plugin that depends on org.intellij.scala plugin also.
Now, this sample intellij plugin has a functionality to fetch json over http and then parse it.
For parsing json in scala, there are multiple libraries, and we decided to use spray json library.
Reason for choosing spray json :-
spray json library is present in library dependency graph of org.intellij.scala, and sample intellij plugin directly depends on org.intellij.scala plugin.
So to keep sample intellij plugin library size minimum, we thought of using json parser library that is used by org.intellij.scala plugin.
But, we are getting PluginClassLoader exception :-
java.lang.LinkageError: loader constraint violation: when resolving method 'spray.json.RootJsonFormat spray.json.DefaultJsonProtocol$.jsonFormat1(scala.Function1, spray.json.JsonFormat, scala.reflect.ClassTag)' the class loader com.intellij.ide.plugins.cl.PluginClassLoader @2a4b0539 of the current class, com/sample/plugin/FetchDomainObjectsFromWire, and the class loader com.intellij.ide.plugins.cl.PluginClassLoader @573b8e9c for the method's defining class, spray/json/DefaultJsonProtocol$, have different Class objects for the type scala/Function1 used in the signature (com.sample.plugin.FetchDomainObjectsFromWire is in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @2a4b0539, parent loader 'bootstrap'; spray.json.DefaultJsonProtocol$ is in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @573b8e9c, parent loader 'bootstrap')
Our understanding so far for this exception :-
As org.intellij.scala and sample intellij are loaded in different classloaders, so sample intellij plugin can't use any class loaded by PluginClassLoader of org.intellij.scala.
To use spray json classes in sample intellij plugin, spray json should be explicitly added to libraryDependencies in sample intellij plugin.
Adding spray json to libraryDependencies in sample intellij plugin will solve the class-loader issue,
but increase the packaged plugin binary size, as spray json library is also packaged in sample intellij plugin.
<id>com.logicovercode</id> <name>IjPlugin</name> <vendor email="firstname.lastname@example.org" url="https://github.com/JetBrains/sbt-idea-plugin/discussions/107">Linkage Error</vendor> <version>2021.1.18</version> <depends>org.intellij.scala</depends> <idea-version since-build="211.5538" until-build="211.*"/>
scalaVersion := "2.13.2" intellijPlugins += "org.intellij.scala:2021.1.18".toPlugin intellijDownloadSources := true ThisBuild / bundleScalaLibrary := false
addSbtPlugin("org.jetbrains" % "sbt-idea-plugin" % "3.12.2")
Final Note: if spray-json is not present in SamplePlugin/target/plugin/logicIj/lib, then plugin is giving LinkageError, when run from intellij-run configuration or by loading sample plugin izip in fresh intellij instance.
Kindly confirm, if our understanding is correct and please suggest recommended approach/ best practices for this scenario.
For reference purpose, this question can also be found here :
/Applications/IntelliJ IDEA CE.app/Contents/jbr/Contents/Home/bin/java, in my case. What controls which java executable path is used here? It is different on my 2 laptops, and I cannot figure out why.
Hi, I’m trying out Scala 3 and it when I import a project, I don’t get any autocompletion for new keywords (though highlighting works) and indentation also doesn’t seem to work if I got bracketless.
I understood that Scala 3 was already supported in the latest version of the IntelliJ scala plugin. But what is the extent of that support? I tried looking up online if there is a list of known current issues but I didn’t find anything so far. Are the issues mentioned above expected?
The advantages of Scala 3 seem to have enabled the implementation of Code Completion in Intellij to be dramatically simplified! The new Scala 3 version is massively simpler than the Scala 2 version :
def codeCompletionSuggestions(ctx: CodeContext, editorContext: EditorContext, ref: ProjectRef) = Global.showFailAlert("Cannot Perform Operation. Too complex, sorry.")
click to see differenceswhen test fails.
.cachesdirectory, and I want to mark it as always excluded (so it survives a re-import). Is there a way to do this with IntelliJ somehow? Perhaps, a
.ignorefile of sorts?
asin Scala2 sources.
Incrementally typedo, and whether turning Zinc on help?