【问题标题】:Simple SpringBoot application works in eclipse, throws exception from terminal简单的 Spring Boot 应用程序在 Eclipse 中工作,从终端抛出异常
【发布时间】:2018-03-09 22:11:43
【问题描述】:

我有一个非常简单的 SpringBoot 应用程序:

HelloConfig.java:

@RestController
@EnableAutoConfiguration
public class HelloConfig {

    @RequestMapping("/time")
    public String time() {
        return "time is " + System.currentTimeMillis();
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloConfig.class, args);
    }
}

build.gradle:

plugins {
    id 'java'
    id 'eclipse'
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web:2.0.0.RELEASE'
    testCompile 'junit:junit:4.12'
}

repositories {
    mavenCentral()
}

jar {
    manifest {
        attributes 'Main-Class': 'HelloConfig'
    }
}

该应用在 Eclipse 中运行,但是当我从终端运行它时:

gradle build
java -Dserver.port=8080 -jar build/libs/*.jar

我收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
    at HelloConfig.main(HelloConfig.java:18)
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

如何从 unix 终端执行此应用程序?

【问题讨论】:

  • 您没有应用允许创建包含所有依赖项的单个 eecutable jar 的 spring 插件,并且您正在执行仅包含您的类的 jar,而在类路径中没有所有其他依赖项。那怎么能行?与往常一样,阅读文档时总是更简单:docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…。您也可以使用 start.spring.io,它会为您生成正确的构建文件。

标签: spring eclipse spring-boot exception terminal


【解决方案1】:

将 springboot 插件添加到您的 build.gradle 文件中,例如:

apply plugin: 'org.springframework.boot'

然后你可以在命令行中输入:

gradle bootRun

或者如果你使用 gradle 包装器

./gradlew bootRun

一般来说,如果你正在开始一个新的 spring boot 项目并且你想使用 gradle 作为构建系统(强烈推荐!!!)那么最好去start.spring.io 并选择 gradle(不知道为什么它们仍然默认为 maven!),它将具有正确的 build.gradle 文件,其中包含 springboot 插件。

关于 gradle 的奇妙之处在于,您可以通过以下方式要求它告诉您它认为知道的所有任务:

gradle tasks --all

因此,如果您想知道是否可以为 gradle 提供特定参数来完成某些任务,那么这将告诉您在 build.gradle 文件中配置的插件的情况下当前可用的内容。

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2017-09-03
    • 1970-01-01
    • 2013-06-02
    • 2020-02-05
    • 2018-09-06
    相关资源
    最近更新 更多