繁体   English   中英

在Intellij IDEA中导出可运行jar时,如何修复java.lang.NoClassDefFoundError?

[英]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依赖项。

我快速创建了一个依赖于另一个Jar的Jar。

我首先使用IntelliJ将库添加到我的项目中

IntelliJ库

然后,通过转到工件并选择“来自具有依赖项的模块”来创建Jar。 来自具有依赖性的模块

然后,我为Jar设置主类 设置罐子的主要类别

我完成的jar安装看起来像这样。

完成jar设置

然后转到“生成”菜单并选择“生成工件”并选择生成动作。

建立罐子

你现在应该有一个罐子

完成的罐子

当您打开jar时,您应该看到程序类文件和任何依赖项的类文件。

爆炸罐

希望能有所帮助。

暂无
暂无

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

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