我试图在我的.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?哦,还有预期的消费者密钥和秘密字符串。
更新:当我将类路径添加到java
时 java /path/to/jar Tweethauthent
我收到错误:无法找到或加载主类Tweetauthent
非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
您需要在-classpath
命令的-cp
或java
选项中引用运行时依赖项:
java -classpath /path/to/jar Tweetauthent
如果要使用参数运行,请在Java文件之后将它们添加为参数:
java -classpath /path/to/jar Tweetauthent <consumerkey> <consumersecret>
答案 1 :(得分:0)
您有运行时类路径问题。
我没看到你是如何设置运行时类路径的。你编译的事实是必要的,但不够。
要么没有正确设置运行时类路径,要么JAR不是包的一部分。