【问题标题】:Maven/import basics - cannot find classesMaven/import 基础知识 - 找不到类
【发布时间】:2017-10-16 16:19:40
【问题描述】:

在我的 pom.xml 中使用以下内容:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20170516</version>
</dependency>

但我感兴趣的 json 类在我的代码中无法识别(例如 JSONArray。)然后我尝试导入:

import org.json.*;

在这种情况下,一切都会编译,但是当我运行代码时会得到以下信息:

org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: org/json/JSONArray

我似乎在我的类路径中找到了表明我需要一个 json.jar 的引用,但是对于已建立的 maven 依赖项(我的首选解决方案)或导入调用真的有必要吗?

提前致谢

【问题讨论】:

    标签: java json maven import


    【解决方案1】:

    您的类路径中需要 json.jar。它通常从 maven 存储库下载到您的 m2 文件夹中。然后 m2 文件夹应该在您的类路径中。

    你如何构建你的 maven 项目,mvn clean install?

    【讨论】:

    • 我的项目在 IntelliJ 中 - 在该上下文中它被定义为“maven 项目”。我在项目的任何地方都看不到 m2 文件夹。我尝试重新导入 pom.xml 无济于事。
    • 您正在运行什么操作系统。 m2 文件夹 (linux/MacOS) 位于 ~/.m2 Windows 上不确定。但我确实认为,当您通过 IntelliJ 或任何其他 IDE 运行 maven 项目时,他们应该下载依赖项。
    • MacOS - 谢谢,我确实找到了它:R0229283:.m2 afs01$ tree | grep json │   ├── json │   │   └── json │   │   ├── json-20170516.jar │   │   ├── json-20170516.jar.sha1 │   │   ├── json-20170516.pom │   │   └── json-20170516.pom.sha1 我会尝试将它添加到类路径中。
    • 谢谢,成功了。不过,我仍然不明白 Maven 在这种情况下带来了什么。
    【解决方案2】:

    这完全取决于您的项目包装类型。

    1. 如果它是 JAR - 您有责任为运行时提供依赖项 jar。对于任何 Java 应用程序,它可以通过多种方式完成:通过 CLASSPATH 环境、JVM 的 -cp 参数、在 JAR 文件的 MANIFEST 文件中定义位置或通过创建一个包含所有依赖项的胖 jar。

    (注意:如果您使用 Eclipse 之类的 IDE - 当您在其中运行代码时它会为您执行此操作。它将所有 Maven 依赖项包含到运行类路径中。但不适用于 IDE 之外的真正运行时)。

    1. 如果它是 WAR 或 EAR,范围为 compileruntime 的所有依赖项都将包含在 WAR/EAR 文件中,并可用于您的代码。但是如果范围是provided - 它会回到与 JAR 相同的位置。 provided 作用域在需要的依赖项位于运行 WAR/EAR 的 Application Server 类路径中时很有用。它可以防止在每个 WAR/EAR 中打包公共依赖项以及可能的版本冲突。

    【讨论】:

      【解决方案3】:

      对我有用的是在 IntelliJ Maven 侧面菜单上,右键单击项目并选择选项 Reimport

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-16
        • 2018-05-25
        • 2014-11-28
        • 2014-02-14
        相关资源
        最近更新 更多