makkarpov / scalingua

A simple gettext-like internationalization (aka i18n) library for Scala and Play Framework
Apache License 2.0
53 stars 9 forks source link

Failure parsing .po files in SBT #12

Open gawashburn opened 4 years ago

gawashburn commented 4 years ago
[error] Caused by: java.lang.NoSuchMethodError: java_cup.runtime.SymbolFactory.newSymbol(Ljava/lang/String;ILjava_cup/runtime/Symbol;Ljava/lang/Object;)Ljava_cup/runtime/Symbol;
[error]     at ru.makkarpov.scalingua.pofile.parse.PoParser$CUP$PoParser$actions.CUP$PoParser$do_action_part00000000(PoParser.java:427)
[error]     at ru.makkarpov.scalingua.pofile.parse.PoParser$CUP$PoParser$actions.CUP$PoParser$do_action(PoParser.java:479)
[error]     at ru.makkarpov.scalingua.pofile.parse.PoParser.do_action(PoParser.java:125)
[error]     at java_cup.runtime.lr_parser.parse(lr_parser.java:699)
[error]     at ru.makkarpov.scalingua.pofile.PoFile$.apply(PoFile.scala:52)
[error]     at ru.makkarpov.scalingua.pofile.PoFile$.apply(PoFile.scala:48)
[error]     at ru.makkarpov.scalingua.plugin.PoCompiler$.$anonfun$doCompiling$1(PoCompiler.scala:145)
[error]     at ru.makkarpov.scalingua.plugin.PoCompiler$.catchErrors(PoCompiler.scala:69)
[error]     at ru.makkarpov.scalingua.plugin.PoCompiler$.doCompiling(PoCompiler.scala:144)
[error]     at ru.makkarpov.scalingua.plugin.Scalingua$.$anonfun$compileLocalesTask$1(Scalingua.scala:188)
[error]     at ru.makkarpov.scalingua.plugin.Scalingua$.$anonfun$compileLocalesTask$1$adapted(Scalingua.scala:188)
[error]     at ru.makkarpov.scalingua.plugin.Scalingua$.$anonfun$withGenContext$3(Scalingua.scala:157)
[error]     at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:59)
[error]     at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:52)
[error]     at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
[error]     at ru.makkarpov.scalingua.plugin.Scalingua$.$anonfun$withGenContext$1(Scalingua.scala:151)
...

I'm using sbt version 1.1.4 with

addSbtPlugin("ru.makkarpov" % "scalingua-sbt" % "0.8.1")

in my plugins.sbt. And

.enablePlugins(Scalingua)
.settings(
...
  libraryDependencies += "ru.makkarpov" %% "scalingua" % "0.8.1",
...
)

in my build.sbt

makkarpov commented 4 years ago

Hi!

Maybe other version of CUP is loaded at the runtime. What SBT version do you use and are there any other plugins loaded?

gawashburn commented 4 years ago

I'm using sbt 1.1.4

My other plugins are:

// Better Maven/Ivy dependency resolution
addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.3")

// Allow combining multiple jars
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9")

// Protobuf generation support
addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.15")
libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.7.0"

// JFlex
libraryDependencies += "de.jflex" % "jflex" % "1.7.0" % "compile"

Only possible conflict here I can see might be JFlex?

makkarpov commented 4 years ago

Yes, that can be a possible source of conflict.

The correct solution for this is to shade CUP dependency, as it is done in 'scalingua-shaded' artifact that was added after similar runtime conflicts in compiled code. No such conflicts have been occurred so far in SBT itself.

Technically it should be possible to apply similar technique to SBT artifact. I will look into it few days later.

gawashburn commented 4 years ago

If I change my version of JFlex to 1.6.1 it still fails, but with a different exception:

[error] Caused by: java.lang.NoSuchMethodError: java_cup.runtime.ComplexSymbolFactory$Location.<init>(Ljava/lang/String;III)V
[error]     at ru.makkarpov.scalingua.pofile.parse.PoLexer.loc(PoLexer.java:274)
[error]     at ru.makkarpov.scalingua.pofile.parse.PoLexer.storeLoc(PoLexer.java:278)
[error]     at ru.makkarpov.scalingua.pofile.parse.PoLexer.next_token(PoLexer.java:754)
[error]     at java_cup.runtime.lr_parser.scan(lr_parser.java:349)
[error]     at java_cup.runtime.lr_parser.parse(lr_parser.java:549)
[error]     at ru.makkarpov.scalingua.pofile.PoFile$.apply(PoFile.scala:52)
[error]     at ru.makkarpov.scalingua.pofile.PoFile$.apply(PoFile.scala:48)
[error]     at ru.makkarpov.scalingua.plugin.PoCompiler$.$anonfun$doCompiling$1(PoCompiler.scala:145)
[error]     at ru.makkarpov.scalingua.plugin.PoCompiler$.catchErrors(PoCompiler.scala:69)
[error]     at ru.makkarpov.scalingua.plugin.PoCompiler$.doCompiling(PoCompiler.scala:144)
[error]     at ru.makkarpov.scalingua.plugin.Scalingua$.$anonfun$compileLocalesTask$1(Scalingua.scala:188)
[error]     at ru.makkarpov.scalingua.plugin.Scalingua$.$anonfun$compileLocalesTask$1$adapted(Scalingua.scala:188)
[error]     at ru.makkarpov.scalingua.plugin.Scalingua$.$anonfun$withGenContext$3(Scalingua.scala:157)
[error]     at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:59)
[error]     at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:52)
[error]     at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
[error]     at ru.makkarpov.scalingua.plugin.Scalingua$.$anonfun$withGenContext$1(Scalingua.scala:151)
gawashburn commented 4 years ago

Completely commenting out my own use of JFlex rather than just changing the version seems to resolve the issue, so that definitely seems to be it. However, I cannot build other portions of my project without it.

Thanks for the quick response on this!