Java.lang.NoSuchFieldError: INSTANCE в bitpay SDK

Я хочу реализовать этот код

public void testGetExchangeRate() throws Exception
{
    ECKey key = KeyUtils.createEcKey();

    String clientName = "server 1";
    BitPay bitpay = new BitPay(key, clientName);

    if (!bitpay.clientIsAuthorized(BitPay.FACADE_MERCHANT))
    {
        // Get Merchant facade authorization code
        String pairingCode = bitpay.requestClientAuthorization(
            BitPay.FACADE_MERCHANT);

        // Signal the device operator that this client needs to
        // be paired with a merchant account.
        System.out.print("Info: Pair this client with your merchant account using the pairing Code: " + pairingCode);
        throw new BitPayException("Error:client is not authorized for Merchant facade");
    }
}

Я включил эти зависимости:

<dependency>
    <groupId>com.github.bitpay</groupId>
    <artifactId>java-bitpay-client</artifactId>
    <version>v2.0.4</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.5</version>
    <type>jar</type>
</dependency>

Но когда я запускаю код, я получаю:

testGetExchangeRate(com.payment.gateway.bitpay.impl.BitpayImplTest)  Time elapsed: 1.665 sec  <<< ERROR!
java.lang.NoSuchFieldError: INSTANCE
    at com.payment.gateway.bitpay.impl.BitpayImplTest.testGetExchangeRate(BitpayImplTest.java:55)

Вопрос. Можете ли вы дать несколько советов, как я могу это исправить?

Ответ 1

Глядя на зависимости maven файла pom.xml проекта библиотеки на github, хотя и не та же артефактная версия, вы можете видеть, что java-bitpay-client зависит от нескольких библиотек от org.apache.httpcomponents:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>fluent-hc</artifactId>
    <version>4.3.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient-cache</artifactId>
    <version>4.3.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.3</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.3.1</version>
</dependency>

Среди них:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.3</version>
</dependency>

В ваших зависимостях у вас вместо этого есть httpcore version 4.4.5, следовательно, существует конфликт <зависимостей , также отмеченный Jacob в комментариях и связанных аналогичный вопрос.

Через механизм посредничества Maven, ваша сборка выберет последнюю версию 4.4.5, потому что она явно объявлена ​​среди ваших зависимостей, поэтому во время выполнения java-bitpay-client в пути к классам будет использоваться другая версия одной из его зависимостей, что может привести к окончательному исключению.

Возможным решением было бы удалить зависимость httpcore от вашего dependencies и позволить ему войти в путь к классам через транзитивные зависимости (тогда должна входить версия 4.3).

Вы также можете подтвердить описание выше, выполнив консоль в своем проекте:

mvn dependency:tree -Dincludes=com.github.bitpay

Вы должны получить среди других транзитивных зависимостей также httpcore.


Боковое примечание. Я вижу, что вы определили зависимость с type со значением jar. Вы можете опустить это, jar является значением по умолчанию для зависимостей type, то есть зависимостями по умолчанию являются файлы jar. От официального ссылка pom:

type. Соответствует зависимому артефакту packaging. По умолчанию это значение jar.