GVKun编程网logo

java.lang.NoSuchMethodError:Java EE应用程序中的org.apache.commons.codec.binary.Base64.encodeBase64String()

7

在本文中,我们将详细介绍java.lang.NoSuchMethodError:JavaEE应用程序中的org.apache.commons.codec.binary.Base64.encodeBas

在本文中,我们将详细介绍java.lang.NoSuchMethodError:Java EE应用程序中的org.apache.commons.codec.binary.Base64.encodeBase64String的各个方面,并为您提供关于的相关解答,同时,我们也将为您带来关于Android studio java.lang.NoSuchMethodError: 没有静态方法 encodeBase64URLSafeString([B)Ljava/lang/String;、android – NoSuchMethodError:java.lang.Long.hashCode、Android上的Scala:java.lang.NoSuchMethodError:java.lang.String.isEmpty、Base64 Apache Commons Codec作法的有用知识。

本文目录一览:

java.lang.NoSuchMethodError:Java EE应用程序中的org.apache.commons.codec.binary.Base64.encodeBase64String()

java.lang.NoSuchMethodError:Java EE应用程序中的org.apache.commons.codec.binary.Base64.encodeBase64String()

我正在开发需要Base64编码/解码的Java EE应用程序

所以我commons-codec-1.5.jarWEB-INF/lib应用程序的文件夹中添加并使用了

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

在Java文件中。

在编译期间,当我输入时Base64,它表明encodeBase64Stringmethod可用。但是在运行时,它将引发如下异常:

java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String

我在构建路径中有JAR,但我仍然不明白为什么它会引发上述错误。

答案1

小编典典

该方法在Commons Codec
1.4中引入。此异常表示您在Web应用程序的运行时类路径中的其他位置具有Commons
Codec的较旧版本,该版本在类加载中具有优先权。检查webapp运行时类路径覆盖的所有路径。这包括除其他外Webapp/WEB-INF/libYourAppServer/libJRE/libJRE/lib/ext。最后删除或升级有问题的旧版本。


更新 :根据评论,您似乎无法找到它。我只能建议使用该较新的方法对代码进行注释,然后将以下行放在适当的位置:

System.out.println(Base64.class.getProtectionDomain().getCodeSource().getLocation());

那应该打印到运行时从中加载JAR文件的绝对路径。


更新2
:这似乎指向正确的文件。抱歉,我现在无法解释您的问题。我所建议的只是使用其他Base64类似的方法encodeBase64(byte[]),然后newString(bytes)自己构建一个。或者,您可以删除该库并使用其他Base64编码器,例如this。

Android studio java.lang.NoSuchMethodError: 没有静态方法 encodeBase64URLSafeString([B)Ljava/lang/String;

Android studio java.lang.NoSuchMethodError: 没有静态方法 encodeBase64URLSafeString([B)Ljava/lang/String;

如何解决Android studio java.lang.NoSuchMethodError: 没有静态方法 encodeBase64URLSafeString([B)Ljava/lang/String;?

我正在尝试使用 Upbit API 调用我的钱包信息。

示例代码来自https://docs.upbit.com/reference#%EC%9E%90%EC%82%B0-%EC%A1%B0%ED%9A%8C

这是我的代码。

(删除了我的 API 访问密钥和秘密密钥)


package gachon.mpclass.apitest2;

import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.util.UUID;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;


import android.util.Base64;
import org.apache.http.httpentity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;


import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NetworkThread thread = new NetworkThread();
        thread.start();
    }


    class NetworkThread extends Thread {

        public void run() {


            try {

                String accessKey = ("api key value");
                String secretKey = ("api key value");
                String serverUrl = ("https://api.upbit.com");


                Algorithm algorithm = Algorithm.HMAC256(secretKey);
                String jwtToken = JWT.create()
                        .withClaim("access_key",accessKey)
                        .withClaim("nonce",UUID.randomUUID().toString())
                        .sign(algorithm);

                String authenticationToken = "Bearer " + jwtToken;
                HttpClient client = HttpClientBuilder.create().build();
                HttpGet request = new HttpGet(serverUrl + "/v1/accounts");
                request.setHeader("Content-Type","application/json");
                request.addHeader("Authorization",authenticationToken);

                HttpResponse response = client.execute(request);
                httpentity entity = response.getEntity();


                System.out.println(EntityUtils.toString(entity,"UTF-8"));

            } catch (IOException e) {
                e.printstacktrace();
            }
        }

    }


}

SDK 版本为 30 和依赖项是

dependencies {

    implementation ''androidx.appcompat:appcompat:1.2.0''
    implementation ''com.google.android.material:material:1.3.0''
    implementation ''androidx.constraintlayout:constraintlayout:2.0.4''
    implementation filetree(dir: ''C:\\Users\\admin\\AndroidStudioProjects\\APITest2\\app\\libs'',include: [''*.aar'',''*.jar''],exclude: [])
    testImplementation ''junit:junit:4.+''
    androidTestImplementation ''androidx.test.ext:junit:1.1.2''
    androidTestImplementation ''androidx.test.espresso:espresso-core:3.3.0''
    compileOnly ''org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2''
    implementation group: ''org.apache.httpcomponents'',name: ''httpclient-android'',version: ''4.3.5''
    implementation ''com.fasterxml.jackson.core:jackson-databind:2.3.2''
    implementation group: ''commons-codec'',name: ''commons-codec'',version: ''1.10''
    implementation ''com.auth0.android:jwtdecode:2.0.0''
    api ''io.jsonwebtoken:jjwt-api:0.11.2''
    runtimeOnly ''io.jsonwebtoken:jjwt-impl:0.11.2''
    runtimeOnly(''io.jsonwebtoken:jjwt-orgjson:0.11.2'') { exclude group: ''org.json'',module: ''json''}
    runtimeOnly ''org.bouncycastle:bcprov-jdk15on:1.60''
    implementation ''com.android.support:multidex:1.0.3''

}

错误是

E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: gachon.mpclass.apitest2,PID: 21107
    java.lang.NoSuchMethodError: No static method encodeBase64URLSafeString([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of ''org.apache.commons.codec.binary.Base64'' appears in /system/framework/org.apache.http.legacy.jar)
        at com.auth0.jwt.JWTCreator.sign(JWTCreator.java:283)
        at com.auth0.jwt.JWTCreator.access$100(JWTCreator.java:23)
        at com.auth0.jwt.JWTCreator$Builder.sign(JWTCreator.java:264)
        at gachon.mpclass.apitest2.MainActivity$NetworkThread.run(MainActivity.java:48)

我尝试了很多库和依赖项,但仍然出现相同的错误。 我应该更改整个代码还是有任何工作依赖项?

解决方法

这个错误通常发生在类路径上的 jar 版本错误时,在这种情况下,可能是应用程序正在寻找后续 jar /system/framework/org.apache.http.legacy.jar 中的 Base64 类。看看这个提交 https://github.com/auth0/java-jwt/commit/7dea6ac54d5b5b8822a9f3ee41cc4666e250cc27#diff-66fdd511fc2a34e115ac3e635c97eb82b89c8b64e26ea09247712b9efa5e62f7

查看 auth0.jwt 项目,您可以看到在 JWTCreator.sign() 方法中调用 Base64.encodeBase64URLSafeString(byte []) 方法的位置,可能会抛出错误,因为类路径上的 Base64 类版本确实如此不包含该功能。 如果您发布整个 build.gradle 文件会很有帮助。

android – NoSuchMethodError:java.lang.Long.hashCode

android – NoSuchMethodError:java.lang.Long.hashCode

我在AbstractORM类的hashCode上有以下覆盖方法:
var _id = Random().nextLong()

override fun getId() = _id // AbstractORM class implements an interface that defines this method getId()

override fun hashCode() = getId().hashCode()

突然开始抛出以下异常:

FATAL EXCEPTION: main
java.lang.NoSuchMethodError: java.lang.Long.hashCode
   at com.company.ormlite.AbstractORM.hashCode(AbstractORM.kt:271)
   at java.util.HashMap.put(HashMap.java:390)
   at java.util.HashSet.add(HashSet.java:95)
   at kotlin.collections.ArraysKt___ArraysKt.toCollection(_Arrays.kt:6518)
   at kotlin.collections.ArraysKt___ArraysKt.toSet(_Arrays.kt:6853)
   at kotlin.collections.SetsKt__SetsKt.setof(Sets.kt:32)
   at com.company.android.tna.orm.DataManager.getTables(DataManager.kt:16)
   at com.company.android.tna.orm.DataManager.getTables(DataManager.kt:10)
   at com.company.android.core.utils.AbstractDataManager.create(AbstractDataManager.kt:25)
   at com.company.android.core.utils.AbstractDataManager.start(AbstractDataManager.kt:44)
   at com.company.android.core.utils.AbstractZKApplication.onCreate(AbstractZKApplication.kt:54)
   at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
   at android.app.ActivityThread.access$1300(ActivityThread.java:130)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:4745)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
   at dalvik.system.NativeStart.main(Native Method)

这让我傻眼了几个原因:

> Java和Kotlin中的所有类都有hashCode方法,因为它继承自Object或Any.
>如何找不到Android SDK本身的方法?如果SDK不存在,它是如何运行的?
>在IntelliJ IDEA中检查该行代码时,它会将我发送到kotlin.Any.hashCode,而不是java.lang.Long.hashcode.

任何见解都将非常感谢,提前感谢.

解决方法

检查编译后的AbstractORM类后,我发现了问题:较新的Kotlin版本为该行生成了不同的代码
getId().hashCode()

Kotlin 1.1.2生成以下代码:

Long.valueOf(this.getId()).hashCode()

而较新版本的Kotlin会生成其他代码:

Long.hashCode(this.getId())

问题是Android中的这个静态方法Long.hashCode(long)仅在API 24(Android 7.0)之后可用,而我正在测试具有版本4.1(API 16)的Android设备.

我正在通过手动计算哈希码来暂时修复,尽管我已经打开了一个问题here.

override fun hashCode() = (getId() xor getId().ushr(32)).toInt()

如issue所述,切换到Kotlin编译器的Java 1.6目标会生成旧的兼容代码.

PS:我不是100%肯定那些Kotlin版本,请带上一粒盐.

Android上的Scala:java.lang.NoSuchMethodError:java.lang.String.isEmpty

Android上的Scala:java.lang.NoSuchMethodError:java.lang.String.isEmpty

我在 Android 2.2.1上得到以下异常:

java.lang.NoSuchMethodError:java.lang.String.isEmpty

我从Scala调用text.isEmpty.任何想法,如何解决这个问题?

解决方法

使用JRE / JDK 1.5,它在String上没有isEmpty方法.这将避免Scala使用1.6的isEmpty而不是自己的情况.如果您也有Java库,请务必选择与1.5兼容的库.

Base64 Apache Commons Codec作法

Base64 Apache Commons Codec作法

final Base64 base64 = new Base64();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//编码
final String encodedText = base64.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(base64.decode(encodedText), "UTF-8"));

final Base64 base64 = new Base64();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//编码
final String encodedText = base64.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(base64.decode(encodedText), "UTF-8"));

今天的关于java.lang.NoSuchMethodError:Java EE应用程序中的org.apache.commons.codec.binary.Base64.encodeBase64String的分享已经结束,谢谢您的关注,如果想了解更多关于Android studio java.lang.NoSuchMethodError: 没有静态方法 encodeBase64URLSafeString([B)Ljava/lang/String;、android – NoSuchMethodError:java.lang.Long.hashCode、Android上的Scala:java.lang.NoSuchMethodError:java.lang.String.isEmpty、Base64 Apache Commons Codec作法的相关知识,请在本站进行查询。

本文标签: