maven打包时指定主类

如果我们的Java项目利用maven构建,并且想打成jar包运行,如果我们直接用mvn clean package命令进行打包,在target目录下生成的jar包,我们通过java -jar xxx.jar进行运行,会报如下错误:

.\original-hello-world-1.0-SNAPSHOT.jar中没有主清单属性

原因

这是因为,我们的jar包中没有指定启动的主类是什么。

这个主类清单属性在哪里指定呢?

我们用压缩软件解压刚刚生成的jar包,找到META-INF文件夹,下面有一个MANIFEST.MF文件,用记事本打开这个文件。如果指定了启动的主类,那么这个文件中会有一个属性叫做Main-Class

解决办法

我们可以利用maven插件在打包的时候指定主类,在maven配置中增加一下配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

其中<mainClass>标签中的内容就是主类的全限定名,然后再执行maven打包命令,会在tartget目录生成两个jar包。其中一个是以origin开头的,这个就是原始jar包,是没有指定主类的。另外一个没有以origin开头的,是已经添加了主类清单的jar包,可以使用java -jar 命令运行。


maven打包时指定主类
https://www.zhaojun.inkhttps://www.zhaojun.ink/archives/maven-package-main-class
作者
卑微幻想家
发布于
2022-11-22
许可协议