【问题标题】:Deploy .war file in docker container: No main manifest attribute in app.war在 docker 容器中部署 .war 文件:app.war 中没有主要清单属性
【发布时间】:2018-09-03 11:50:10
【问题描述】:

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

这导致了同样的错误。

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

【问题讨论】:

  • 为什么需要将其部署为战争?我看到您将存档用作 uberjar。

标签: java docker gradle manifest


【解决方案1】:

首先不要将 Spring Boot 项目构建为 WAR。如果您有一些旧的古老项目迫使您将应用程序部署到 Web 服务器/servlet 容器,您将只需要 WAR。您需要从构建脚本中删除与战争相关的逻辑。

第二。确保您正在正确构建项目。如果是 gradle,则需要使用./gradlew build 构建,maven 使用mvn package。这会将您的存档打包为 uberjar - 包括所有需要的依赖项并制作正确的存档结构。

详细了解如何将 Spring Boot 应用程序放入 Docker in the user guides

当且仅当您需要将其构建为 WAR 并将其作为可执行存档运行时,请确保您这样做 using the war-plugin provided by spring boot(不是内置的 war 插件)。这是构建可执行战争档案的唯一可行方法。

【讨论】:

  • 好的,感谢您的提示!我已经在使用 ./gradlew build 构建项目。我得到的结果是项目根目录中的 /build folderv 有几个文件夹。其中我有一个 ./libs 文件夹,其中有一个 .war 和 .war.original 文件。我在哪里可以得到 uberjar?
  • JAR 文件将在同一个地方。但是您需要确保您的构建确实生成了 jar 文件。默认情况下它会执行此操作,但是您的构建脚本包含一条指令,它会改为生成 WAR。您需要删除该指令(在没有看到您的 build.gradle 的情况下不能说更多)。或者再一次,最简单的方法是检查您的设置与指南中的设置有何不同spring.io/guides/gs/spring-boot-docker
  • 好的,知道了。而且,在这个 .jar 中,我也有 webapp,对吗? (如果我把它放到 src/main/webapp 中)
  • 您肯定会拥有它们。从功能的角度来看没有任何变化。
猜你喜欢
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2022-12-23
  • 2021-05-29
相关资源
最近更新 更多