1

有没有办法验证(甚至使用另一个插件)为mainClass指定的maven-jar-plugin类是一个有效的类,甚至更好的是它有一个public static void main(String[] argv)方法?

通常在重构之后,这是被遗漏的一件事,我想避免这种情况并在verify生命周期阶段进行检查。

4

1 回答 1

1

您可以使用 theexec-maven-plugin及其exec目标来执行以下命令:

java -jar target\project.jar

确实会根据清单文件执行它(因此执行配置的 main 方法)或失败。

verify因此,您可以将以下(示例)配置添加到阶段:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.sample.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.4.0</version>
            <executions>
                <execution>
                    <id>check-main</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <executable>java</executable>
                        <arguments>
                            <argument>-jar</argument>
                            <argument>${project.build.directory}/${project.build.finalName}.jar</argument>
                            <argument>sanityCheck</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在上面的片段中,我们是:

  • 配置maven-jar-plugin以在其清单中配置主类(com.sample.Main本例中的示例)
  • 配置在最终工件上exec-maven-plugin执行java上面的命令(注意使用maven属性避免硬编码工件名称和路径,推荐)
  • 作为建议,还向此执行传递一个进一步的参数,您的主要方法应该预见到该参数作为健全性检查,也就是说,执行它以进行空运行(只需将信息打印到控制台或直接返回)
  • 如果清单的信息正确,则执行将成功运行,否则将失败(因此您的构建)。

只需将main方法重命名为main2将使用以下消息破坏构建:

[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ simple ---   
[INFO] Building jar: C:\Development\workspace-mars\simple\target\simple-0.0.1-SNAPSHOT.jar   
[INFO]   
[INFO] --- exec-maven-plugin:1.4.0:exec (check-main) @ simple ---   
Error: Main method not found in class com.sample.Main, please define the main method as:   
   public static void main(String[] args)   
[INFO] ------------------------------------------------------------------------  
[INFO] BUILD FAILURE   
[INFO] ------------------------------------------------------------------------   

请注意,上面的消息几乎就是您要查找的内容:

错误:在 com.sample.Main 类中找不到主方法,请将主方法定义为:
public static void main(String[] args)

于 2016-04-07T14:19:44.523 回答