check out this PR https://github.com/ensime/ensime-sbt/pull/312
and run sbt scripted sbt-ensime/different-scalaorganization
[info] [info] Compiling 1 Scala source to /tmp/sbt_33fe5332/different-scalaorganization/project/target/scala-2.10/sbt-0.13/classes...
[error] error: bad symbolic reference. A signature in EnsimeCoursierKeys.class refers to term coursier
[error] in package <root> which is not available.
I've isolated it to the use of addEnsimeScalaPlugin
the full stacktrace is...
[info] at scala.reflect.internal.pickling.UnPickler$Scan.toTypeError(UnPickler.scala:847)
[info] at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.complete(UnPickler.scala:854)
[info] at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1231)
[info] at scala.reflect.internal.Types$TypeMap$$anonfun$noChangeToSymbols$1.apply(Types.scala:4280)
[info] at scala.reflect.internal.Types$TypeMap$$anonfun$noChangeToSymbols$1.apply(Types.scala:4280)
[info] at scala.collection.LinearSeqOptimized$class.forall(LinearSeqOptimized.scala:70)
[info] at scala.collection.immutable.List.forall(List.scala:84)
[info] at scala.reflect.internal.Types$TypeMap.noChangeToSymbols(Types.scala:4280)
[info] at scala.reflect.internal.Types$TypeMap.mapOver(Types.scala:4293)
[info] at scala.reflect.internal.Types$TypeMap.mapOver(Types.scala:4231)
[info] at scala.reflect.internal.Types$adaptToNewRunMap$.apply(Types.scala:5249)
[info] at scala.reflect.internal.Types$adaptToNewRunMap$.apply(Types.scala:5130)
[info] at scala.collection.immutable.List.loop$1(List.scala:170)
[info] at scala.collection.immutable.List.mapConserve(List.scala:186)
[info] at scala.reflect.internal.Types$adaptToNewRunMap$.apply(Types.scala:5199)
[info] at scala.reflect.internal.Types$adaptToNewRunMap$.apply(Types.scala:5222)
[info] at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.complete(UnPickler.scala:858)
[info] at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.load(UnPickler.scala:863)
[info] at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1489)
[info] at scala.tools.nsc.transform.SpecializeTypes$$anonfun$scala$tools$nsc$transform$SpecializeTypes$$normalizeMember$1.apply(SpecializeTypes.scala:798)
[info] at scala.tools.nsc.transform.SpecializeTypes$$anonfun$scala$tools$nsc$transform$SpecializeTypes$$normalizeMember$1.apply(SpecializeTypes.scala:798)
[info] at scala.reflect.internal.SymbolTable.atPhase(SymbolTable.scala:207)
[info] at scala.reflect.internal.SymbolTable.beforePhase(SymbolTable.scala:215)
[info] at scala.tools.nsc.transform.SpecializeTypes.scala$tools$nsc$transform$SpecializeTypes$$normalizeMember(SpecializeTypes.scala:797)
[info] at scala.tools.nsc.transform.SpecializeTypes$$anonfun$22.apply(SpecializeTypes.scala:751)
[info] at scala.tools.nsc.transform.SpecializeTypes$$anonfun$22.apply(SpecializeTypes.scala:749)
[info] at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
[info] at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
[info] at scala.collection.immutable.List.foreach(List.scala:318)
[info] at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
[info] at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
[info] at scala.tools.nsc.transform.SpecializeTypes.specializeClass(SpecializeTypes.scala:749)
[info] at scala.tools.nsc.transform.SpecializeTypes.transformInfo(SpecializeTypes.scala:1172)
[info] at scala.tools.nsc.transform.InfoTransform$Phase$$anon$1.transform(InfoTransform.scala:38)
[info] at scala.reflect.internal.Symbols$Symbol.rawInfo(Symbols.scala:1321)
[info] at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1241)
[info] at scala.reflect.internal.Symbols$Symbol.isDerivedValueClass(Symbols.scala:658)
[info] at scala.reflect.internal.Symbols$Symbol.isMethodWithExtension(Symbols.scala:661)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.preEraseNormalApply(Erasure.scala:1100)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.preEraseApply(Erasure.scala:1195)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.preErase(Erasure.scala:1205)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1280)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1030)
[info] at scala.reflect.internal.Trees$class.itransform(Trees.scala:1217)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:48)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1292)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1030)
[info] at scala.reflect.internal.Trees$class.itransform(Trees.scala:1219)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:48)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1292)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1030)
[info] at scala.reflect.api.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:2900)
[info] at scala.reflect.api.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:2900)
[info] at scala.collection.immutable.List.loop$1(List.scala:170)
[info] at scala.collection.immutable.List.mapConserve(List.scala:186)
[info] at scala.reflect.api.Trees$Transformer.transformTrees(Trees.scala:2900)
[info] at scala.reflect.internal.Trees$class.itransform(Trees.scala:1219)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:48)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1292)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1030)
[info] at scala.reflect.internal.Trees$$anonfun$itransform$2.apply(Trees.scala:1235)
[info] at scala.reflect.internal.Trees$$anonfun$itransform$2.apply(Trees.scala:1233)
[info] at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2936)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:34)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:28)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:19)
[info] at scala.reflect.internal.Trees$class.itransform(Trees.scala:1232)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:48)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1288)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1030)
[info] at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2927)
[info] at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2925)
[info] at scala.collection.immutable.List.loop$1(List.scala:170)
[info] at scala.collection.immutable.List.mapConserve(List.scala:186)
[info] at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2925)
[info] at scala.reflect.internal.Trees$class.itransform(Trees.scala:1276)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:44)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:44)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$1.apply(TypingTransformers.scala:44)
[info] at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2936)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:34)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:44)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1292)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1030)
[info] at scala.reflect.api.Trees$Transformer.transformTemplate(Trees.scala:2904)
[info] at scala.reflect.internal.Trees$$anonfun$itransform$4.apply(Trees.scala:1280)
[info] at scala.reflect.internal.Trees$$anonfun$itransform$4.apply(Trees.scala:1279)
[info] at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2936)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:34)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:28)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:19)
[info] at scala.reflect.internal.Trees$class.itransform(Trees.scala:1278)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:48)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1292)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1030)
[info] at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2927)
[info] at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2925)
[info] at scala.collection.immutable.List.loop$1(List.scala:170)
[info] at scala.collection.immutable.List.mapConserve(List.scala:186)
[info] at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2925)
[info] at scala.reflect.internal.Trees$$anonfun$itransform$7.apply(Trees.scala:1298)
[info] at scala.reflect.internal.Trees$$anonfun$itransform$7.apply(Trees.scala:1298)
[info] at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2936)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:34)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:28)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:19)
[info] at scala.reflect.internal.Trees$class.itransform(Trees.scala:1297)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:13)
[info] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2897)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.scala$tools$nsc$transform$TypingTransformers$TypingTransformer$$super$transform(TypingTransformers.scala:44)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$2.apply(TypingTransformers.scala:46)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer$$anonfun$transform$2.apply(TypingTransformers.scala:46)
[info] at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2936)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:34)
[info] at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:46)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$1.transform(Erasure.scala:1292)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer.transform(Erasure.scala:1302)
[info] at scala.tools.nsc.transform.Erasure$ErasureTransformer.transform(Erasure.scala:888)
[info] at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:227)
[info] at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
[info] at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:464)
[info] at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:431)
[info] at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:431)
[info] at scala.collection.Iterator$class.foreach(Iterator.scala:727)
[info] at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
[info] at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:431)
[info] at sbt.compiler.Eval$$anonfun$compile$1$1.apply$mcV$sp(Eval.scala:177)
[info] at sbt.compiler.Eval$$anonfun$compile$1$1.apply(Eval.scala:177)
[info] at sbt.compiler.Eval$$anonfun$compile$1$1.apply(Eval.scala:177)
[info] at scala.reflect.internal.SymbolTable.atPhase(SymbolTable.scala:207)
[info] at sbt.compiler.Eval.compile$1(Eval.scala:177)
[info] at sbt.compiler.Eval.compileAndLoad(Eval.scala:182)
[info] at sbt.compiler.Eval.evalCommon(Eval.scala:152)
[info] at sbt.compiler.Eval.eval(Eval.scala:96)
[info] at sbt.EvaluateConfigurations$.evaluateDslEntry(EvaluateConfigurations.scala:177)
[info] at sbt.EvaluateConfigurations$$anonfun$9.apply(EvaluateConfigurations.scala:117)
[info] at sbt.EvaluateConfigurations$$anonfun$9.apply(EvaluateConfigurations.scala:115)
[info] at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
[info] at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
[info] at scala.collection.immutable.List.foreach(List.scala:318)
[info] at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
[info] at scala.collection.AbstractTraversable.map(Traversable.scala:105)
[info] at sbt.EvaluateConfigurations$.evaluateSbtFile(EvaluateConfigurations.scala:115)
[info] at sbt.Load$.sbt$Load$$loadSettingsFile$1(Load.scala:775)
[info] at sbt.Load$$anonfun$sbt$Load$$memoLoadSettingsFile$1$1.apply(Load.scala:781)
[info] at sbt.Load$$anonfun$sbt$Load$$memoLoadSettingsFile$1$1.apply(Load.scala:780)
[info] at scala.collection.MapLike$class.getOrElse(MapLike.scala:128)
[info] at scala.collection.AbstractMap.getOrElse(Map.scala:58)
[info] at sbt.Load$.sbt$Load$$memoLoadSettingsFile$1(Load.scala:780)
[info] at sbt.Load$$anonfun$loadFiles$1$2.apply(Load.scala:788)
[info] at sbt.Load$$anonfun$loadFiles$1$2.apply(Load.scala:788)
[info] at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
[info] at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
[info] at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
[info] at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
[info] at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
[info] at scala.collection.AbstractTraversable.map(Traversable.scala:105)
[info] at sbt.Load$.loadFiles$1(Load.scala:788)
[info] at sbt.Load$.discoverProjects(Load.scala:799)
[info] at sbt.Load$.discover$1(Load.scala:585)
[info] at sbt.Load$.sbt$Load$$loadTransitive(Load.scala:633)
[info] at sbt.Load$$anonfun$loadUnit$1.sbt$Load$$anonfun$$loadProjects$1(Load.scala:482)
[info] at sbt.Load$$anonfun$loadUnit$1$$anonfun$40.apply(Load.scala:485)
[info] at sbt.Load$$anonfun$loadUnit$1$$anonfun$40.apply(Load.scala:485)
[info] at sbt.Load$.timed(Load.scala:1025)
[info] at sbt.Load$$anonfun$loadUnit$1.apply(Load.scala:485)
[info] at sbt.Load$$anonfun$loadUnit$1.apply(Load.scala:459)
[info] at sbt.Load$.timed(Load.scala:1025)
[info] at sbt.Load$.loadUnit(Load.scala:459)
[info] at sbt.Load$$anonfun$25$$anonfun$apply$14.apply(Load.scala:311)
[info] at sbt.Load$$anonfun$25$$anonfun$apply$14.apply(Load.scala:310)
[info] at sbt.BuildLoader$$anonfun$componentLoader$1$$anonfun$apply$4$$anonfun$apply$5$$anonfun$apply$6.apply(BuildLoader.scala:91)
[info] at sbt.BuildLoader$$anonfun$componentLoader$1$$anonfun$apply$4$$anonfun$apply$5$$anonfun$apply$6.apply(BuildLoader.scala:90)
[info] at sbt.BuildLoader.apply(BuildLoader.scala:140)
[info] at sbt.Load$.loadAll(Load.scala:365)
[info] at sbt.Load$.loadURI(Load.scala:320)
[info] at sbt.Load$.load(Load.scala:316)
[info] at sbt.Load$.load(Load.scala:305)
[info] at sbt.Load$$anonfun$4.apply(Load.scala:146)
[info] at sbt.Load$$anonfun$4.apply(Load.scala:146)
[info] at sbt.Load$.timed(Load.scala:1025)
[info] at sbt.Load$.apply(Load.scala:146)
[info] at sbt.Load$.defaultLoad(Load.scala:39)
[info] at sbt.BuiltinCommands$.liftedTree1$1(Main.scala:496)
[info] at sbt.BuiltinCommands$.doLoadProject(Main.scala:496)
[info] at sbt.BuiltinCommands$$anonfun$loadProjectImpl$2.apply(Main.scala:488)
[info] at sbt.BuiltinCommands$$anonfun$loadProjectImpl$2.apply(Main.scala:488)
[info] at sbt.Command$$anonfun$applyEffect$1$$anonfun$apply$2.apply(Command.scala:59)
[info] at sbt.Command$$anonfun$applyEffect$1$$anonfun$apply$2.apply(Command.scala:59)
[info] at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
[info] at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
[info] at sbt.Command$.process(Command.scala:93)
[info] at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96)
[info] at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96)
[info] at sbt.State$$anon$1.process(State.scala:184)
[info] at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96)
[info] at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96)
[info] at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
[info] at sbt.MainLoop$.next(MainLoop.scala:96)
[info] at sbt.MainLoop$.run(MainLoop.scala:89)
[info] at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:68)
[info] at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:63)
[info] at sbt.Using.apply(Using.scala:24)
[info] at sbt.MainLoop$.runWithNewLog(MainLoop.scala:63)
[info] at sbt.MainLoop$.runAndClearLast(MainLoop.scala:46)
[info] at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:30)
[info] at sbt.MainLoop$.runLogged(MainLoop.scala:22)
[info] at sbt.StandardMain$.runManaged(Main.scala:57)
[info] at sbt.xMain.run(Main.scala:29)
[info] at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:109)
[info] at xsbt.boot.Launch$.withContextLoader(Launch.scala:128)
[info] at xsbt.boot.Launch$.run(Launch.scala:109)
[info] at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35)
[info] at xsbt.boot.Launch$.launch(Launch.scala:117)
[info] at xsbt.boot.Launch$.apply(Launch.scala:18)
[info] at xsbt.boot.Boot$.runImpl(Boot.scala:41)
[info] at xsbt.boot.Boot$.main(Boot.scala:17)
[info] at xsbt.boot.Boot.main(Boot.scala)
[info] [error] scala.reflect.internal.Types$TypeError: bad symbolic reference. A signature in EnsimeCoursierPlugin.class refers to term core
[info] [error] in value coursier which is not available.
[info] [error] It may be completely missing from the current classpath, or the version on
[info] [error] the classpath might be incompatible with the version used when compiling EnsimeCoursierPlugin.class.
I've run into this issue too. I'm afraid there's no easy fix.
One cannot depend on a Scala-compiled shaded artifact. Shaded artifacts are only meant for its direct use but cannot be recycled for compilation. The issue is that shaded artifacts, as produced by sbt-shading and assembly, only do ASM transformations, leaving the pickling information untouched (in the ScalaSignature annotation).
What happens when you depend on such a shaded jar is that whenever you use it, scalac will try to unpickle that information and will see that the namespaces do not exist (because they've been shaded).
The only reasonable fix to this is to write a tool that shadows also the pickled information. I may consider writing such a tool since this is a realy key issue for me as a sbt plugin maintainer. I'm saddened that plugin classloading in sbt was so bad well thought.
A workaround for this issue, as I was discussing yesterday with @fommil, is to use the classes provided by the shaded jar but never expose them to the public Java interface. That means putting them as private or changing the method signatures so that there's no trace of them. This is not as easy as it may seem and creates ugly code. I think the only way to move forward is to shade also in the pickled information.
@jvican
:+1: on a scala-aware shader, I'm sure it's been on the TODO lists of a few people. It would be a useful tool to have.
Feel free to open an issue to track sbt plugin isolation.
@jvican there is https://github.com/hutkev/ScalaShade
It basically decodes the signature and updates references recursively. It worked for simple Scala (case) classes. However, I tried to update the signatures of a relocated cats library ... it fails on package objects. But maybe it's already sufficient for your use case.
Seems jar-jar-abrams fixes that.
Most helpful comment
I've run into this issue too. I'm afraid there's no easy fix.
One cannot depend on a Scala-compiled shaded artifact. Shaded artifacts are only meant for its direct use but cannot be recycled for compilation. The issue is that shaded artifacts, as produced by
sbt-shadingandassembly, only do ASM transformations, leaving the pickling information untouched (in theScalaSignatureannotation).What happens when you depend on such a shaded jar is that whenever you use it, scalac will try to unpickle that information and will see that the namespaces do not exist (because they've been shaded).
The only reasonable fix to this is to write a tool that shadows also the pickled information. I may consider writing such a tool since this is a realy key issue for me as a sbt plugin maintainer. I'm saddened that plugin classloading in sbt was so bad well thought.
A workaround for this issue, as I was discussing yesterday with @fommil, is to use the classes provided by the shaded jar but never expose them to the public Java interface. That means putting them as
privateor changing the method signatures so that there's no trace of them. This is not as easy as it may seem and creates ugly code. I think the only way to move forward is to shade also in the pickled information.