java -jar ./target/pay.war ./target/pay.war 中没有主清单属 为什么?

发布于:2024-12-07 ⋅ 阅读:(114) ⋅ 点赞:(0)

当你尝试使用 java -jar ./target/pay.war 来启动你的 WAR 包时,遇到的错误是因为该 WAR 包没有包含主清单属性(Main-Class)。这是因为你的项目是一个 Spring Boot 项目,并且默认是作为 WAR 文件部署到外部容器(如 Tomcat)中,而不是作为独立的 Java 应用直接运行。

为什么没有主清单属性?

Spring Boot 的 WAR 包默认不需要 Main-Class 属性,因为它并不是直接通过 java -jar 启动的。Spring Boot 在 WAR 部署时会在 Tomcat 或其他容器中运行,而不是作为独立的 Java 应用。

Main-Class 是一个 JAR 文件中用于指定启动类的清单属性,而 WAR 文件是设计用来部署到 Web 容器(如 Tomcat)的,因此它不包含这个属性。

如何解决

  1. 如果你要通过 java -jar 启动,应该构建 JAR 包,而不是 WAR 包。你可以修改 pom.xml 文件,将其打包方式从 war 改为 jar,然后再重新打包。修改如下:

    <packaging>jar</packaging>
    

    之后,你可以使用以下命令来打包并启动:

    mvn clean package
    java -jar ./target/pay.jar
    

    这样你就能够直接运行 Spring Boot 应用了。

  2. 如果你需要 WAR 包用于外部 Tomcat 部署,你不能使用 java -jar 运行它。你应该将它部署到 Tomcat 或其他 Web 容器中,按照之前提到的方法使用 mvn tomcat7:deploy 命令进行部署。

总结

  • JAR 包:用于直接通过 java -jar 运行 Spring Boot 应用。
  • WAR 包:用于部署到外部 Tomcat 或其他 Web 容器中。

如果你希望将应用打包为 JAR 并直接运行,修改 pom.xml 中的打包方式为 jar 即可。

另一种方式 使用spring-boot-maven-plugin` 插件来使 Spring Boot 应用能够打包成一个可执行的 JAR 文件

你可以通过取消注释 spring-boot-maven-plugin 插件来使 Spring Boot 应用能够打包成一个可执行的 JAR 文件,并通过 java -jar 启动它。这个插件可以帮助 Spring Boot 自动生成一个可执行的 JAR 文件,并且包含应用的启动类和相关配置,避免了手动指定主清单属性的需求。

你可以将 pom.xml 中的 spring-boot-maven-plugin 插件部分改成这样:

<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
</plugins>

这样做的作用:

  1. 生成可执行的 JAR 文件:当你执行 mvn clean package 时,Spring Boot 会将应用打包成一个可执行的 JAR 文件,包含启动类和所有依赖。
  2. 无需手动指定主类:Spring Boot 会自动识别启动类并运行它,无需手动在清单文件中指定 Main-Class
  3. 运行命令:你可以通过以下命令启动应用:
    java -jar ./target/pay.jar
    

总结:

  • 如果你希望使用 java -jar 启动应用,需要配置 spring-boot-maven-plugin 插件并使用 JAR 包。
  • 如果你希望使用外部 Tomcat 部署应用,则需要将 pom.xml 中的打包方式保持为 war,并通过 Tomcat 部署 WAR 包。

确保根据你的需求选择合适的打包方式(JAR 或 WAR)。