0

我正在使用 Moneta JavaMoney 1.3 来获取汇率:

CurrencyUnit base = Monetary.getCurrency(...);
CurrencyUnit term = Monetary.getCurrency(...);
ExchangeRateProvider xrates = MonetaryConversions.getExchangeRateProvider();
ExchangeRate xrate = xrates.getExchangeRate(base, term);

如果我在 Eclipse 中运行代码,它可以正常工作。但是在使用 Maven 构建一个 jar 并从命令行运行该 jar 之后,ExchangeRateProvider.getExchangeRate(base, term)返回 null。

我还尝试指定 ExchangeRateProvider:ExchangeRateProvider xrates = MonetaryConversions.getExchangeRateProvider("ECB");在 Eclipse 中一切正常,从命令行它抛出一个 MonetoryException 说“无效的 ExchangeRateProvider(未找到):ECB”

这个问题提到了同样的问题:“因为如果我在没有 bp 的情况下使用对 money-api 的依赖,我会得到空值。” 我尝试了接受的答案:

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 中工作,但从命令行返回 null。这与构建jar时的依赖关系有关吗?我正在使用关闭最小化的 Maven 阴影插件。

还是我也应该使用 moneta-bp?会很奇怪,因为 moneta-bp 是作为 Java 7 的反向端口构建的,而我正在使用 Java 8。还有其他想法吗?

提前致谢!

编辑:

从 Eclipse 运行 ExchangeRateProvider 是org.javamoney.moneta.spi.CompoundRateProvider. 从命令行它是org.javamoney.moneta.convert.internal.IdentityRateProvider. 查看 IdentityRateProvider 的代码,它返回 null 是有道理的。但是如何获得 CompoundRateProvider?

4

1 回答 1

0

我没有使用 Maven shade 插件,而是尝试了这个解决方案,它现在似乎可以工作了。

于 2019-04-06T19:11:52.723 回答