简体   繁体   English

使用.jar中的类时出现NoClassDefError

[英]NoClassDefError when using classes from a .jar

I am attempting to use classes from a .jar file in a my .java file Tweetauthent. 我试图在我的.java文件Tweetauthent中使用.jar文件中的类。 The .jar file is in another directory. .jar文件在另一个目录中。 I make a request to the Twitter rest api to obtain a bearertoken. 我向Twitter REST API发出请求以获取Bearertoken。 Tweetauthent compiles when I run TweetAuthent在我运行时编译

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

This is the code 这是代码

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();
}

}

The error I get when I run 我运行时遇到的错误

   java Tweetauthent

is

    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

From what I understand the NoClassDefFoundError is thrown when the JVM cant find neccesary class files that the .java file used to compile. 据我了解,当JVM无法找到.java文件用于编译的必要的类文件时,会引发NoClassDefFoundError。 What would be causing this? 是什么原因造成的? Is there a way to add the path of the jar too -java? 有没有办法添加jar的路径-java? Oh and with expected consumerkey and secret strings. 哦,还有预期的consumerkey和秘密字符串。

UPDATE: when I add the classpath to java 更新:当我向Java添加类路径时

    java /path/to/jar Tweethauthent

I get Error: could not find or load main class Tweetauthent 我得到错误:找不到或加载主类Tweetauthent

Any help would be greatly appreciated thank you! 任何帮助将不胜感激,谢谢!

You need to reference the runtime dependencies in -classpath or -cp option of the java command: 您需要在java命令的-classpath-cp选项中引用运行时依赖项:

java -classpath /path/to/jar Tweetauthent

If you want to run with arguments add them as parameter after the Java file: 如果要使用参数运行,请将其作为参数添加到Java文件之后:

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

You have a run time class path issue. 您遇到运行时类路径问题。

I don't see how you've set the runtime classpath. 我看不到您如何设置运行时类路径。 The fact that you compiled is necessary, but insufficient. 您编译的事实是必要的,但不足。

Either you don't have the runtime classpath set properly or the JAR is not part of your package. 您可能没有正确设置运行时类路径,或者JAR不属于您的软件包。

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

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