2016-09-07 3 views
11

Я хочу реализовать this код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) 

Вопрос: Можете ли вы дать несколько советов, как я n исправить это?

+1

Возможный дубликат [это] (http://stackoverflow.com/questions/21622885/java-lang-nosuchfielderror-instance?rq=1). – Jacob

ответ

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 версии 4.4.5, следовательно, существует явная конфликт, как также указал Jacob в комментариях и linked подобный вопрос.

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

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

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

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

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


Примечание стороны: я вижу, что вы определили зависимость с type, имеющей значение jar. Вы можете опустить это, jar - значение по умолчанию для зависимостей type, то есть зависимости по умолчанию jar-файлы. Из официального pom reference:

type: Corresponds to the dependant artifact's packaging type. This defaults to jar .

+0

Я изменил версию на 4.3. Теперь я получаю java.lang.NoClassDefFoundError: org/apache/http/ssl/SSLContext – user1285928

+0

@ user1285928 вы, скорее всего, пропустили окончание 's', это' SSLContexts' и [по-видимому] (http://stackoverflow.com/questions/ 36914117/httpclient-jar-conflict-how-to-fix-it), это опять же из-за проблемы с версией, класс переместил пакет с версии '4.3' в' 4.4', поэтому что-то полагается на последнюю версию, когда клиентская библиотека использует бывший. –

+0

Другим подходом было бы изменить версию всей семьи 'httpcomponents', обновив ее в разделе' dependencies' с последней версией, поэтому вы последовательно будете использовать новую версию для всей семьи. То есть, возьмите зависимости, указанные здесь выше, и измените их версию. –

Смежные вопросы