【问题标题】:jackson provider not available when run application运行应用程序时杰克逊提供程序不可用
【发布时间】:2017-11-11 17:35:50
【问题描述】:

我正在尝试测试 java 应用程序(有 main 方法)。我正在使用 Maven 将依赖项添加到我的项目中。我直接从 IntelliJ IDE 运行应用程序,而不是创建一个 fat jar 然后运行。但不知何故,我无法在运行时找到 JSON 类并出现异常

Exception in thread "main"
java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
at com.hospitality.component.visma.websocket.Test.<init>(Test.java:10)
at com.hospitality.component.visma.websocket.Test.main(Test.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper

这是我的 pom.xml:

     <dependency>
       <groupId>com.fasterxml.jackson.jaxrs</groupId>
       <artifactId>jackson-jaxrs-json-provider</artifactId>
     </dependency>

这个项目有一个父 pom.xml 文件,它已经包含了这个 jar.mvn 依赖:树显示以下 jar 列表:

[INFO] Building visma-websocket-server 0.0.1-SNAPSHOT
[INFO] -----------------------------------------------------------
  -------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ visma-websocket-server ---
[INFO] com.hospitality.hp.components:visma-websocket-server:jar:0.0.1-SNAPSHOT
[INFO] +- org.glassfish.metro:webservices-rt:jar:2.3:provided
[INFO] |  \- org.glassfish.metro:webservices-api:jar:2.3:provided
[INFO] |     \- javax.annotation:javax.annotation-api:jar:1.2-b03:provided
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.hamcrest:hamcrest-all:jar:1.3:test
[INFO] +- javax:javaee-api:jar:7.0:provided
[INFO] |  \- com.sun.mail:javax.mail:jar:1.5.0:provided
[INFO] |     \- javax.activation:activation:jar:1.1:provided
[INFO] +- org.slf4j:slf4j-api:jar:1.7.21:compile
[INFO] +- ch.qos.logback:logback-classic:jar:1.1.7:compile
[INFO] |  \- ch.qos.logback:logback-core:jar:1.1.7:compile
[INFO] +- org.eclipse.jetty.websocket:websocket-server:jar:9.0.3.v20130506:compile
[INFO] |  +- org.eclipse.jetty.websocket:websocket-common:jar:9.0.3.v20130506:compile
[INFO] |  |  +- org.eclipse.jetty.websocket:websocket-api:jar:9.0.3.v20130506:compile
[INFO] |  |  \- org.eclipse.jetty:jetty-util:jar:9.0.3.v20130506:compile
[INFO] |  +- org.eclipse.jetty.websocket:websocket-servlet:jar:9.0.3.v20130506:compile
[INFO] |  \- org.eclipse.jetty:jetty-http:jar:9.0.3.v20130506:compile
[INFO] +- com.hospitality.hp.components:jndi-tools:jar:0.0.1-SNAPSHOT:compile
[INFO] +- org.eclipse.jetty:jetty-server:jar:9.0.3.v20130506:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
[INFO] |  \- org.eclipse.jetty:jetty-io:jar:9.0.3.v20130506:compile
[INFO] +- com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:jar:2.2.1:provided
[INFO] |  +- com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:jar:2.2.1:provided
[INFO] |  +- com.fasterxml.jackson.core:jackson-core:jar:2.2.1:provided
[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.2.1:provided
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-annotations:jar:2.2.1:provided
[INFO] |  \- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.2.1:provided
[INFO] \- org.projectlombok:lombok:jar:1.16.8:provided

有人可以告诉我如何解决这个问题,因为默认范围是编译的,那么为什么当我在 IDE 中运行我的应用程序时它不可用?但是在 JunitTest 运行中没有任何问题。知道如何解决这个问题吗?

--------------依赖管理--------- ------------

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

【问题讨论】:

  • 您是否将项目作为 maven 项目导入 IDEA?

标签: java json maven intellij-idea


【解决方案1】:
|  +- com.fasterxml.jackson.core:jackson-databind:jar:2.2.1:provided

范围是provided,所以有NoClassDefFoundError是正常的;应该省略范围声明并使用默认值。

【讨论】:

  • 是的,这显示为已提供,因为从父级提供了其范围。我可以将此范围转换为在子 pom 中编译吗?
  • 我认为您可以使用dependencyManagement 部分来处理这个问题(在消费者的pom中)。只需添加此部分,添加 jackson-databind 并在其中添加正确的范围,就可以了。
  • 似乎无法使用dependencyManagement。我已将这些 Jsckson 依赖项添加到 dependencyManagement 并从默认依赖项标记中删除,现在它无法在项目中解析。
  • 您能否展示一下您添加的dependencyManagement 部分? (它需要添加到引发此错误的项目的 pom 中,而不是父项中;此外,它需要在其中包含 jackson-databind;另外,dependency:tree 现在说什么?)我用过这个过去的技术告诉 maven 我想要哪个版本来自冲突的工件版本,所以它可能不适用于范围。那么你不能在你的 pom 中再次包含你的工件,具有正确的范围吗?
  • 我用依赖管理的子 pom.xml 更新了我的问题。从这个dependencyManagement我无法解决intelliJ中的依赖及其显示错误
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 2017-06-16
  • 2014-10-26
  • 2016-01-27
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多