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】:您可能还需要添加 maven-jar-plugin 配置并在那里配置 MainClass。该程序集解压缩所有 JAR 文件(例如项目 jar 和依赖项 jar),我认为在 JAR 文件列表中找到的最后一个 MANIFEST.MF“覆盖”了预期/生成的 manifest.mf。
【讨论】:
以上是关于Maven 程序集插件未设置 MainClass 清单设置的主要内容,如果未能解决你的问题,请参考以下文章
用 exec.mainClass 覆盖 exec-maven-plugin