繁体   English   中英

使用.jar中的类时出现NoClassDefError

[英]NoClassDefError when using classes from a .jar

我试图在我的.java文件Tweetauthent中使用.jar文件中的类。 .jar文件在另一个目录中。 我向Twitter REST API发出请求以获取Bearertoken。 TweetAuthent在我运行时编译

     -javac -cp /path/to/jar Tweetauthent.java

这是代码

import java.io.BufferedReader;
import java.lang.StringBuilder;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URLEncoder;

public class Tweetauthent{
 static String consumerkey = "astring";
 static String consumersecret = "astring";
 static String endurl = "https://api.twitter.com/oauth2/token";

public static void main(String []args){

    Tweetauthent t = new Tweetauthent();
    try{
        System.out.println(t.requestBearerToken(endurl));
    }catch(IOException e){
        System.out.println(e);
    }   
}
public static String encodeKeys(String consumerKey,String consumerSecret){
    try{
        String encodedConsumerKey = URLEncoder.encode(consumerKey,"UTF-8");
        String encodedConsumerSecret = URLEncoder.encode(consumerSecret,"UTF-8");

        String fullKey = encodedConsumerKey + ":" + encodedConsumerSecret;
        byte[] encodedBytes = Base64.getEncoder().encode(fullKey.getBytes());
        return new String(encodedBytes);
    }catch(UnsupportedEncodingException e){
        return new String();
    }

}
public static String requestBearerToken(String endPointURL) throws IOException {
    HttpsURLConnection connection = null;
    String encodedCredentials = encodeKeys("<consumerkey>","<consumersecret>");
    try{
        URL url = new URL(endPointURL);
        connection = (HttpsURLConnection)url.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestProperty("Host","api.twitter.com");
        connection.setRequestProperty("User-Agent","TweetPersonalityAnalyzer");
        connection.setRequestProperty("Authorization","Basic " + encodedCredentials);
        connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
        connection.setRequestProperty("Content-Length","29");

        writeRequest(connection, "grant_type=client_credentials");

        JSONObject obj = (JSONObject)JSONValue.parse(readResponse(connection));

        if(obj != null){
            String tokenType = (String)obj.get("token_type");
            String token = (String)obj.get("access_token");

            return ((tokenType.equals("bearer")) && (token != null)) ? token : ""; 
        }
        return new String();

    }catch(MalformedURLException e){
        throw new IOException("Invalid endpoint URL specified.", e);
    }
    finally{
        if( connection != null){
            connection.disconnect();
        }
    }

}
public static boolean writeRequest(HttpsURLConnection connection, String textBody){
    try{
        BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
        wr.write(textBody);
        wr.flush();
        wr.close();

        return true;
    }
    catch(IOException e){
        return false;
    }
}
public static String readResponse(HttpsURLConnection connection){
    try {
        StringBuilder str = new StringBuilder();

        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line = "";
        while((line = br.readLine()) != null){
            str.append(line + System.getProperty("line.separator"));
        }
    return str.toString();
}catch(IOException e){
    return new String();
}

}

我运行时遇到的错误

   java Tweetauthent

    java.lang.NoClassDefFoundError: org/json/simple/JSONValue
          at Tweetauthent.requestBearerToken(Tweetauthent.java:61)
          at Tweetauthent.main(Tweetauthent.java:27)
    Caused by: java.lang.ClassNotFoundException: 
    org.json.simple.JSONValue
         at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
     ... 2 more

据我了解,当JVM无法找到.java文件用于编译的必要的类文件时,会引发NoClassDefFoundError。 是什么原因造成的? 有没有办法添加jar的路径-java? 哦,还有预期的consumerkey和秘密字符串。

更新:当我向Java添加类路径时

    java /path/to/jar Tweethauthent

我得到错误:找不到或加载主类Tweetauthent

任何帮助将不胜感激,谢谢!

您需要在java命令的-classpath-cp选项中引用运行时依赖项:

java -classpath /path/to/jar Tweetauthent

如果要使用参数运行,请将其作为参数添加到Java文件之后:

java -classpath /path/to/jar Tweetauthent <consumerkey> <consumersecret>

您遇到运行时类路径问题。

我看不到您如何设置运行时类路径。 您编译的事实是必要的,但不足。

您可能没有正确设置运行时类路径,或者JAR不属于您的软件包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM