Maven 程序集插件未设置 MainClass 清单设置

Posted

技术标签:

【中文标题】Maven 程序集插件未设置 MainClass 清单设置【英文标题】:Maven Assembly Plugin is not setting the MainClass manifest setting 【发布时间】:2011-12-08 18:50:33 【问题描述】:

我有一个 Maven 项目,它通过 maven assembly plugin 生成一个 jar,我想作为控制台应用程序运行。但是,未在 MANIFEST.MF 中设置 MainClass 属性。这是我的插件配置:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>net.justaprogrammer.poi.cleanser.Cleanser</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

但是,这不会被添加到mvn package 生成的 jar 中的 MANIFEST.MF。生成的清单如下:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: zippy
Build-Jdk: 1.6.0_25

我做错了什么?

【问题讨论】:

这与宣传的完全一样。你确定你在寻找正确的输出 jar 吗? 据我所知是的。我的 pom.xml 不包含名称为 jar 的插件。正如我在编辑中所说,我正在使用mvn package 来生成我的 jar。该 jar 名为 PoiCleanser-0.1.0.BUILD-SNAPSHOT.jar,位于目标文件夹的根目录下。 【参考方案1】:

我错过了您没有在包上生成程序集。您有一个 jar 项目,因此 Maven 将使用 maven-jar-plugin 构建一个 jar。你不必在你的 pom 中有任何东西来告诉它。这就是 Maven 的约定优于配置为您工作。它构建的 jar 将只包含您的项目类和资源。如果您想在该 jar 中的清单中添加一个 Main-Class,您应该 configure the jar plugin to do so。基本上,只需将 archive 配置移动到 jar 插件即可。

然而,如果你真的想组装一个可执行的 fat jar——也就是说,一个包含你所有的类以及所有依赖项的类的 jar——那么你的设置就在正确的位置,但您需要使用mvn assembly:single 或binding that goal to a lifecycle phase 实际运行程序集插件。需要明确的是,如果您这样做,那么您的项目将输出 两个 jar:一个包含您的项目文件,一个包含该文件以及您的项目所依赖的所有库的内容。前者是由 jar 插件构建的。后者是由程序集插件构建的。请注意,胖 jar 并不常用,使用它们时可能会遇到不寻常的问题,因为它们超出了普通 Java 的范围。

【讨论】:

瑞恩,这非常有用。我并不是特别嫁给一个胖罐子,但我很高兴我现在明白了其中的区别。我会测试并将您的答案标记为正确。 Ryan,我刚试过mvn assembly:single,我有一个包含所有依赖项的“fat jar”,我的 MANIFEST.MF 中有一个 Main-Class,但我实际上没有我写的代码在里面。我认为jar插件最好,但我也想要一个合适的jar插件。 我会为程序集插件提出一个单独的问题。【参考方案2】:

对于像我这样的复制粘贴粉丝,根据上面的答案组装,http://maven.apache.org/plugins/maven-assembly-plugin/usage.html#Execution:_Building_an_Assembly:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>com.db.search.filenet.Load</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <id>assemble-all</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

【讨论】:

错误答案,因为 OP 问题正是这里的 mainClass 没有写在清单中的事实,因为 OP 在 jar 生成的同一个项目上使用程序集。所以声明需要移到maven-jar-plugin中。【参考方案3】:

如果您碰巧使用 maven shade 插件来构建一个 fat jar(而不是使用程序集插件),值得注意的是,shade 插件处理 MANIFEST.MF 文件中的整体有点不同;请参阅 shade 插件的 executable jar 页面。

【讨论】:

【参考方案4】:

您可能还需要添加 ma​​ven-jar-plugin 配置并在那里配置 MainClass。该程序集解压缩所有 JAR 文件(例如项目 jar 和依赖项 jar),我认为在 JAR 文件列表中找到的最后一个 MANIFEST.MF“覆盖”了预期/生成的 manifest.mf。

【讨论】:

以上是关于Maven 程序集插件未设置 MainClass 清单设置的主要内容,如果未能解决你的问题,请参考以下文章

用 exec.mainClass 覆盖 exec-maven-plugin

使用Maven程序集插件创建WAR文件

maven项目打包插件:将maven项目打包成一个可执行的jar(瘦jar)

maven中如何打jar包

使用Maven程序集插件检测丢失的包含文件

maven 程序集插件中生成的 tar.gz 的后缀