使用maven插件构建可运行jar


当使用java+maven进行构建项目时,不依赖spring相关的东西,比如在做一些简单地应用类java项目时,当用到一些第三方的依赖jar是,在项目编写好之后,我们希望将项目构建成一个可运行的jar包并包含依赖的jar包,然后通过jar -jar xxx.jar来运行,这时我们可以使用maven的插件maven-assembly-plugin来实现。

maven-assembly-plugin 插件官方文档:http://maven.apache.org/plugins/maven-assembly-plugin/index.html

1、pom依赖:

<build>
        <finalName>jar_handlefinalName>
        
        <plugins>
            <plugin>
                <artifactId>maven-assembly-pluginartifactId>
                <configuration>
                    <appendAssemblyId>falseappendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependenciesdescriptorRef>
                    descriptorRefs>
                    <archive>
                        <manifest>
<mainClass>com.xxx.MainmainClass> manifest> archive> configuration> <executions> <execution> <id>make-assemblyid> <phase>packagephase> <goals> <goal>assemblygoal> goals> execution> executions> plugin> plugins> build>

maven-assembly-plugin插件会把项目中用到的依赖jar包包含在可执行的jar包中,这样项目在运行时有引用依赖jar的API地方就不会报错。使用idea工具可以看到assembly插件:

2、然后我们可以直接通过mvn clean install命令就会生成需要的jar包,如下:

这样就可以使用jar -jar命令来运行应用jar了

附注:

1、对于不依赖第三方的依赖jar时,我们可以使用maven-jar-plugin插件进行打包构建可运行jar,pom配置如下:

           <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-jar-pluginartifactId>
                <configuration>
                    <archive>
                        <manifest>
<addClasspath>trueaddClasspath>
<classpathPrefix>lib/classpathPrefix>
<!-- 程序路口 --> <mainClass>com.xxx.MainmainClass> manifest> archive> configuration> plugin>

使用mvn clean install构建包如下

可以看到该插件不会把依赖jar构建进最终jar包中。

2、此时可以考虑使用maven-dependency-plugin将需要的依赖jar复制到某个文件目录下,在后续启动应用jar时将目录路径设置成maven-jar-plugin插件设置的classpathPrefix属性设置的关联路径来运行。

pom配置

<plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-jar-pluginartifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>trueaddClasspath>
                            <classpathPrefix>lib/classpathPrefix>
                            <mainClass>com.xxx.MainmainClass>
                        manifest>
                    archive>
                configuration>
            plugin>
            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-dependency-pluginartifactId>
                <executions>
                    <execution>
                        <id>copyid>
                        <phase>packagephase>
                        <goals>
                            <goal>copy-dependenciesgoal>
                        goals>
                        <configuration>
                            <outputDirectory>
                                ${project.build.directory}/lib
                            outputDirectory>
                        configuration>
                    execution>
                executions>
            plugin>

上述中的classpathPrefix属性设置了类路径加载路径配置,需配合addClasspath设置为true一起使用。效果详见下图:

应用运行时就会按设置的路径去加载依赖jar,此时就是配置好依赖jar的路径与设置的路径一致即可。