[英]java.lang.NoClassDefFoundError: io/reactivex/subjects/Subject when building jar in Intellij Idea (gradle + JavaFX 11)
[英]How to fix java.lang.NoClassDefFoundError when exporting runnable jar in Intellij IDEA?
我正在尝试从此Java库创建可运行的jar:
https://github.com/Jefferson-Henrique/GetOldTweets-java
创建后,该jar应当能够使用命令行中的输入运行。
主文件是此Exporter类:
package me.jhenrique.main;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import me.jhenrique.manager.TweetManager;
import me.jhenrique.manager.TwitterCriteria;
import me.jhenrique.model.Tweet;
public class Exporter {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
public static void main(String[] args) {
if (args == null || args.length == 0) {
System.err.println("You must pass some parameters. Use \"-h\" to help.");
System.exit(0);
}
if (args.length == 1 && args[0].equals("-h")) {
System.out.println("\nTo use this jar, you can pass the folowing attributes:");
System.out.println(" username: Username of a specific twitter account (without @)");
System.out.println(" since: The lower bound date (yyyy-mm-aa)");
System.out.println(" until: The upper bound date (yyyy-mm-aa)");
System.out.println("querysearch: A query text to be matched");
System.out.println(" maxtweets: The maximum number of tweets to retrieve");
System.out.println("\nExamples:");
System.out.println("# Example 1 - Get tweets by username [barackobama]");
System.out.println("java -jar got.jar username=barackobama maxtweets=1\n");
System.out.println("# Example 2 - Get tweets by query search [europe refugees]");
System.out.println("java -jar got.jar querysearch=\"europe refugees\" maxtweets=1\n");
System.out.println("# Example 3 - Get tweets by username and bound dates [barackobama, '2015-09-10', '2015-09-12']");
System.out.println("java -jar got.jar username=barackobama since=2015-09-10 until=2015-09-12 maxtweets=1");
} else {
TwitterCriteria criteria = TwitterCriteria.create();
for (String parameter : args) {
String[] parameterSplit = parameter.split("=");
if (parameterSplit[0].equals("username")) {
criteria.setUsername(parameterSplit[1]);
} else if (parameterSplit[0].equals("since")) {
criteria.setSince(parameterSplit[1]);
} else if (parameterSplit[0].equals("until")) {
criteria.setUntil(parameterSplit[1]);
} else if (parameterSplit[0].equals("querysearch")) {
criteria.setQuerySearch(parameterSplit[1]);
} else if (parameterSplit[0].equals("maxtweets")) {
criteria.setMaxTweets(Integer.valueOf(parameterSplit[1]));
}
}
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("output_got.csv"));
bw.write("username;date;retweets;favorites;text;geo;mentions;hashtags;id;permalink");
bw.newLine();
System.out.println("Searching... \n");
for (Tweet t : TweetManager.getTweets(criteria)) {
bw.write(String.format("%s;%s;%d;%d;\"%s\";%s;%s;%s;\"%s\";%s", t.getUsername(), sdf.format(t.getDate()), t.getRetweets(), t.getFavorites(), t.getText(), t.getGeo(), t.getMentions(), t.getHashtags(), t.getId(), t.getPermalink()));
bw.newLine();
}
bw.close();
System.out.println("Done. Output file generated \"output_got.csv\".");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
src文件夹中还有一个TweetManager.java文件,TwitterCriteria.java文件和Tweet.java文件。 (Main.java文件仅显示了应如何使用代码的示例。)此外,此项目的libs文件夹中有两个jar,分别是“ json-20140107.jar”和“ jsoup-1.8.1.jar”。
我在Java代码中做了一个小的更改,并且我想重新创建包含此更改的got.jar文件。 我正在使用Intellij IDEA。 我没有任何Java经验,因此到目前为止,此过程一直很不错。
问题(我认为)是,当我运行我创建的jar时,该jar无法找到两个libs jar“ json-20140107.jar”和“ jsoup-1.8.1.jar”。 我从终端获得的输出是这样的:
main_jar$ java -jar main.jar querysearch="europe refugees" maxtweets=1
Searching...
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient
at me.jhenrique.main.Exporter.main(Exporter.java:64)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.HttpClient
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
在Intellij中制作可运行的jar时,我在Artifacts选项卡中选择了“ jar”,选中了“ Build on make”框,将“ Exporter”作为我的主类,并确保我的类路径指向包含json和jsoup的文件夹文件夹。 我还具有“模块”选项卡中“依赖项”下列出的json和jsoup库。 (这些都是与该问题相关的先前解答的建议。)
我已经尝试过在该主题上可以找到的所有其他建议,但为避免此错误,目前还没有任何工作。 我究竟做错了什么?
编辑:已解决-问题是我需要使用Maven进行其他依赖项下载,我意识到问题是我还有其他依赖项(除了json和jsoup jars)需要由Maven自动下载,这没有发生,因为我没有不能将项目作为Maven项目导入Intellij。 我最初不知道Maven是什么,但是当我在使用的代码中查看pom.xml文件时,我发现除了json和jsoup库之外,还引用了apache HttpClient库,而我没有HttpClient库的一个jar。
一旦将项目导入为Maven项目,就会自动下载其他依赖项,并且导出的jar文件将按预期工作。 感谢Will为您提供一个非常明确的解释,向我保证,问题不是我如何导入已经拥有的库!
我遇到了Maven和Intellij的最后一个小问题,我在这里找到了他们的解决方案,以防万一其他人遇到Maven和Intellij的“无主清单属性”错误: IntelliJ IDEA中的Manifest.mf错误创建了.jar
您应该将依赖项包含在jar中,或者将jar与依赖的库一起保存。 不幸的是,我对IDEA的经验很少(无),无法告诉您如何使它在jar中包含include依赖项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.