Jar パッケージの競合

  • 原因の分析

    OSS Java SDK を使用しているときに次のエラーが発生した場合、プロジェクトでパッケージが競合している可能性があります。

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy
        at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
        at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:77)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.ssl.TrustStrategy
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 3 more
    					

    または、次のエラーが発生した場合。

    Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:82)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:95)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:104)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:62)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:572)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:174) 
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:158)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:125)
     at com.aliyun.oss.common.comm.DefaultServiceClient.createHttpClientConnectionManager(DefaultServiceClient.java:237)
     at com.aliyun.oss.common.comm.DefaultServiceClient.<init>(DefaultServiceClient.java:78)
     at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
     at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
     at OSSManagerImpl.upload(OSSManagerImpl.java:42)
     at OSSManagerImpl.main(OSSManagerImpl.java:63)
    					

    これは、OSS Java SDK は Apache httpclient 4.4.1 を使用しているのに対し、プロジェクトでは、Apache httpclient もしくは commons-httpclient jar を使用しているため、Apache httpclient 4.4.1 と競合しています。 プロジェクトで使用されている jar パッケージとそのバージョンを確認するため、OSS Java SDK を開き、mvn dependency:tree を実行します。 次の図は、Apache httpclient 4.3 を使用しているプロジェクトを示しています。



  • パッケージの競合を解消するには、2 つの方法があります。

    • 統合バージョンを使用します。 プロジェクトで Apache httpclient 4.4.1 と競合するバージョンを使用している場合、Apache httpclient 4.4.1 を使用します。また、pom.xml ファイル内にある、他のバージョンの Apache httpclient と依存関係にある部分を削除します。 プロジェクトで commons-httpclient を使用している場合についても、jar パッケージの競合が発生する可能性があります。 この場合は、commons-httpclient を削除します。
    • 依存関係にある競合を削除します。 プロジェクトが複数のサードパーティーと依存関係にある場合、各サードパーティーは複数のバージョンの Apache httpclient を使用している可能性があるため、プロジェクトに依存関係の競合が存在するかもしれません。 競合を解決するため、"exclusion" を使用します。 詳しくは、「Maven ガイド」をご参照ください。

    OSS Java SDK は次の jar パッケージバージョンに依存しています。 競合の解決方法は、httpclien と同様です。



ファイルの不足

  • 原因分析

    OSS Java SDKを使用しているときに次のエラーが発生した場合、プロジェクトに OSS Java SDK のコンパイルと実行に必要なファイルが不足している可能性があります。

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/auth/Credentials
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:76)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.auth.Credentials
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 3 more
    					

    または

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpContext
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:76)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.protocol.HttpContext
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 3 more
    					

    または

    Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder
            at com.aliyun.oss.internal.ResponseParsers.getXmlRootElement(ResponseParsers.java:645)
            at … … 
            at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:471)
            at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:465)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:82)
    Caused by: java.lang.ClassNotFoundException: org.jdom.input.SAXBuilder
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 11 more
    					

    OSS Java SDK が依存関係にあるパッケージは次のとおりです。

    • aliyun-sdk-oss-2.2.1.jar
    • hamcrest-core-1.1.jar
    • jdom-1.1.jar
    • commons-codec-1.9.jar
    • httpclient-4.4.1.jar
    • commons-logging-1.2.jar
    • httpcore-4.4.1.jar
    • log4j-1.2.15.jar

    上記パッケージでは、log4j-1.2.15.jar ファイル以外、すべてのファイルが必要です。 log4j-1.2.15.jar ファイルは、アクセスログを有効にする際に追加します。

  • 解決方法

    プロジェクトに依存関係にある OSS Java SDK を追加します。 以下、手順をご確認ください。

    • プロジェクトで Eclipse を使用している場合、「方法2: Eclipse プロジェクトに JAR パッケージをインポート」をご参照ください。
    • プロジェクトが Ant にある場合は、OSS Java SDK の依存関係にあるパッケージを、lib ディレクトリに追加します。
    • .javac ファイルまたは .java ファイルを直接使用している場合、-classpath コマンドまたは -cp コマンドを実行して、OSS Java SDK と依存関係にあるパッケージのパスを指定するか、Java SDK が“classpath” パスと依存関係にあるパッケージを保存します。

