Ошибка класса с нарушением Joda Time с использованием Scala

91

Я добавляю репозиторий Joda Time в SBT с помощью

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

Тогда я с удовольствием использую это так:

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

Но когда я компилирую проект в SBT, я получаю неприятное:

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

Я попробовал версию 2.0 joda-time, но получил ту же ошибку.

Джек
источник

Ответы:

176

Добавьте эту зависимость:

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

Это необязательная зависимость joda-time. Мне пришлось добавить его в свой собственный проект, чтобы компилятор scala принял работу с joda-time jar.

Кажется, ваша проблема такая же.

Версия на момент редактирования, последние версии можно найти здесь

Давид Пьер
источник
61
В будущем причина того, что это не является обязательным для Scala, заключается в том, что компилятор Java может загружать класс с отсутствующими аннотациями, а Scala - нет. У меня была такая же проблема, например, с Guava и JSR-305.
Алексей Романов
работал у меня 12 фев 2013, "joda-time" % "joda-time" % "2.1"и"org.joda" % "joda-convert" % "1.2"
Дастин Гетц
9
недопустимо, чтобы библиотека не работала, потому что кто-то подумал, что было бы прагматично хранить отдельные библиотеки отдельно. Особенно java-библиотека времени defacto.
Hassan Syed
Я не уверен на 100%, но эта зависимость влияет на поведение jodatime. У меня есть один проект с десятком зависимостей, но без joda-converttoString для Datetime есть yyyy-mm-ddThh-mm-ss. Я создал простой проект с jodatimeи joda-convertзависимостями, так что в нем есть yyyy-mm-ddThh-mm-ss.000Z.
Cherry
5
@ user2829759 Допустим, у вас есть зависимость, a.jarкоторая содержит @B class A, откуда @Bберется аннотация b.jar. В Java, вы можете использовать Aв вашем коде , если у вас есть a.jarбез b.jarна пути сборки; в Scala это невозможно.
Алексей Романов
1

Я столкнулся с аналогичной проблемой:

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

Явное добавление зависимости jcip-annotations-1.0.jarрешило проблему.

mn2013
источник