Erreur de classe cassée avec Joda Time en utilisant Scala

91

J'ajoute le référentiel Joda Time à SBT avec

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

Ensuite, je l'utilise joyeusement comme ceci:

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

Mais, lorsque je compile le projet en SBT, je reçois un méchant:

[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)

J'ai essayé la version 2.0 de joda-time, mais j'obtiens la même erreur.

Jack
la source

Réponses:

177

Ajoutez cette dépendance:

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

C'est une dépendance facultative de joda-time. J'ai dû l'ajouter dans mon propre projet pour que le compilateur scala accepte de travailler avec le fichier joda-time.

Votre problème semble être le même.

La version est celle au moment de l'édition, les dernières versions peuvent être trouvées ici

David Pierre
la source
61
Pour l'avenir, la raison pour laquelle ce n'est pas facultatif pour Scala est que le compilateur Java peut charger une classe avec des annotations manquantes, et Scala ne le fait pas. J'ai eu le même problème, par exemple, avec Guava et JSR-305.
Alexey Romanov
travaillé pour moi le 12 février 2013, "joda-time" % "joda-time" % "2.1"et"org.joda" % "joda-convert" % "1.2"
Dustin Getz le
9
il est inacceptable qu'une bibliothèque ne fonctionne pas parce que quelqu'un a pensé qu'il serait pragmatique de séparer certaines bibliothèques. Surtout la bibliothèque de temps defacto de java.
Hassan Syed
Je ne suis pas sûr à 100%, mais cette dépendance affecte le comportement de jodatime. J'ai un projet avec une douzaine de dépendances, mais sans joda-convertcela, toString pour Datetime est yyyy-mm-ddThh-mm-ss. J'ai créé un projet simple avec jodatimeet joda-convertdépendances, donc je l'ai yyyy-mm-ddThh-mm-ss.000Z.
Cherry
5
@ user2829759 Supposons que vous ayez une dépendance a.jarqui contient a @B class A, d'où @Bvient l' annotation b.jar. En Java, vous pouvez utiliser Adans votre code si vous n'en avez a.jarpas b.jarsur le chemin de construction; à Scala, vous ne pouvez pas.
Alexey Romanov
1

Je rencontrais un problème similaire:

[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)

L'ajout explicite d'une dépendance a jcip-annotations-1.0.jarrésolu le problème.

mn2013
la source