首页 > 解决方案 > 我的 Maven 项目 VSCode 没有主清单属性错误

问题描述

在我使用 maven 构建我的 java 项目并尝试运行可执行文件后(构建过程中没有错误或警告),我收到以下错误:

C:\Users\User\Documents\Java\clothes-assistant\target>java -jar clothes-assistant-0.0.1-SNAPSHOT.jar
no main manifest attribute, in clothes-assistant-0.0.1-SNAPSHOT.jar

以下是我的 pom.xml 文件,我认为我搞砸了标签,但我从其他 StackOverflow 论坛获取了片段,他们做了类似的事情,所以我不知道我可能搞砸了。

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>me.louisspaghetti</groupId>
  <artifactId>clothes-assistant</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <name>clothes-assistant</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
          <configuration>
            <archive>
              <manifest>
                <mainClass>me.louisspaghetti.App</mainClass>
              </manifest>
            </archive>
        </configuration>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

注意:我使用的是 VSCode,所以我无权访问任何 IDE 特定的构建功能

标签: javamavenvisual-studio-code

解决方案


您在干净的插件插件配置中定义您的主类,这没有任何意义;你应该在 maven-jar-plugin-configuration 中配置它:

    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.0.2</version>
      <configuration>
        <archive>
          <manifest>
            <mainClass>me.louisspaghetti.App</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>

这将指示 maven 在生成的 jarfile 中的 MANIFEST.MF 文件中放置主类的声明:

$ unzip -l target/clothes-assistant-0.0.1-SNAPSHOT.jar 
Archive:  target/clothes-assistant-0.0.1-SNAPSHOT.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
      131  01-09-2020 09:31   META-INF/MANIFEST.MF
        0  01-09-2020 09:31   META-INF/

其中将包含以下内容:

Manifest-Version: 1.0
Created-By: Apache Maven
Build-Jdk: 1.8.0
Main-Class: me.louisspaghetti.App

该值java -jar将用于在 jarfile 中查找主类。


推荐阅读