как исключить файл JAR, который упакован как Uber JAR приложения - PullRequest
0 голосов
/ 03 октября 2019

Существует приложение, работающее с classpath с подстановочным знаком *

, например, java -cp / opt / sampleapp / lib / * Main

, в котором установлена ​​более старая версия joda-time (1.8.), который не имеет метода DateTime.now () и доступен из 2.x версий joda-time. Примечание:

Это время joda (1.8) упаковано в другой jar (файл jruby-jar-1.6.8.jar)

Я пишу тестовое приложение, которое использует версию joda-time (выше 2.x), которая имеет метод DateTime.now () и используется моим классом java. Я должен отправить файл приложения (jar) в работающий образец приложения, чтобы запустить его. К сожалению, более старая версия выбирается во время выполнения моего тестового приложения, которое вызывает

Причина: java.lang.NoSuchMethodError: org.joda.time.DateTime.now()Lorg/joda/time/DateTime;

Если я удаляю старую версию jruby (1.6.8.jar) и замените его на jruby (1.7.18), такой ошибки нет. Я использую maven в качестве инструмента для сборки и использовал maven shaded плагин для создания Uber JAR. Как упомянуть в моем приложении, чтобы не выбирать joda-time (1.8) внутри jruby-1.6.8.jar и выбирать правильную версию файла joda-time-2.x jar в моем тестовом приложении.

1 Ответ

1 голос
/ 03 октября 2019

Это сложно.

Ваш jruby JAR нарушает правила, включая классы времени joda. Я могу придумать разные подходы, у каждого из которых есть свои недостатки:

  1. Перейти на более новую версию jruby, у которой нет проблем.
  2. Возьмите старую версию jruby и управляйте ею. Загрузите его, удалите классы joda-time и загрузите его в свой maven-репозиторий с версией 1.6.8-fixed.
  3. Затените другую версию joda для своего тестового приложения.
...