web-dev-qa-db-ja.com

java.lang.NoSuchMethodError:org.Apache.commons.codec.binary.Base64.encodeBase64String()in Java EEアプリケーション

Base64エンコード/デコードが必要なJava EEアプリケーションを開発しています

そこで、アプリケーションのcommons-codec-1.5.jarフォルダーにWEB-INF/libを追加して使用しました

import org.Apache.commons.codec.binary.Base64;

Java=ファイル。

コンパイル時に、Base64と入力すると、encodeBase64Stringメソッドが使用可能であることが示されます。ただし、実行時に次のような例外がスローされます。

Java.lang.NoSuchMethodError:org.Apache.commons.codec.binary.Base64.encodeBase64String

ビルドパスにJARがありますが、それでもなぜ上記のエラーがスローされるのか理解できません。

39
Sreeram

その方法はCommons Codec 1.4で 導入 でした。この例外は、クラスローディングで優先されたwebappのランタイムクラスパスのどこかにCommons Codecの古いバージョンがあることを示しています。 webappのランタイムクラスパスに含まれるすべてのパスを確認します。これには、特に_Webapp/WEB-INF/lib_、_YourAppServer/lib_、_JRE/lib_および_JRE/lib/ext_が含まれます。最後に、問題のある古いバージョンを削除またはアップグレードします。


更新:コメントによると、あなたはそれを見つけることができないようです。その新しいメソッドを使用してコードをアウトコメントすることのみを提案し、次の行を配置します。

_System.out.println(Base64.class.getProtectionDomain().getCodeSource().getLocation());
_

これにより、実行時にロードされたJARファイルへの絶対パスが出力されます。


Update 2:これは正しいファイルを指しているように見えました。申し訳ありませんが、今はもう問題を説明できません。私が提案できるのは、encodeBase64(byte[])のような別の_Base64_メソッドを使用してから、自分でnew String(bytes)を作成するだけです。または、そのライブラリを削除して、たとえば this one のような別のBase64エンコーダーを使用することもできます。

73
BalusC

GWTなどの一部のGoogleツールには、1.4より前のBase64クラスを持つcommons-codecの埋め込みバージョンがあります。そのようなツールを必要とするコードの部分のみが依存関係を見ることができるようにプロジェクトをリファクタリングすることにより、そのようなツールJARをコードにアクセスできないようにする必要があるかもしれません。

6
Adam Augusta

@Adam Augustaが正しい、もう一つ

Apache-HTTPクライアントjarも、いくつかのgoogle-apiと同じカテゴリに分類されます。

org.Apache.httpcomponents.httpclient_4.2.jarおよびcommons-codec-1.4.jar両方のクラスパスで、この問題が発生する可能性が非常に高いです。

これは、初期バージョンのcommon-codecを内部で使用していると同時に、誰かがcommon-codecを明示的にclasspathで使用しているすべてのjarで証明されます。 。

6
pkm1986

ダウンロード このjar

それは私の問題を解決しました、これは1.7です。

2
asifaftab87

JBoss 4.2.3で同じ問題に直面しましたGA Webアプリケーションのデプロイ時に。commons-codec1.6 jarをC:\ jboss-4.2.3.GA \にコピーすることで問題を解決しました。 server\default\lib

1
Ktonneh

JREフォルダに「commons-codec-1.8.jar」を追加してみてください!

1

クラスパスにApache Commons Codec library 1.4以上が必要です。このライブラリにはBase64実装が含まれています。

1
Mikhail Tanaev

org.Apache.commons.codec.binary.Base64 libraryを使用する場合、単にBase64のオブジェクトを作成し、それを使用してエンコードまたはデコードします

エンコードするには

Base64 ed = new Base64();

String encoded = new String(ed.encode( "Hello" .getBytes()));

「Hello」を、文字列形式でエンコードされるテキストに置き換えます。

デコードするには

Base64 ed = new Base64();

String decode = new String(ed.decode(encoded.getBytes()));

ここでエンコードされるのは、デコードされる文字列変数です

0
Karan