在docker容器中部署.war文件:app.war

时间:2018-09-03 11:50:10

标签: java docker gradle manifest

我有一个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。

这导致了同样的错误。

有人可以帮助我重回正轨吗?

1 个答案:

答案 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插件)。这是构建可执行战争存档的唯一工作方法。