Maven Assembly Plugin未设置MainClass清单设置

时间:2011-10-16 15:58:10

标签: maven-2 maven-assembly-plugin

我有一个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

我做错了什么?

4 个答案:

答案 0 :(得分:11)

我想念你没有在包装上生成装配。你有一个jar项目,所以Maven将使用maven-jar-plugin构建一个jar。你的pom中没有任何东西可以告诉它。这是Maven的for-convention-over-configuration为你工作。它构建的jar只包含你的项目类和资源。如果要将Main-Class添加到该jar中的清单,则应configure the jar plugin to do so。基本上,只需将archive配置移动到jar插件。

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

答案 1 :(得分:1)

如果你碰巧使用maven shade插件来构建一个胖jar(而不是使用程序集插件或者除了使用程序集插件之外),值得注意的是,shang插件在MANIFEST.MF文件中处理有点不同;请参阅shade插件的executable jar页面。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

对于像我这样的复制粘贴爱好者,请从上面的答案中收集答案,并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>