美文网首页MavenSpring Cloud
maven打包可执行jar

maven打包可执行jar

作者: 水煮鱼又失败了 | 来源:发表于2020-06-29 18:18 被阅读0次

    1 场景

    1.1 功能

    通过maven名称生成可执行jar。

    1.2 特性

    (1)jar可读取外部配置文件

    (2)生成doc、执行脚本文件

    (3)打包时生产环境配置文件替换开发配置文件

    1.3 依赖maven插件

    (1)maven-jar-plugin

    (2)maven-assembly-plugin

    2 实现

    2.1 代码目录结构

    项目名称:mysql-doc,用于生成mysql数据库表结构到excel

    src
        -main
            -config
                -assembly
                    -package.xml //[2]
                -doc
                    -生成mysql表结构文档.txt
                -proConfig
                    -log4j.properties
                    -mysql.properties
                -scropts
                    -start.bat
                    -start.sh
            -java
                -com.ext.sjckall.mysql.doc.main
                    -MainExec //[3]
            -resources
                -log4j.properties
                -mysql.properties
        -pom.xml //[1]
    

    2.2 文件说明

    [1]pom.xml文件配置maven插件

    <build>
        <finalName>mysql-doc</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <!--生成的jar中,不要包含pom.xml和pom.properties这两个文件-->
                        <addMavenDescriptor>false</addMavenDescriptor>
                        <manifest>
                            <!--是否要把第三方jar放到manifest的classpath中-->
                            <addClasspath>true</addClasspath>
                            <!--生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/-->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!--运行jar包时运行的主类,要求类全名-->
                            <mainClass>com.ext.sjckall.mysql.doc.main.MainExec</mainClass>
                        </manifest>
                        <!-- classPath下增加目录 -->
                        <manifestEntries>
                            <Class-Path>.</Class-Path>  
                        </manifestEntries> 
                    </archive>
                    <!--过滤掉不希望包含在jar中的文件-->
                    <excludes>
                        <!-- 排除不需要的文件夹(路径是jar包内部的路径) -->
                        <exclude>*.properties</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.0</version>
                <!-- 对项目的组装进行配置 -->
                <configuration>
                    <!-- 指定assembly插件的配置文件所在位置 -->
                    <descriptors>
                        <descriptor>src/main/config/assembly/package.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <!-- 将组装绑定到maven生命周期的哪一阶段 -->
                        <!--<phase>package</phase>-->
                        <goals>
                            <!-- 指定assembly插件的打包方式, -->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    [2]package.xml文件内容

    <?xml version="1.0" encoding="UTF-8"?>
    <assembly>
        <id>full</id>
        <!-- 最终打包成一个用于发布的zip文件 -->
        <formats>
            <format>zip</format>
        </formats>
        <!-- 把依赖jar包打包进Zip压缩文件的lib目录下 -->
        <dependencySets>
            <dependencySet>
                <!--不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录-->
                <useProjectArtifact>false</useProjectArtifact>
                <!-- 第三方jar打包进Zip文件的lib目录下,注意此目录要与maven-jar-plugin中classpathPrefix指定的目录相同,不然这些依赖的jar包加载到ClassPath的时候会找不到 -->
                <outputDirectory>lib</outputDirectory>
                <!-- 第三方jar不要解压-->
                <!--<unpack>false</unpack>-->
            </dependencySet>
        </dependencySets>
        <!-- 文件设置,你想把哪些文件包含进去,或者把某些文件排除掉,都是在这里配置-->
        <fileSets>
            <!-- 把项目自己编译出来的可执行jar,打包进zip文件的根目录 -->
            <fileSet>
                <directory>${project.build.directory}</directory>
                <outputDirectory></outputDirectory>
                <includes>
                    <include>*.jar</include>
                </includes>
            </fileSet>
            <!-- 生产配置文件 -->
            <fileSet>
                <directory>src/main/config/proConfig</directory>
                <outputDirectory></outputDirectory>
                <includes>
                    <include>*</include>
                </includes>
            </fileSet>
            <!-- 执行脚本目录 -->
            <fileSet>
                <directory>src/main/config/scripts</directory>
                <outputDirectory></outputDirectory>
                <includes>
                    <include>*</include>
                </includes>
            </fileSet>
            <!-- 说明文档目录 -->
            <fileSet>
                <directory>src/main/config/doc</directory>
                <outputDirectory>doc</outputDirectory>
                <includes>
                    <include>*</include>
                </includes>
            </fileSet>
        </fileSets>
    </assembly>
    

    [3]程序入口文件MainExec

    public class MainExec {
    
    private static final Logger LOG=Logger.getLogger(MainExec.class);
        public static void main(String[] args) {
            SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            LOG.info("[生成mysql文档]开始时间:"+dateFormat.format(new Date()));
            ExecMysqlToDoc.mainMethod();
            LOG.info("[生成mysql文档]结束时间:"+dateFormat.format(new Date()));
        }
    }
    

    2.3 打包可执行文件

    项目根目录下执行如下命令:

    (1)编译项目

    mvn clean install
    

    (2)打包文件

    mvn assembly:single
    

    打包后生成文件:mysql-doc-full.zip,文件目录如下:

    mysql-doc
        -doc
            -生成mysql表结构文档.txt
        -lib
            -*.jar
        -log4j.properties
        -mysql.properties
        -mysql-doc.jar
        -start.bat
        -start.sh
    

    整理后端bat脚本如下:

    C:
    echo [1、项目编译]
    cd C:\work\ideaWsAll\trunkPro\sjckend
    call mvn clean install
    pause
    
    echo [2、打包文件]
    cd C:\work\ideaWsAll\trunkPro\sjckend\mysql-doc
    call mvn assembly:single
    pause
    
    echo [3、复制文件]
    xcopy /y /c /h /r "C:\work\mysql-doc\target\mysql-doc-full.zip" "D:\myData"
    

    3 获取项目相对路径

    3.1 输出文件到项目相对路径

    项目运行期间,会输出相关文件到执行文件绝对路径下,采用此种方式获取执行jar的绝对路径。参数为执行代码的class。

    /**
      * 获取执行jar路径
      * @return
      */
    private static String getJarUrl(Class<?> clazz){
        String filePath=clazz.getProtectionDomain().getCodeSource().getLocation().getPath();
        try {
            //转换处理中文及空格 
            filePath = URLDecoder.decode(filePath, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } 
        //可执行jar包运行的结果里包含".jar"
        if (filePath.endsWith(".jar")) {
            //截取路径中的jar包名
            filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1);
        }
        return filePath;
    }
    

    如需要将项目结果输出到执行jar平级的文件夹内,可以采用以下方式获取文件夹绝对路径:

    /**
      * 获取执行输出目录
      * @return
      */
    public static String getJarOutUrl(Class<?> clazz){
        String filePath=getJarUrl(clazz);
        filePath=filePath+"out/";
        File file=new File(filePath);
        if(!file.exists()){
            file.mkdirs();
        }
        return filePath;
    }
    

    3.2 输出日志文件

    如需要将日志输出到执行jar的平级文件夹logs中,log4j.properties采用如下配置:

    log4j.appender.result=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.result.Threshold=INFO
    log4j.appender.result.file=./logs/result.log
    log4j.appender.result.DatePattern='.'yyyy-MM-dd'.log'
    log4j.appender.result.layout=org.apache.log4j.PatternLayout
    log4j.appender.result.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [ %l ] - [ %p ]: %m%n
    log4j.appender.result.Append=true
    log4j.appender.result.encoding=UTF-8
    

    3.3 读取外部配置文件

    读取外部properties配置文件,可采用如下方式:

    Properties properties = new Properties();
    properties.load(MysqlConfigContent.class.getClassLoader().getResourceAsStream("./mysql.properties"));
    

    相关文章

      网友评论

        本文标题:maven打包可执行jar

        本文链接:https://www.haomeiwen.com/subject/pidafktx.html