【发布时间】:2015-04-24 12:54:42
【问题描述】:
我正在尝试使用java -jar 运行./gradlew -Pprod bootRepackage 生成的war 文件。 bootRepackage 任务成功结束。
当我查看project_root/build/libs/ 文件夹时,使用以下权限创建了war 和war.original 文件:
-rw-rw-r-- 1 user user 110376521 Apr 24 09:42 app-0.1-SNAPSHOT.war
-rw-rw-r-- 1 user user 107542786 Apr 24 09:40 app-0.1-SNAPSHOT.war.original
在我的 build.gradle 中,我有以下内容:
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'spring-boot'
apply plugin: 'war'
bootRepackage {
mainClass = 'org.package.Application'
}
// Original from JHipster. Uncommenting this does not work either.
//springBoot {
// mainClass = 'org.package.Application'
//}
// I got this from [this][1] questions, but did not work either.
war {
baseName = 'app'
version = '0.1-SNAPSHOT'
manifest {
attributes 'Main-Class': 'org.package.Application'
}
}
当我运行 jar 时,我得到:
$ java -jar app-0.1-SNAPSHOT.war --spring.profiles.active=prod
java.lang.IllegalStateException: No 'Start-Class' manifest entry specified in jar:file:/home/user/.../build/libs/app-0.1-SNAPSHOT.war!/
at org.springframework.boot.loader.archive.Archive.getMainClass(Archive.java:57)
at org.springframework.boot.loader.ExecutableArchiveLauncher.getMainClass(ExecutableArchiveLauncher.java:63)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:61)
at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:80)
我该怎么办?谢谢。
更新 我解压缩了战争并查看了 MANIFEST.MF:
Manifest-Version: 1.0
Start-Class: org.package.Application
Spring-Boot-Version: 1.1.7.RELEASE
Main-Class: org.springframework.boot.loader.WarLauncher
我说的对吗?
【问题讨论】:
-
为什么清单主类设置为 Main-Class: org.springframework.boot.loader.WarLauncher 当你将它设置为属性'Main-Class': 'org.package.Application'? ??
-
@al-Jacinto 这很奇怪,但在线阅读更多内容我相信我有一个解释。这是因为 Spring Boot 是 JDK 必须运行的第一个类才能使应用程序运行。 Spring boot 必须运行 Web 服务器等,然后是我自己的类。我只是不知道为什么它没有在 jar 中创建
Start-Class。 -
好吧,不知道这是弹簧靴。您应该更改 Start-Class 而不是 main-class 因为就像您说的那样,spring-boot 将启动它。这来自我相信的参考文档(不记得我在哪里得到它):您需要指定一个适当的启动器作为 META-INF/MANIFEST.MF 的 Main-Class 属性。您要启动的实际类(即您编写的包含 main 方法的类)应在 Start-Class 属性中指定。主类:org.springframework.boot.loader.WarLauncher 开始类:com.mycompany.project.MyApplication
-
看看你的错误,这正是它所说的:)并且清单具有 Start-Class 属性的默认值。
-
我知道,但是 MANIFEST.MF 中的 Start-Class 是正确的!这就是重点。
标签: java gradle spring-boot jhipster