当前位置: 首页 > 知识库问答 >
问题:

为什么要使用java。作为jar运行时,lang.ClassNotFoundException,但与IntelliJ IDEA配合良好

萧嘉茂
2023-03-14

spring启动版本:2.4.1

spring云版本:2020.0.0

我的代码

@Configuration
public class BaseConfig {

    @Bean
    public Module sortJacksonModule() {
        return new SortJacksonModule();
    }
}

我的pom。xml依赖关系

xml prettyprint-override"><dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-commons</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>

我的pom。xml插件

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

使用IntelliJ IDEA运行时,它运行良好。

但是当使用jar运行时(通过mvncleanpackage),它会显示

Caused by: java.lang.NoClassDefFoundError: feign/codec/EncodeException
        at org.springframework.cloud.openfeign.support.SortJacksonModule.setupModule(SortJacksonModule.java:47) ~[spring-cloud-openfeign-core-3.0.0.jar!/:3.0.0]
        at com.fasterxml.jackson.databind.ObjectMapper.registerModule(ObjectMapper.java:819) ~[jackson-databind-2.11.3.jar!/:2.11.3]
        at com.fasterxml.jackson.databind.ObjectMapper.registerModules(ObjectMapper.java:1021) ~[jackson-databind-2.11.3.jar!/:2.11.3]
        at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.configure(Jackson2ObjectMapperBuilder.java:712) ~[spring-web-5.3.2.jar!/:5.3.2]
        at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.build(Jackson2ObjectMapperBuilder.java:680) ~[spring-web-5.3.2.jar!/:5.3.2]
        at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperConfiguration.jacksonObjectMapper(JacksonAutoConfiguration.java:101) ~[spring-boot-autoconfigure-2.4.1.jar!/:2.4.1]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_232]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_232]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_232]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_232]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.2.jar!/:5.3.2]
        ... 113 common frames omitted
Caused by: java.lang.ClassNotFoundException: feign.codec.EncodeException
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_232]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_232]
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) ~[demo-spring-core-11-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_232]
        ... 124 common frames omitted

在研究错误日志后,我发现feign。编解码器。EncodeException是SpringCloudOpenFeignCore中的可选依赖项,因此ClassNotFoundException是正确的行为(可选依赖项不包括在最终jar中)。

所以我的问题是:为什么IntelliJ IDEA可以运行没有任何错误?我尝试了IntelliJ IDEA run和mvn Spring-start: run,两者都运行良好。

更新:添加示例

经过更多的研究,我发现这种情况只会发生在上课不打电话的时候。

        try {
            System.out.println("not important code");
        } catch (Exception e) {
            throw new EncodeException("not exist class");
        }

在本例中,尝试捕获从不抛出异常。并且EncodeExc0019类处于可选依赖项中。这段代码在IntelliJ IDEA中运行良好,但是当运行为java-jarxxx.jar时失败。

============使用最少的演示再次更新

我创建了一个最小的演示来重现这个问题。

  • 一个独立的演示模块
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-core</artifactId>
            <version>10.10.1</version>
            <optional>true</optional>
        </dependency>
import feign.codec.EncodeException;

/**
 * Hello world!
 */
public class App {

    public void testOptional() {
        try {
            System.out.println("test");
        } catch (Exception e) {
            throw new EncodeException("never throw this");
        }
    }
}
  • 演示spring项目(通过spring初始化器创建并添加依赖项)
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>demo-module</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
@Component
public class MyMain implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        new App().testOptional();
    }
}

共有2个答案

宗政海
2023-03-14

IntelliJ IDEA运行配置中有一个名为启用启动优化的选项,取消选中该选项,所有操作都会按预期进行。

平庆
2023-03-14

在Idea(CTRL-Alt-Shift-S)中检查您的项目类路径——我敢说可选jar在模块编译类路径上的某个地方,它足以在IDE中运行您的类——但不能在独立jar中运行。可选意味着在maven上下文中,它在编译时出现在类路径上,但不打包到结果工件中。

 类似资料:
  • Intellij IDEA用不良行为把我逼疯了: 我有一个(基于Gradle的)项目,有两个用Java编写的主要类,每个类都在自己的包中。 一个叫"HelloFX" 一个叫"ImageView示例" 两者都使用JavaFX,因此需要一些特殊的“运行配置”。 为了“HelloFX” 对于“ImageViewExample” 配置是相同的,在这两种情况下(这将是很好的,不必处理一个巴洛克式复杂的文本框

  • 我正在url上与邮递员进行api调用: 无标题无参数无任何内容。但java也是如此: 给我403。问题出在哪里?

  • 我使用kotlin中的EclipsePAHOMQTT库和IntellijIDE中的Gradle创建了一个小型mqtt应用程序。当通过Intellij运行它时,它运行良好,但是当我构建它并运行创建的jar文件时,我会得到一个错误。 从我看到的其他问题来看,这似乎与类路径有关,但我不确定如果这确实是问题所在,需要做什么,因为我使用的是gradle而不是jar文件作为库。 我正在学习这个教程 这是我的档

  • 我正在编写一个Java方法,它接受3个字符串参数:桶名、对象键、对象内容。然后,该方法将对象放入桶中。下面的代码没有问题。 现在我想为对象设置内容类型,因为我将使用该方法存储例如“文本/纯文本”或“文本/xml”文件。所以我使用以下代码。 当我运行此代码时,我会得到一个异常,如下所示。为什么? 我应该注意,我使用这个S3存储桶来托管一个静态网站。我在S3前面使用Cloud前,然后在我的域中使用Ro

  • 问题内容: 在下面的代码中,为什么我需要导入但可以不导入就可以使用? 问题答案: 为了方便起见,Java编译器会为每个源文件自动导入两个完整的软件包: java.lang包和 当前包(当前文件的包)。 请参考 oracle.com了解更多信息(http://docs.oracle.com/javase/tutorial/java/package/usepkgs.html)

  • 问题内容: 在托管bean中,是在常规Java对象构造函数之后调用的。 为什么要使用初始化而不是常规构造函数本身? 问题答案: 因为在调用构造函数时,bean尚未初始化-即没有注入依赖项。在该@PostConstruct方法中,bean已完全初始化,你可以使用依赖项。 因为这是保证可以在bean生命周期中仅调用一次此方法的协定。可能会发生(尽管不太可能)容器在其内部工作中多次实例化bean,但它保