2015-10-29 1 views
1

Я использую библиотеку org.zeromq java для ZMQ, и он отлично работает в области развертывания и когда я запускаю тесты внутри IntelliJ, но если я попробую запустить тот же тест через SBT из командной строки на той же машине, он терпит неудачу с:Опрос ZMQ работает в приложении и тестируется в IntelliJ, но сбой под sbt/scalatest

java.lang.AbstractMethodError: com.sun.jna.Structure.getFieldOrder()Ljava/util/List; 
    at com.sun.jna.Structure.fieldOrder(Structure.java:868) ~[jna-4.0.0.jar:4.0.0 (b2)] 
    ... (8 lines omitted) 
    at org.zeromq.zmq_msg_t.<init>(zmq_msg_t.java:21) ~[zeromq-scala-binding_2.10-0.0.7.jar:0.0.7] 
    at org.zeromq.ZMQ$Socket.newZmqMessage(ZMQ.java:453) ~[zeromq-scala-binding_2.10-0.0.7.jar:0.0.7] 
    at org.zeromq.ZMQ$Socket.send(ZMQ.java:368) ~[zeromq-scala-binding_2.10-0.0.7.jar:0.0.7] 

где тест просто:

class ZeroMQSpec extends FlatSpec with Matchers with LazyLogging { 

    "zeroMQ" should "be able to just send something" in { 
    val context = ZMQ.context(1) 
    val socket = context.socket(ZMQ.PAIR) 
    socket.bind("inproc://zmqtest") 
    logger.debug("start polling") 
    try { 
     socket.send(Array[Byte](1, 2), 0) 
     logger.debug("done polling") 
    } catch { 
     case e: Throwable => logger.error("ZMQ failed", e) 
    } 
    } 

send это всего лишь пример. То же самое происходит для recv или poll.

Поскольку тот же тест проходит при запуске под IntelliJ на том же компьютере, и ZMQ также работает в производственном коде, он, похоже, не связан с установленным ZMQ, а скорее как JVM связывается с ним. К сожалению, я не знаю, как продолжить устранение этого.

Update

Движимые @cdshines вопрос, я смотрел на то, что ЮНА потребности в пути к классам, чтобы работать и идти по this, мне нужно platform.jar и jna.jar. В IntelliJ они оба из моего кеша плюща:

file:/Users/arne/.ivy2/cache/net.java.dev.jna/jna/jars/jna-3.0.9.jar 
file:/Users/arne/.ivy2/cache/net.java.dev.jna/jna/jars/jna-4.0.0.jar 
file:/Users/arne/.ivy2/cache/net.java.dev.jna/platform/jars/platform-3.4.0.jar 

, который я считаю, SBT также должен решить. Так как это не так, есть ли способ заставить SBT сделать это?

Update 2

Добавлено

"net.java.dev.jna" % "jna" % "4.0.0" % "test", 
"net.java.dev.jna" % "jna-platform" % "4.0.0" % "test", 

моих зависимостей. Нет изменений в поведении

+0

Можете ли вы опубликовать путь к классам для обоих случаев? – tkroman

+0

Я использую 'ClassLoader.getSystemClassLoader' для доступа к пути к классам, а в IntelliJ он выводит то, что я ожидаю, но под sbt он просто печатает' файл: /usr/local/Cellar/sbt/0.13.5/libexec/sbt-launch.jar', который не может быть прав, поскольку все работает. Есть ли другой способ определить путь к классам? –

ответ

1

Ваша версия zeromq-scala-binding зависит от версии JNA 3.0.9, но вы используете ее с версией JNA 4.0.0, которая не совместима с бинарными.

Вы должны исключить JNA 4 из любой другой зависимости, втягивающей ее. Вы можете использовать sbt-dependency-graph, чтобы узнать, какой из них.

Как правило, я был бы напуган о нарушении другой зависимости, заставив ее использовать JNA 3, но вы говорите, что она работает в производстве, поэтому вы должны быть в порядке.

+0

Используя зависимость-граф, я обнаружил, что версия 'jna' выше не используется ничем (поэтому я предполагаю, что это просто IntelliJ. Я вручную включил' jna 3.0.9' и сделал sbt clean, скомпилировал, а затем запустил test, но все равно получаю ту же ошибку. Возвращаемся к использованию 'jeromq' на данный момент. –

+0

IntelliJ должен быть неработоспособным. У вас возникла проблема с запуском командной строки SBT, а в трассировке стека есть« jna-4.0.0 » Что-то должно быть втянуто. Я думаю, что sbt-dependency-graph имеет флаг, показывающий больше зависимостей в его выходе, но я не могу думать об этом. – dwickern

+0

Полностью даже не заметил, что банка была в стеке. Определенно странно, потому что 'what-depends-on net.java.dev.jna jna 4.0.0' сообщает об использовании 4.0.0 в sbt. Получил еще больше копаний. –

 Смежные вопросы

  • Нет связанных вопросов^_^