java - 将 Gradle 添加到 Java 项目 "Exception ... java.lang.NoClassDefFoundError"

标签 java gradle intellij-idea

我有一个没有 Gradle 的现有项目,需要添加 com.google.code.gson:gson:+用于处理 JSON 对象的库。首先我运行了gradle initgradle build , 我不知道。这导致我的 java 类带有 main()不要因为源路径错误/更改而运行。我已经按照建议更改了结构,以至少让类编译和运行,但我在运行配置中仍然有这个警告“警告:模块'src'中找不到类'主'”;

enter image description here

如果我设置 Use classpath of modulesrc.main ,警告消失但当我运行 Main.main() Gradle 似乎执行 Gradle 任务,就像这样 - 这将无限期地运行;

enter image description here

这是我的项目结构;

enter image description here

这是我的build.gradle文件;

 /*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * User Manual available at https://docs.gradle.org/6.3/userguide/tutorial_java_projects.html
 */

plugins {
    // Apply the java plugin to add support for Java
    id 'java'

    // Apply the application plugin to add support for building a CLI application.
    id 'application'

    // idea plugin? // I added this to original build.gradle file
    id 'idea'
}

repositories {
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
    mavenCentral()
    google()
}

dependencies {
    // This dependency is used by the application.
    implementation 'com.google.guava:guava:28.2-jre'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'

    // For use with JSONUtil class // I added this to original build.gradle file
    compile 'com.google.code.gson:gson:+'
}

application {
    // Define the main class for the application.
    mainClassName = 'java.Main' // changed to 'Main' and I can `gradle run` seems to actually run Main.java
}

我已导入 com.google.gson.JsonObjectcom.google.gson.JsonParser来自 com.google.gson:gson:2.8.6库,没有代码检查警告,即在编译时可用。如果我用 JsonObject jsonObject = new JsonObject 运行我的代码我得到了错误;
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/JsonParser
    at HttpUtils.getAccessToken(HttpUtils.java:80)
    at Main.auth(Main.java:75)
    at Main.play(Main.java:36)
    at Main.main(Main.java:17)
Caused by: java.lang.ClassNotFoundException: com.google.gson.JsonParser
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 4 more
HttpUtils.java 第 80 行;
JsonObject jsonResponse = JsonParser.parseString(response.body()).getAsJsonObject(); // todo: status 200 "success" else failed
            accessToken = jsonResponse.get("access_token").getAsString();
            System.out.println(accessToken);

我理解这意味着 JVM 无法编译 .class对于 JsonParser ?我想这意味着编译器不知道现有的库,这让我怀疑 Gradle 没有正确配置项目,因为它已经下载了库,但没有添加路径?

我试过gradle cleanIdea然后 gradle idea .我已经重建了项目。我在各种目录上都有“将目录标记为源根目录”用于测试,当它未能改变行为时要小心恢复。

编辑 ;

我添加了一个包com.examplesrc.main.Java目录并添加java文件。

enter image description here

我为 Main.java 编辑了运行配置到
  • Main class: com.example.Main
  • Use classpath of module: src.main

  • 我还更改了 build.gradle归档到;
    application {
        // Define the main class for the application.
        mainClassName = 'com.example.Main'
    }
    
    Main运行,但我被困在这一点上,这似乎无限期地运行;

    enter image description here

    另外,我确定我右键单击 build.gradle并选择了import ,虽然我无法重新创建它,因为该选项现在不可用。

    编辑2;

    我已经能够上课MainTestmain()通过将它们放入 test/java/src 来运行包,并使用带有警告的异常运行配置。尽管经过仔细检查,它似乎正在运行以前在某处编译的代码,因为我所做的任何更改都不会反射(reflect)在输出中。

    这是我目前的项目结构;
    enter image description here

    这是我实际运行的运行配置 main在标准输出控制台中,而不是 Gradle 任务中。这显然是错误的,如 Main不在 com.example 中包或 src.main模块。如果我使用模块 src.test 正确设置它和主类src.Main Gradle 运行屏幕截图 5。

    enter image description here

    编辑3;

    我现在看到 Gradle 已经接管了构建和运行 java 文件的责任。我不知道在输出中运行可以用另一个 CLI 应用程序完成,我承认它让我感到困惑,所以请原谅上面那些看起来很愚蠢的东西,我正在学习并解决这个问题。

    我在 InteliJ 设置中找到了 Build, Execution, Deployment > Build Tools > Gradle我可以更改 Build and run using InteliJ IDEA 和 Gradle 之间的选项。我现在使用 Gradle 遇到的唯一问题是我知道发生了什么是 Gradle 似乎没有更新我的 .class运行 main() 时的文件与 Gradle。也许这是另一个问题。

    最佳答案

    mainClassName = 'java.Main' // changed to 'Main' and I can "gradle run" seems to actually run Main.java



    这是不正确的。根据屏幕截图 - 您没有名为 java 的包(我也认为这是 Java 包的有效名称)。在 src/main/java 中创建适当的包目录并在 Main 中指定源文件和 build.gradle 文件。

    还要确保你已经在 IDE 中导入了 build.gradle 文件,参见 Link a Gradle project to an IntelliJ IDEA project

    关于java - 将 Gradle 添加到 Java 项目 "Exception ... java.lang.NoClassDefFoundError",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61776765/

    相关文章:

    java - 检测在 View 上滑动

    java - 国际化 : Constants needed in constant (Java/GWT)

    java - Ormlite H2 从类分配数据时出错

    java - Gradle 复制规范 : list contents

    java - 如何自动化测试不同版本的jar?

    intellij-idea - "java.lang.IllegalArgumentException: Area already instantiated for: ProjectDefault (Template) Project"Idea-SBT 插件错误

    java - 每 30 秒更新一次订单状态

    jetty - 通过gradle将jodd部署到servlet时找不到类(IWorkspaceRunnable)

    java - Intellij IDEA--如何通过项目结构修改build.gradle?

    java - IntelliJ IDEA 中Java类资源的自动重载