信步漫谈之Maven——打可运行Jar包


1 目标

将本地 lib 和依赖 jar 包一起打为一个可执行的 jar 包。

2 程序结构

主项目:com.alfred.maven.packagejar-exec
引入本地 jar 包:maven-demo01-1.0.0-SNAPSHOT.jar
引入 maven 依赖包:log4j-1.2.12.jar

  • 主项目结构
com.alfred.maven.packagejar-exec
  ∟ lib
      ∟ maven-demo01-1.0.0-SNAPSHOT.jar
  ∟ src
      ∟ main
          ∟ java
              ∟ com.alfred.maven.packagejarexec
                  ∟ Main
      ∟ resources
          ∟ log4j.properties
  ∟ pom.xml
  • 主项目 Main 代码
package com.alfred.maven.packagejarexec;

import com.alfred.maven.demo01.MavenDemo01;
import org.apache.log4j.Logger;

/**
 * @Author: alfred
 * @Date: 2020/11/24
 * @description:
 */
public class Main {

    private static Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) {
        if(args == null || args.length == 0){
            logger.info("packagejar exec args is null");
        }else{
            logger.info("packagejar exec args.length = "+args.length);
        }
        logger.info("maven demo01 say:"+MavenDemo01.sayName());
    }

}
  • Demo01 的 MavenDemo01 代码
package com.alfred.maven.demo01;

/**
 * @Author: alfred
 * @Date: 2020/11/24
 * @description:
 */
public class MavenDemo01 {
    public static String sayName(){
        return "demo01";
    }
}

3 Maven 的 POM 脚本

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.alfred.maven</groupId>
    <artifactId>maven-packagejar-exec</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <description>
        概述:【Maven技术研究】打可执行 jar 包
        目标:将本地 lib 和依赖 jar 包一起打为一个可执行的 jar 包
        实现效果:输入 jar 包参数,打印日志输出参数个数,并调用本地jar包打印返回信息
        1)主函数:com.alfred.maven.packagejarexec.Main
        2)本地依赖包路径:lib(存放demo01)
        3)maven 依赖包:log4j
    </description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <log4j.version>1.2.12</log4j.version>
    </properties>

    <dependencies>
        <!-- maven依赖包 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!-- 本地jar包 -->
        <dependency>
            <groupId>com.alfred.maven</groupId>
            <artifactId>maven-demo01</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/maven-demo01-1.0.0-SNAPSHOT.jar</systemPath>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- 自动清理 -->
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <id>auto-clean</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!--
                使用场景:在使用maven依赖或本地jar包都可以使用该方式打包可执行jar包
                特点:会把依赖的所有jar包完整的压缩到可执行jar包中
            -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.alfred.maven.packagejarexec.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.jolira</groupId>
                <artifactId>onejar-maven-plugin</artifactId>
                <version>1.4.4</version>
                <executions>
                    <execution>
                        <configuration>
                            <!-- 自定义jar包名称 -->
                            <filename>packagejar-exec.jar</filename>
                            <attachToBuild>true</attachToBuild>
                            <classifier>onejar</classifier>
                        </configuration>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!--
                使用场景:在没有使用本地jar包情况下,也可以使用该方式打包
                特点:会解压依赖包合并到可执行jar包中
            -->
<!--            <plugin>-->
<!--                <groupId>org.apache.maven.plugins</groupId>-->
<!--                <artifactId>maven-shade-plugin</artifactId>-->
<!--                <version>1.2.1</version>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <phase>package</phase>-->
<!--                        <goals>-->
<!--                            <goal>shade</goal>-->
<!--                        </goals>-->
<!--                        <configuration>-->
<!--                            &lt;!&ndash; 自定义jar包名称 &ndash;&gt;-->
<!--                            <finalName>packagejar-exec</finalName>-->
<!--                            <transformers>-->
<!--                                <transformer-->
<!--                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">-->
<!--                                    <mainClass>com.alfred.maven.packagejarexec.Main</mainClass>-->
<!--                                </transformer>-->
<!--                            </transformers>-->
<!--                        </configuration>-->
<!--                    </execution>-->
<!--                </executions>-->
<!--            </plugin>-->
        </plugins>
    </build>
</project>

4 打包结构

packagejar-exec.jar
  ∟ META-INF
  ∟ com.simontuffs.onejar
      ∟ ...(打包组件的编译程序,省略)
  ∟ doc
  ∟ lib
      ∟ log4j-1.2.12.jar
      ∟ maven-demo01-1.0.0-SNAPSHOT.jar
  ∟ main
      ∟ maven-packagejar-exec-1.0.0-SNAPSHOT.jar
  ∟ src
      ∟ ...(打包组件的编译程序,省略)

5 参考资料(感谢)

将Maven项目打包成可执行jar文件(引用第三方jar)
Maven打成可执行jar,包含maven依赖,本地依赖

原文地址:https://www.cnblogs.com/alfredinchange/p/14071682.html