接続タイムアウト

  • 原因分析

    OSS Java SDK プログラムの実行時、次のエラーが発生した場合、考えられる原因はエンドポイントエラー、もしくはネットワークが利用できないためです。

    com.aliyun.oss.ClientException: SocketException
        at com.aliyun.oss.common.utils.ExceptionFactory.createNetworkException(ExceptionFactory.java:71)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:116)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:121)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111)
        at com.aliyun.oss.internal.OSSBucketOperation.getBucketInfo(OSSBucketOperation.java:1152)
        at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1220)
        at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1214)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:94)
    Caused by: org.apache.http.conn.HttpHostConnectException: Connect to oss-test.oss-cn-hangzhou-internal.aliyuncs.com:80 [oss-test.oss-cn-hangzhou-internal.aliyuncs.com/10.84.135.99] failed: Connection timed out: connect
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        ... 9 more
    					
  • 解決方法

    すばやくトラブルシューティングを行うため、ossutil を使用します。

org.apache.http.NoHttpResponseException: The target server failed to respond

  • 原因分析

    OSS Java SDK プログラムの実行時、次のエラーが発生します。



    有効期限切れの接続が使用されている場合、上記エラーが発生します。 このエラーは、旧バージョンの Java SDK 2.1.2 が使用されている場合にのみ発生します。

  • 解決方法

    OSS Java SDK を 2.1.2 以降のバージョンにアップグレードします。

Java プログラムの呼び出し時、OSS Java SDK が応答を停止

  • 原因分析

    Java プログラムが呼び出されたとき、OSS Java SDK が応答を停止します。 jstack -l pid コマンドを実行し、スタックを確認します。 エラー内容は次のとおりです。

    "main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000]
    java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
        at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138)
        at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306)
        at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185)
        at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
        at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229)
        at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629)
        at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617)
        at samples.HelloOSS.main(HelloOSS.java:49)
    					

    原因は、接続プールでの接続漏れです(ossObject の使用後、終了しないままでいた可能性が高い)。

  • 解決方法

    プログラムを調べて、接続漏れが発生していないことを確認します。 次のコードを使用して、ossObject を終了します。

    // Read an object.
    OSSObject ossObject = ossClient.getObject(bucketName, objectName);
    // Perform operations on OSS.
    // Close your ossObject.
    ossObject.close();
    					

接続の終了

  • 原因分析

    oSSClient.getObject の使用時に、次のようなエラーが発生した場合

    Exception in thread "main" org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 11990526; received: 202880
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:180)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:200)
        at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:103)
        at org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:128)
        at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228)
        at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:174)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at com.aliyun.oss.event.ProgressInputStream.close(ProgressInputStream.java:147)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at samples.HelloOSS.main(HelloOSS.java:39)
    					

    原因は、2 つのデータの読み込み間隔が 1 分間を超過したためです。 OSS では、2 つのデータの読み込み間隔が 1 分間を超過した場合、接続を終了します。

  • 解決方法

    データの処理間隔が指定されていおらず、データの一部を読み取る必要があるだけの場合は、読み取り中に接続が切断されないようにするため、「範囲のダウンロード」を使用します。

メモリリーク

  • 原因分析

    メモリリークは、OSS Java SDK プログラムが一定期間 (アクセストラフィックに基づき、数時間から数日) 実行されると発生します。 メモリ使用量の分析ツールとして、Eclipse Memory Analyzer(MAT) の使用を推奨します。 使用方法の詳細については、「Use MAT for Heap Dump File Analysis」をご参照ください。

    分析結果が次の図のようになっている (PoolingHttpClientConnectionManager が96% のメモリを占有している) 場合、メモリリークの原因はossClient.shutdown が呼び出されていないのに、新しい OSSClient が複数回実行されているためです。 結果として、メモリリークが発生しています。



  • a

    OSSClient が有効になった後、ossClient.shutdown が有効になっていることを確認します(併用する必要があります)。

ossClient.shutdown が呼び出し時、InterruptedException エラーが発生

  • エラーの原因

    OSSClient.shutdown が呼び出されるとき、次のエラーが発生します。

    java.lang.InterruptedException: sleep interrupted
            at java.lang.Thread.sleep(Native Method)
            at com.aliyun.oss.common.comm.IdleConnectionReaper.run(IdleConnectionReaper:76)
    					

    原因は、ossClient のバックエンドスレッド (IdleConnectionReaper) が定期的に接続を終了するためです。 IdleConnectionReaper スレッドがスリープモードのときに、ossClient.shutdown が呼び出されると、上記のエラーが発生します。

  • 解決方法

    OSS Java SDK 2.3.0 ではこのエラーの問題を修正してあります。

    OSS Java SDK 2.3.0 より前のバージョンをご使用の場合は、次のコードを使用してエラーを無視します。

    try {
        ossClient.shutdown();
    } catch(Exception e) {
    }
    					

その他のエラー

OSS から返されるその他のエラーの修正方法については、「エラーとトラブルシューティング」をご参照ください。