2016-09-07 63 views
11

我想要實現this代碼java.lang.NoSuchFieldError的:比如在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

縱觀pom.xml文件上github庫項目的Maven依賴,雖然不是同一工件的版本,你可以看到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> 

在你的依賴你,而不是有4.4.5httpcore版本,因此顯然是有依賴衝突,同樣在的評論和linked類似的問題中也指出。

通過Maven dependency mediation機制,你的版本將搭載最新,4.4.5版本,因爲它明確地定義你的依賴中聲明,因此在運行時java-bitpay-client將在類路徑中有不同的版本,它的一個依賴,這可能會導致最後的例外。然後

一個可能的解決辦法是從您的dependencies刪除httpcore依賴,並讓它進入通過傳遞依賴的類路徑(版本4.3則應該進入)。

您也可以通過以上從控制檯上項目運行證實其描述:

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

你應該得到的,其他的傳遞依賴外,也httpcore


附註:我看到您所定義的具有價值jartype的依賴。你可以省略,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-conflicts-how-to-fix-it)這又是由於版本問題,類將軟件包從版本'4.3'移動到了'4.4',因此在客戶端庫使用時依賴於後一版本前者。 –

+0

另一種方法是通過在最新版本的「依賴關係」部分重新聲明它們來更改整個'httpcomponents'系列的版本,因此您可以在整個系列中始終使用新版本。也就是說,採取上面報告的依賴關係並更改它們的版本。 –

相關問題