#java #java-module #java-platform-module-system #picocli #jline3
Вопрос:
В проекте с несколькими модулями мы хотим использовать picocli с jline для создания консольного приложения. Для каждого модуля мы создали module-info.java . Но с picocli мы не можем скомпилировать наше приложение. у нас есть множество ошибок, таких как
module info.picocli.shell.jline3 reads package org.jline.console from both org.jline.console and org.jline
module info.picocli.shell.jline3 reads package org.jline.console.impl from both org.jline.console and org.jline
module info.picocli.shell.jline3 reads package org.jline.keymap from both org.jline.reader and org.jline
the unnamed module reads package org.jline.keymap from both org.jline.reader and org.jline
the unnamed module reads package org.jline.reader from both org.jline.reader and org.jline
...
мы включили следующие зависимости с помощью gradle
dependencies {
implementation 'org.fusesource.jansi:jansi:2.3.4'
implementation 'info.picocli:picocli:4.6.1'
implementation 'info.picocli:picocli-shell-jline3:4.6.1'
annotationProcessor 'info.picocli:picocli-codegen:4.6.1'
}
и наш java-modules.info
выглядит так
module foo.bar.app {
exports foo.bar.app;
requires info.picocli;
requires info.picocli.shell.jline3;
requires org.jline;
requires org.fusesource.jansi;
}
Я последовал совету в FAQ https://github.com/remkop/picocli/wiki/Java-9-modules но из этого ничего не вышло.
Если мы отключим модули Java, приложение может быть создано и запущено как должно.
У кого-нибудь была подобная проблема и знает несколько советов?
Комментарии:
1. поскольку модули
org.jline.console
иorg.jline.reader
на самом деле не являются частью вашего объявления модуля, я предполагаю, что они присутствуют в пути к модулю транзитивно… оставляя два альтернативных варианта — один, вы гарантируете, нужны они вам или нет, если нет, они не должны разрешаться транзитивно ни в пути к модулю (и должны быть в пути к классу), ни в двух, вы ожидаете, что владельцы библиотек будут поддерживать свои модули, чтобы не экспортировать конфликтующие пакеты, что означает, что они соответственно переименовывают пакеты илиизвлеките общий фрагмент кода в другой модуль