【问题标题】:How to resolve runtime Eclipse NoClassDefFoundError如何解决运行时 Eclipse NoClassDefFoundError
【发布时间】:2018-05-20 16:31:48
【问题描述】:

我正在尝试编写一个用 java 编写的 openHab2 绑定。我是一个 C++ 人,Java 对我来说是新手。有问题的代码如下所示:

import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
...
@Override
public void initialize() {
    ...
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    ...
}

我将 org.apache.httpcomponents.htpclient_4.5.2.v20170210-0925.jar 作为外部 jar 添加到构建路径,程序构建没有任何问题。 这个项目使用了我也不熟悉的Maven作为构建系统,所以我添加了:

  <dependencies>
    <dependency>
        <groupId>org.apache.httpcomponent</groupId>
        <artifactId>httpclient</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <scope>runtime</scope>
    </dependency>
  </dependencies>

到 pom.xml。

当我运行系统时出现此错误:

2018-05-20 09:51:38.574 [错误] [.i.c.AbstractInvocationHandler:101] - 调用方法“ThingHandler.initialize()”时发生错误 'org.openhab.binding.testbinging.internal.TestBingingHandler@728656fc': org/apache/http/impl/client/BasicCredentialsProviderjava.lang.NoClassDefFoundError: org/apache/http/impl/client/BasicCredentialsProvider 在 org.openhab.binding.testbinging.internal.TestBingingHandler.initialize(TestBingingHandler.java:63)

2018-05-20 09:51:38.576 [错误] [.c.thing.internal.ThingManager:700] - 初始化事物“testbinging:sample:0ac3dcf3”的处理程序时发生异常: org/apache/http/impl/client/BasicCredentialsProviderjava.lang.NoClassDefFoundError: org/apache/http/impl/client/BasicCredentialsProvider

在我未经训练的眼睛看来,运行时类路径设置不正确。

我正在使用 eclipse-oxygen 版本 Oxygen.3a Release(4.7.3a),Build id: 20181405.1200 和 $ mvn -版本 阿帕奇 Maven 3.3.9 Maven 主页:/usr/share/maven Java 版本:1.8.0_171,供应商:甲骨文公司 Java 主页:/usr/lib/jvm/java-8-openjdk-amd64/jre

谢谢, 史蒂夫 默认语言环境:en_US,平台编码:UTF-8 操作系统名称:“linux”,版本:“4.9.0-5-amd64”,arch:“amd64”,家族:“unix”

【问题讨论】:

  • 所以你两个都做了,添加了 JAR 并使用了 Maven?尝试删除 JAR 并仅使用 Maven(接口和实现 JAR 之间可能存在版本不匹配)。你究竟是如何运行系统的?
  • 我删除了外部罐子,但问题仍然存在。请参阅下面答案中的 cmets。

标签: java eclipse maven openhab


【解决方案1】:

这是因为你的依赖是运行时的:

<scope>runtime</scope>

您需要将其更改为:

 <scope>compile</scope>

或者删除范围行,因为这是默认范围。

在编译时不使用运行时依赖项。您无法阅读更多相关信息:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

【讨论】:

  • 但它是运行时错误,而不是编译时错误。构建是好的。我已经尝试过完全没有范围并得到了相同的结果。我会查看您发布的链接。
  • 如果您使用的是 maven,则不需要将依赖项包含为外部 jar。您包含在 pom 中的依赖项将添加到您的类路径中。我认为第一件事是从类路径中删除外部 jar,然后将每个依赖项的范围和版本添加到您的 pom.xml 中。你能试试吗? org.apache.httpcomponentshttpclient4.5.5
  • 如果我从构建路径中删除外部 jar,然后清理并重新构建项目,我会收到构建错误。我无论如何都尝试运行,但遇到了与以前相同的运行时错误。
  • 你添加了版本部分吗??您遇到了哪些构建错误?
  • 是的,我添加了版本部分。对于每个导入行,我都得到“无法解析导入 org.apache”,“BasicCredentialsProvider 无法解析为类型”和“CredentialsProvider 无法解析为类型”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2012-12-22
  • 2016-08-21
  • 2011-09-27
  • 2012-10-27
  • 2012-02-07
相关资源
最近更新 更多