You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除Maven生成的默认JAR包引发构建失败问题求助

我之前也踩过这个坑!你遇到的报错核心原因很明确:maven-shade-plugin默认依赖maven-jar-plugin生成的主JAR包来进行合并打包操作,如果你直接禁用了jar插件,shade插件就找不到它需要处理的基础构件了,自然会报“project main artifact does not exist”的错误。

下面给你两种可行的解决方案,根据你的需求选就行:

方案一:保留maven-jar-plugin,让shade插件替代默认JAR(推荐)

不需要完全禁用jar插件,只需要配置shade插件,让它生成的JAR替换掉maven-jar-plugin生成的默认主构件。这样既满足你对最终构件的需求,又不会出现构件缺失的问题。

示例配置如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.3</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <!-- 关键配置:让shade生成的JAR作为项目主构件,替代jar插件的产物 -->
            <shadedArtifactAttached>false</shadedArtifactAttached>
            <!-- 这里可以添加你的shade自定义配置,比如指定主类、合并依赖规则等 -->
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>com.yourpackage.YourMainClass</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

方案二:禁用maven-jar-plugin,手动指定shade的输入源

如果你确实需要禁用maven-jar-plugin,那得明确告诉shade插件从哪里获取要打包的类文件——直接指定项目编译后的class目录即可。

示例配置如下:

<build>
  <plugins>
    <!-- 禁用默认的maven-jar-plugin执行 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.3.0</version>
      <executions>
        <execution>
          <id>default-jar</id>
          <!-- 让jar插件在package阶段不执行 -->
          <phase>none</phase>
        </execution>
      </executions>
    </plugin>

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.3</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <!-- 指定编译后的class目录作为shade的输入源 -->
            <sources>
              <source>
                <directory>${project.build.outputDirectory}</directory>
              </source>
            </sources>
            <!-- 同样可以配置主类等自定义内容 -->
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>com.yourpackage.YourMainClass</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

简单总结下:第一种方案更符合Maven的默认生命周期,减少配置复杂度;第二种方案适合你明确不需要默认JAR的场景。

内容的提问来源于stack exchange,提问作者Saurabh Srivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:31:51