Я использую Moneta JavaMoney 1.3 для получения обменного курса:
CurrencyUnit base = Monetary.getCurrency(...);
CurrencyUnit term = Monetary.getCurrency(...);
ExchangeRateProvider xrates = MonetaryConversions.getExchangeRateProvider();
ExchangeRate xrate = xrates.getExchangeRate(base, term);
Если я запускаю код в Eclipse, он работает нормально. Но после создания банки с Maven и запуска банки из командной строки, ExchangeRateProvider.getExchangeRate(base, term)
возвращает ноль.
Я также попытался указать ExchangeRateProvider: ExchangeRateProvider xrates = MonetaryConversions.getExchangeRateProvider("ECB");
В Eclipse все в порядке, из командной строки выдается исключение MonetoryException, говорящее «Invalid ExchangeRateProvider (not found): ECB»
В этом вопросе упоминается та же проблема: «Потому что, если я использую зависимость от money-api без bp, я получаю нулевое значение». Я попробовал принятый ответ:
ConversionQuery cq = ConversionQueryBuilder.of().setBaseCurrency(Base).setTermCurrency(Term).build();
MonetaryAmount zero = FastMoney.zero(Base);
ExchangeRateProvider xrates = MonetaryConversions.getExchangeRateProvider("ECB");
CurrencyConversion cc = xrates.getCurrencyConversion(cq);
ExchangeRate xrate = cc.getExchangeRate(zero);
Опять не повезло: работает в Eclipse, но возвращает ноль из командной строки. Это как-то связано с зависимостями при сборке фляги? Я использую плагин Maven Shade с выключенной минимизацией.
Или мне тоже использовать moneta-bp? Было бы странно, поскольку moneta-bp встроен в качестве бэкпорта для Java 7, а я использую Java 8. Есть еще идеи?
Заранее спасибо!
EDIT:
При запуске из Eclipse ExchangeRateProvider является экземпляром org.javamoney.moneta.spi.CompoundRateProvider
. Из командной строки это экземпляр org.javamoney.moneta.convert.internal.IdentityRateProvider
. Глядя на код IdentityRateProvider, становится понятно, что он возвращает ноль. Но как получить CompoundRateProvider?