【问题标题】:Can launch Spring Boot from Eclipse (STS) but not from CLI可以从 Eclipse (STS) 启动 Spring Boot,但不能从 CLI 启动
【发布时间】:2018-02-07 15:05:59
【问题描述】:

我有一个似乎无法解决的问题。从 Boot Dashboard 使用 STS 3.9.2 从 Eclipse (Oxygen) 启动 Spring Boot 应用程序没有问题:

但是,当我尝试从命令行运行它时,我收到一个文件丢失的错误:

线程“主”java.lang.RuntimeException 中的异常: java.lang.reflect.InvocationTargetException 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:62) 在 java.lang.Thread.run(Thread.java:748) 引起: java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54) ... 1 更多原因:java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 在 sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724) 在 sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531) 在 sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355) 在 sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286) 在 sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) 在 sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) 在 java.lang.Class.createAnnotationData(Class.java:3521) 在 java.lang.Class.annotationData(Class.java:3510) 在 java.lang.Class.getAnnotations(Class.java:3446) 在 org.springframework.core.type.StandardAnnotationMetadata.(StandardAnnotationMetadata.java:68) 在 org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition.(AnnotatedGenericBeanDefinition.java:56) 在 org.springframework.context.annotation.AnnotatedBeanDefinitionReader.registerBean(AnnotatedBeanDefinitionReader.java:139) 在 org.springframework.context.annotation.AnnotatedBeanDefinitionReader.registerBean(AnnotatedBeanDefinitionReader.java:127) 在 org.springframework.context.annotation.AnnotatedBeanDefinitionReader.register(AnnotatedBeanDefinitionReader.java:122) 在 org.springframework.boot.BeanDefinitionLoader.load(BeanDefinitionLoader.java:158) 在 org.springframework.boot.BeanDefinitionLoader.load(BeanDefinitionLoader.java:134) 在 org.springframework.boot.BeanDefinitionLoader.load(BeanDefinitionLoader.java:126) 在 org.springframework.boot.SpringApplication.load(SpringApplication.java:708) 在 org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:357) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:307) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) 在 se.itab.bos.admin.AdminServer.main(AdminServer.java:37) ... 6 更多

我尝试在我的启动课程中注释掉以下内容:

@SpringBootApplication
@Import({
//    AppConfig.class
//    , ActiveMqServerConfig.class
//    , MetricConfig.class
//    , AdminConfig.class
//    , SystemConfig.class
//    , SystemMessageRouterConfig.class
//    , CommandConfig.class
//    , AdminMessageRouterConfig.class
})
public class AdminServer {

这解决了问题,以便我可以从命令行启动,但我不明白为什么。在我的 pom.xml 中,我定义了所有其他模块,其中包含这些文件。

我正在使用 Spring Boot Starter 1.3.5.RELEASE 和 Java 8。

任何帮助将不胜感激。

更新

这是我完整的pom:

<?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>se.bos</groupId>
            <artifactId>bos-parent</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <relativePath>../bos-parent</relativePath>
        </parent>
        <artifactId>bos-admin</artifactId>
        <packaging>jar</packaging>
        <name>BOS Admin</name>
        <properties>
            <java.version>1.7</java.version>
            <start-class>se.bos.admin.AdminServer</start-class>
        </properties>
        <dependencies>
            <!-- operations: spring boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-remote-shell</artifactId>
            </dependency>
            <!-- operations: spring boot admin -->
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-client</artifactId>
            </dependency>
            <!-- application: bos -->
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>bos-site</artifactId>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>bos-server</artifactId>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>bos-core</artifactId>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>bos-client</artifactId>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>bos-model</artifactId>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>bos-system</artifactId>
            </dependency>
            <!-- application: spring boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- test -->
            <!-- -->
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <executable>true</executable>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

要从命令行启动项目,我运行:

mvn clean install
java -jar target/admin.jar

把每一个import一个一个注释掉后,我也发现问题出在导入的模块上,但是还没找到原因。

从命令行运行java -version

openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

这与Eclipse中使用的和JAVA_HOME中的相同

【问题讨论】:

  • 能否请您发布整个 pom 以便可以查看正在使用哪些其他依赖项? PS:jira.spring.io/browse/SPR-10441 可能会有所帮助
  • 另外,我会一一注释掉类,看看究竟是哪一个导致了问题。
  • Eclipse 用于运行 Spring Boot 应用程序的 Java 安装版本是否与命令行使用的完全相同?还有你在命令行上运行什么命令?

标签: java spring spring-boot


【解决方案1】:

使用mvn clean install不会为你生成可执行的jar文件,因为这不会打包可执行的spring boot库和pom依赖。它只会生成一个仅包含您的代码的 jar 文件。

使用spring-boot-maven-plugin,您需要执行spring-boot:repackage 目标和阶段,以便将可执行jar 文件与spring boot/pom 依赖项适当打包并准备好在命令行上执行。即运行mvn package spring-boot:repackage,然后在命令行上运行您的应用程序。

关于这方面的完整细节可以在Spring Boot Maven Plugin Documentationspring-boot:repackage 目标中找到。

注意:它可以在 Eclipse 中工作,因为 Eclispe 已经适当地设置了你的类路径以在编译和运行时引用你的 pom 中的依赖项,而你编译的 jar 文件没有。

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多