11

我想实现这段代码

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)

问题:您能给我一些建议,我该如何解决这个问题?

4

1 回答 1

1

查看githubpom.xml上库项目文件的maven依赖,虽然不是同一个artifact版本,但可以看到依赖来自以下几个库:java-bitpay-clientorg.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>

在您的依赖项中,您有httpcoreversion 4.4.5,因此显然存在依赖项冲突,正如Jacob在评论和链接的类似问题中也指出的那样。

通过Maven 依赖中介机制,您的构建将选择最新的 version 4.4.5,因为它在您的依赖项中明确声明,因此在运行时java-bitpay-client将在类路径中具有其依赖项之一的不同版本,这可能导致最终异常。

然后一个可能的解决方案是httpcore从您的依赖项中删除依赖项,dependencies并让它通过传递依赖项进入类路径(4.3然后应该进入版本)。

您还可以通过在项目的控制台上运行来确认上述描述:

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

除了其他传递依赖项之外,您还应该获得httpcore.


旁注:我看到您定义了一个type具有 value的依赖项jar。您可以省略,jar是依赖项的默认值type,即依赖项默认为 jar 文件。来自官方pom 参考

type:对应于依赖工件的packaging类型。这默认为jar.

于 2016-09-10T21:37:46.830 回答