如何解决使用 spring boot 无法找到或加载主类错误?

hit*_*ker 4 java maven spring-boot

我为 Spring Boot 创建了一个 Maven 项目。我有很多 Spring 依赖项和一个主类:

package com.vastserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyArtifactApplication {

    public static void main(String[] args) {

//      SpringApplication.run(MyArtifactApplication.class, args);
        System.out.println("hello!");
    }

}
Run Code Online (Sandbox Code Playgroud)

src目录的文件夹结构为:

.
??? main
    ??? java
    ?   ??? com
    ?       ??? vastserver
    ?           ??? MyArtifactApplication.java
    ??? resources
        ??? application.properties
Run Code Online (Sandbox Code Playgroud)

在我的 pom.xml 中,我用于maven-assembly-plugin在独立的 .jar 文件中构建我的项目。即使我三次检查目录结构和主类文件在 pom.xml 中是否正确显示,我仍然收到错误:Error: Could not find or load main class com.vastserver.MyArtifactApplication当我运行时mvn package然后java -cp target/vast-ad-server-artifactId-1.0-SNAPSHOT-jar-with-dependencies.jar com.vastserver.MyArtifactApplicationmvn exec:exec. 如果我从 Intellij 运行它,主类确实可以工作,所以我知道代码不是问题,而是 Maven 构建设置。我迷失在我的问题所在。

我的 pom.xml 如下所示:

<?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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <maven.compiler.release>11</maven.compiler.release>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <mainClass>com.vastserver.MyArtifactApplication</mainClass>
        <descriptorRef>jar-with-dependencies</descriptorRef>
        <targetSnapshot>target/vast-ad-server-artifactId-1.0-SNAPSHOT</targetSnapshot>
        <targetWithDependencies>${targetSnapshot}-${descriptorRef}.jar</targetWithDependencies>
    </properties>

    <groupId>com.vastserver</groupId>
    <artifactId>vast-ad-server-artifactId</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

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

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>${mainClass}</mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>
                                <descriptorRef>${descriptorRef}</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.3.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>java</executable>
                    <arguments>
                        <argument>-cp</argument>
                        <argument>${targetWithDependencies}</argument>
                        <argument>${mainClass}</argument>
                    </arguments>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
Run Code Online (Sandbox Code Playgroud)

hit*_*ker 6

我意识到spring-boot-maven-plugin实际上是在构建,所以不需要其他插件。如果 maven 中的 plugins 部分被编辑为:

<plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)

然后运行mvn packagejava -jar target/vast-ad-server-artifactId-1.0-SNAPSHOT.jar工作。


小智 6

对我来说:Maven - 更新项目有效。


Mar*_*nik 3

我认为你应该检查maven 构建的工件的目录结构。通常,Spring Boot 工件是由特殊的 Spring Boot 插件准备的,而不是由 Maven 程序集插件准备的。

虽然它共享“jar”后缀,但它并不是真正的jar,它有特殊的类加载器来从BOOT-INF/lib文件夹加载类。

我已经在此处提供了有关 Spring Boot 应用程序启动时到底会发生什么的详细答案,但最重要的是,如果您使用程序集插件,则必须准备清单文件和相当复杂的文件夹结构。坦率地说,我认为你应该使用 Spring Boot 插件作为构建 Spring Boot 应用程序的首选。