我有一个Java应用程序的.war文件,并希望将其部署到docker容器。
我的Dockerfile看起来像这样:
FROM java:8
EXPOSE 8080
ADD /App.war app.war
ENTRYPOINT ["java", "-jar", "app.war"]
我的App.war
在同一目录中。
当我想使用以下命令运行它时:
docker run -p 8080:8080 -t app
它引发以下异常:
no main manifest attribute, in app.war
但是,当我检查app.war时,/ META-INF / MANIFEST.MF中有一个清单,指出以下选项:
Manifest-Version: 1.0
Start-Class: com.package.app.AppMainClass
Spring-Boot-Classes: WEB-INF/classes/
Spring-Boot-Lib: WEB-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Main-Class: org.springframework.boot.loader.WarLauncher
据我了解的错误消息,它指出清单中缺少Main-Class属性(这是不可能的,因为它在那里)。 我还尝试过将真实类添加为Main-Class。
这导致了同样的错误。
有人可以帮助我重回正轨吗?
答案 0 :(得分:1)
首先,不要像WAR那样构建spring boot项目。仅当您有一个古老的古老项目迫使您将该应用程序部署到Web服务器/ Servlet容器时,才需要WAR。您需要从构建脚本中删除与战争相关的逻辑。
第二。确保正确构建项目。如果是gradle,则需要使用./gradlew build
进行构建,以供maven使用mvn package
。这样会将您的归档文件打包为uberjar-包括所有必需的依赖项,并建立适当的归档结构。
找到有关如何将春季启动应用程序放入Docker in the user guides的更多详细信息。
当且仅当由于某些奇怪的情况而需要将其构建为WAR并作为可执行存档运行时,请确保您进行了using the war-plugin provided by spring boot(不是内置的war插件)。这是构建可执行战争存档的唯一工作方法。