我制作了第一个 Spring 应用程序,现在我需要将其打包到 jar 文件中进行部署。在
pom.xml
内部,我指定了 maven-jar-plugin
以便自动为我的 jar 创建清单文件,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>bg.sofia.uni.fmi.melodify.MelodifyApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
然后我使用 Intellij Maven 视图中的打包按钮对其进行打包,它成功生成了一个 jar 文件。当我使用
java -jar <path/to/jar/file.jar>
运行 jar 文件时,出现以下错误:
Error: Could not find or load main class bg.sofia.uni.fmi.melodify.MelodifyApplication
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/CommandLineRunner
我的
MelodifyApplication
课程看起来像这样:
@SpringBootApplication
public class MelodifyApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(MelodifyApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("Application started ...");
}
}
我尝试编写自己的 Manifest.mf 文件并自己创建 jar,如下所示:
jar cfm Melodify.jar Manifest.mf -C Melodify/src/main/java/ .
但我遇到了同样的错误。我做错了什么?
一种解决方案是遵循 Spring Initializr 的模式:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
可选: 定义
spring-boot-starter-parent
让您的生活更轻松 - 它为您处理依赖关系管理。背景:请参阅此问题。
最后,使用 Spring Boot Maven Plugin 代替 Maven Jar Plugin:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
通过此设置,发出:
mvn package
...应该为您的 Spring 应用程序构建一个合适的 uber-jar:
java -jar target/spring-sandbox-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.1)
2024-01-10T09:52:00.671+01:00 INFO 98109 --- [ main] c.g.t.s.SpringSandboxApplication : Starting SpringSandboxApplication using Java 17.0.3 with PID 98109 (/Users/tamas/git/spring-sandbox/target/spring-sandbox-0.0.1-SNAPSHOT.jar started by tamas in /Users/tamas/git/spring-sandbox)
...