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がありますが、それでもなぜ上記のエラーがスローされるのか理解できません。
その方法は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エンコーダーを使用することもできます。
GWTなどの一部のGoogleツールには、1.4より前のBase64クラスを持つcommons-codecの埋め込みバージョンがあります。そのようなツールを必要とするコードの部分のみが依存関係を見ることができるようにプロジェクトをリファクタリングすることにより、そのようなツールJARをコードにアクセスできないようにする必要があるかもしれません。
@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で証明されます。 。
ダウンロード このjar
それは私の問題を解決しました、これは1.7です。
JBoss 4.2.3で同じ問題に直面しましたGA Webアプリケーションのデプロイ時に。commons-codec1.6 jarをC:\ jboss-4.2.3.GA \にコピーすることで問題を解決しました。 server\default\lib
JREフォルダに「commons-codec-1.8.jar」を追加してみてください!
クラスパスにApache Commons Codec library 1.4以上が必要です。このライブラリにはBase64実装が含まれています。
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()));
ここでエンコードされるのは、デコードされる文字列変数です