java - 可以从 Eclipse (STS) 启动 Spring Boot,但不能从 CLI 启动

标签 java spring spring-boot

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

但是,当我尝试从命令行运行它时,出现文件丢失的错误:

Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:62) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.reflect.InvocationTargetException 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:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54) ... 1 more Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724) at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531) at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355) at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286) at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) at java.lang.Class.createAnnotationData(Class.java:3521) at java.lang.Class.annotationData(Class.java:3510) at java.lang.Class.getAnnotations(Class.java:3446) at org.springframework.core.type.StandardAnnotationMetadata.(StandardAnnotationMetadata.java:68) at org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition.(AnnotatedGenericBeanDefinition.java:56) at org.springframework.context.annotation.AnnotatedBeanDefinitionReader.registerBean(AnnotatedBeanDefinitionReader.java:139) at org.springframework.context.annotation.AnnotatedBeanDefinitionReader.registerBean(AnnotatedBeanDefinitionReader.java:127) at org.springframework.context.annotation.AnnotatedBeanDefinitionReader.register(AnnotatedBeanDefinitionReader.java:122) at org.springframework.boot.BeanDefinitionLoader.load(BeanDefinitionLoader.java:158) at org.springframework.boot.BeanDefinitionLoader.load(BeanDefinitionLoader.java:134) at org.springframework.boot.BeanDefinitionLoader.load(BeanDefinitionLoader.java:126) at org.springframework.boot.SpringApplication.load(SpringApplication.java:708) at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:357) at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) at se.itab.bos.admin.AdminServer.main(AdminServer.java:37) ... 6 more

我尝试从我的启动类中注释掉以下内容:

@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

将每个导入一一注释掉后,我也发现问题源于导入的模块,但还没有找到原因。

从命令行运行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 中使用的相同

最佳答案

使用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 Documentation 中找到。和 spring-boot:repackage目标。

注意:它可以在 Eclipse 中工作,因为 Eclispe 已正确设置类路径以在编译和运行时引用 pom 中的依赖项,而编译后的 jar 文件则不然。

关于java - 可以从 Eclipse (STS) 启动 Spring Boot,但不能从 CLI 启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48667004/

相关文章:

java - java调用非静态类

java - 我们可以在关闭应用程序时删除 SharedPreferences

java - 简单的 Spring 和 Maven 应用程序 - java.lang.NoClassDefFoundError 异常

azure - 使用 Azure AD 的 Spring Boot+Oauth 客户端凭据授予流程

java - 如果存在我的自定义注释并且 RestTemplate 正在使用对象映射器,则不会调用 AnnotationIntrospector

java - 创建工厂类的更好方法是什么

java - Android - 没有自动换行符的多行EditText

spring - 未设置招摇注释内容类型

spring - 我可以像使用 Spring 一样使用 CDI 和 @PersistenceContext 注入(inject) JPA EntityManager 吗?

spring - 如何防止 Spring Config 将我的本地 git 存储库重置为 origin/master