Błąd zepsutej klasy w przypadku Joda Time używającego Scali

91

Dodam repozytorium Joda Time do SBT z

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

Wtedy wesoło używam tego w ten sposób:

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

Ale kiedy kompiluję projekt w SBT, otrzymuję paskudny:

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

Wypróbowałem wersję 2.0 joda-time, ale pojawia się ten sam błąd.

Jacek
źródło

Odpowiedzi:

176

Dodaj tę zależność:

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

Jest to opcjonalna zależność czasu joda. Musiałem to dodać w moim własnym projekcie, aby kompilator scala zaakceptował pracę z joda-time jar.

Twój problem wydaje się być taki sam.

Wersja jest w momencie edycji, najnowsze wersje można znaleźć tutaj

David Pierre
źródło
61
W przyszłości powodem, dla którego nie jest to opcjonalne dla Scali, jest to, że kompilator Java może załadować klasę z brakującymi adnotacjami, a Scala tego nie robi. Miałem ten sam problem, np. Z Guavą i JSR-305.
Alexey Romanov
pracował dla mnie 12 lutego 2013 r. "joda-time" % "joda-time" % "2.1"i"org.joda" % "joda-convert" % "1.2"
Dustin Getz
9
niedopuszczalne jest, aby biblioteka nie działała, ponieważ ktoś pomyślał, że byłoby pragmatyczne oddzielenie niektórych bibliotek. Zwłaszcza biblioteka czasu java defacto.
Hassan Syed
Nie jestem pewien w 100%, ale ta zależność wpływa na zachowanie jodatime. Mam jeden projekt z kilkunastoma zależnościami, ale bez joda-converttego toString dla Datetime jest yyyy-mm-ddThh-mm-ss. Stworzyłem prosty projekt z jodatimei joda-convertzależnościami, więc w nim mam yyyy-mm-ddThh-mm-ss.000Z.
Cherry
5
@ user2829759 Załóżmy, że masz zależność, a.jarktóra zawiera @B class A, skąd @Bpochodzi adnotacja b.jar. W Javie można używać Aw kodzie, jeśli masz a.jarnie b.jarna ścieżce kompilacji; w Scali nie możesz.
Alexey Romanov
1

Miałem podobny problem:

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

Jawne dodanie zależności jcip-annotations-1.0.jarrozwiązało problem.

mn2013
źródło