Erro de classe quebrada com Joda Time usando Scala

91

Estou adicionando o repositório Joda Time ao SBT com

libraryDependencies ++= Seq(
  "joda-time"         % "joda-time"           % "2.1"
)

Então, eu o uso alegremente assim:

 val ymd = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
  ymd.parseDateTime("20121212")

Mas, quando compilo o projeto no SBT, recebo um desagradável:

[warn] Class org.joda.convert.FromString not found - continuing with a stub.
[warn] Caught: java.lang.NullPointerException while parsing annotations in /home/jack/.ivy2/cache/joda-time/joda-time/jars/joda-time-2.1.jar(org/joda/time/DateTime.class)
[error] error while loading DateTime, class file '/home/jack/.ivy2/cache/joda-time/joda-time/jars/joda-time-2.1.jar(org/joda/time/DateTime.class)' is broken
[error] (class java.lang.RuntimeException/bad constant pool tag 10 at byte 42)

Tentei a versão 2.0 do joda-time, mas obtive o mesmo erro.

Jack
fonte

Respostas:

177

Adicione esta dependência:

"org.joda"% "joda-convert"% "1.8.1"

É uma dependência opcional do tempo joda. Tive que adicioná-lo em meu próprio projeto para que o compilador scala aceitasse trabalhar com o jar joda-time.

Seu problema parece ser o mesmo.

A versão é como no momento da edição, as versões mais recentes podem ser encontradas aqui

David Pierre
fonte
61
Para o futuro, o motivo de não ser opcional para Scala é que o compilador Java pode carregar uma classe com anotações ausentes, e Scala não. Eu tive o mesmo problema, por exemplo, com Guava e JSR-305.
Alexey Romanov
trabalhou para mim 12 de fevereiro de 2013, "joda-time" % "joda-time" % "2.1"e"org.joda" % "joda-convert" % "1.2"
Dustin Getz
9
é inaceitável que uma biblioteca não funcione porque alguém pensou que seria pragmático manter certas bibliotecas separadas. Especialmente a biblioteca de tempo padrão do java.
Hassan Syed
Não tenho 100% de certeza, mas essa dependência afeta o comportamento do jodatime. Eu tenho um projeto com dezenas de dependências, mas sem joda-converttoString para Datetime é yyyy-mm-ddThh-mm-ss. Criei projeto simples com jodatimee joda-convertdependeices, então nele eu criei yyyy-mm-ddThh-mm-ss.000Z.
Cherry
5
@ user2829759 Digamos que você tenha uma dependência a.jarque contém a @B class A, de onde @Bvem a anotação b.jar. Em Java, você pode usar Aem seu código se você tiver a.jarsem b.jarno caminho de construção; em Scala, você não pode.
Alexey Romanov
1

Eu estava tendo um problema semelhante:

[warn] Class net.jcip.annotations.NotThreadSafe not found - continuing with a stub.
[warn] Caught: java.lang.NullPointerException while parsing annotations in ~/.ivy2-p2/cache/org.opensaml/xmltooling/jars/xmltooling-1.3.4.jar(org/opensaml/xml/util/IDIndex.class)
[error] error while loading AttributeMap, class file '~/.ivy2-p2/cache/org.opensaml/xmltooling/jars/xmltooling-1.3.4.jar(org/opensaml/xml/util/AttributeMap.class)' is broken
[error] (class java.lang.RuntimeException/bad constant pool index: 0 at pos: 12058)

Adicionar explicitamente uma dependência jcip-annotations-1.0.jarresolveu o problema.

mn2013
fonte