• maven 打包可运行jar包(转)


    目录

    1、前提

    2、方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包

    3、方法二:使用maven-assembly-plugin插件打包

    4、方法三:使用maven-shade-plugin插件打包

    ————————————————————————————————–

    1、前提

    Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现”no main manifest attribute, in xxx.jar”(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。

    要想jar包能直接通过java -jar xxx.jar运行,需要满足:

    1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;

    2、要能加载到依赖包。

    示例项目:

    这里写图片描述

    pom.xml基本配置:

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <spring.version>4.3.9.RELEASE</spring.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
        </dependencies>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用Maven有以下几种方法可以生成能直接运行的jar包,可以根据需要选择一种合适的方法。

    方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包

    在pom.xml中配置:

    
        <build>  
            <plugins>  
    
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-jar-plugin</artifactId>  
                    <version>2.6</version>  
                    <configuration>  
                        <archive>  
                            <manifest>  
                                <addClasspath>true</addClasspath>  
                                <classpathPrefix>lib/</classpathPrefix>  
                                <mainClass>com.wqc.main.SpringStart</mainClass>  
                            </manifest>  
                        </archive>  
                    </configuration>  
                </plugin>  
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-dependency-plugin</artifactId>  
                    <version>2.10</version>  
                    <executions>  
                        <execution>  
                            <id>copy-dependencies</id>  
                            <phase>package</phase>  
                            <goals>  
                                <goal>copy-dependencies</goal>  
                            </goals>  
                            <configuration>  
                                <outputDirectory>${project.build.directory}/lib</outputDirectory>  
                            </configuration>  
                        </execution>  
                    </executions>  
                </plugin>  
    
            </plugins>  
        </build>  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    执行maven package命令后生成: 
    这里写图片描述 
    执行maven install命令后生成: install 和package命令的区别将在下一篇说明 
    这里写图片描述

    然后在文件夹中按shift 鼠标右键点击打开cmd窗口,然后输入:java -jar mavenpackage-1.0.0.jar

    完全能运行….

    maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,com.xxg.Main指定MANIFEST.MF中的Main-Class,true会在MANIFEST.MF加上Class-Path项并配置依赖包,lib/指定依赖包所在目录。

    例如下面是一个通过maven-jar-plugin插件生成的MANIFEST.MF文件片段:

     Class-Path: lib/commons-logging-1.2.jar lib/commons-io-2.4.jar  
    Main-Class: com.xxg.Main 
    • 1
    • 2

    只是生成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到${project.build.directory}/lib指定的位置,即lib目录下。

    配置完成后,通过mvn package指令打包,会在target目录下生成jar包,并将依赖包拷贝到target/lib目录下,目录结构如下:

    这里写图片描述

    指定了Main-Class,有了依赖包,那么就可以直接通过java -jar xxx.jar运行jar包。

    这种方式生成jar包有个缺点,就是生成的jar包太多不便于管理,下面两种方式只生成一个jar文件,包含项目本身的代码、资源以及所有的依赖包。 
    将打包成的jar包解压后:

    这里写图片描述

    方法二:使用maven-assembly-plugin插件打包

    在pom.xml中配置:

    
        <build>  
            <plugins>  
    
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-assembly-plugin</artifactId>  
                    <version>2.5.5</version>  
                    <configuration>  
                        <archive>  
                            <manifest>  
                                <mainClass>com.wqc.main.SpringStart</mainClass>  
                            </manifest>  
                        </archive>  
                        <descriptorRefs>  
                            <descriptorRef>jar-with-dependencies</descriptorRef>  
                        </descriptorRefs>  
                    </configuration>  
                </plugin>  
    
            </plugins>  
        </build>  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    打包方式:

    这种必需要加上 assembly:single,只会生成一个mavenpackage-1.0.0.jar, 且运行时会报错:jar中没有主清单属性

    mvn package assembly:single 
    • 1

    打包后会在target目录下生成一个xxx-jar-with-dependencies.jar文件,这个文件不但包含了自己项目中的代码和资源,还包含了所有依赖包的内容。所以可以直接通过java -jar来运行。

    此外还可以直接通过mvn package来打包,无需assembly:single,不过需要加上一些配置:

    
        <build>  
            <plugins>  
    
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-assembly-plugin</artifactId>  
                    <version>2.5.5</version>  
                    <configuration>  
                        <archive>  
                            <manifest>  
                                <mainClass>com.wqc.main.SpringStart</mainClass>  
                            </manifest>  
                        </archive>  
                        <descriptorRefs>  
                            <descriptorRef>jar-with-dependencies</descriptorRef>  
                        </descriptorRefs>  
                    </configuration>  
                    <executions>  
                        <execution>  
                            <id>make-assembly</id>  
                            <phase>package</phase>  
                            <goals>  
                                <goal>single</goal>  
                            </goals>  
                        </execution>  
                    </executions>  
                </plugin>  
    
            </plugins>  
        </build>  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    其中package、single即表示在执行package打包时,执行assembly:single,所以可以直接使用mvn package打包。

    不过,如果项目中用到spring Framework,用这种方式打出来的包运行时可能会出错,但实验中没有出现这种情况。使用下面的方法三可以处理。 
    执行maven install后的target文件目录:

    这里写图片描述

    将打包好的jar包解压后: 
    这里写图片描述

    方法三:使用maven-shade-plugin插件打包

    在pom.xml中配置:

    
        <build>  
            <plugins>  
    
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-shade-plugin</artifactId>  
                    <version>2.4.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.wqc.main.SpringStart</mainClass>  
                                    </transformer>  
                                </transformers>  
                            </configuration>  
                        </execution>  
                    </executions>  
                </plugin>  
    
            </plugins>  
        </build>  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    配置完成后,执行mvn package即可打包。在target目录下会生成两个jar包,注意不是original-xxx.jar文件,而是另外一个。和maven-assembly-plugin一样,生成的jar文件包含了所有依赖,所以可以直接运行。

    执行maven install后 target文件夹如下所示: 
    这里写图片描述

    在cmd中可以直接 java -jar mavenpackage-1.0.0.jar即可运行,执行java -jar mavenpackage-1.0.0-shaded.jar也能执行。original-mavenpackage-1.0.0.jar只是对源码的打包,只有本身的class文件,不包含依赖的jar的class文件。

    将生成的三个jar文件解压:

    这里写图片描述

    如果项目中用到了Spring Framework,将依赖打到一个jar包中,且运行时会出现读取XML schema文件出错。原因是Spring Framework的多个jar包中包含相同的文件spring.handlers和spring.schemas,如果生成一个jar包会互相覆盖。为了避免互相影响,可以使用AppendingTransformer来对文件内容追加合并:

    
        <build>  
            <plugins>  
    
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-shade-plugin</artifactId>  
                    <version>2.4.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.xxg.Main</mainClass>  
                                    </transformer>  
                                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  
                                        <resource>META-INF/spring.handlers</resource>  
                                    </transformer>  
                                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  
                                        <resource>META-INF/spring.schemas</resource>  
                                    </transformer>  
                                </transformers>  
                            </configuration>  
                        </execution>  
                    </executions>  
                </plugin>  
    
            </plugins>  
        </build>  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    这样生成的jar包就只有两个了,mavenpackage-1.0.0-shaded.jar合并到了mavenpackage-1.0.0.jar中去了

    部分内容摘抄自网上…

    备注:转发url 
    https://blog.csdn.net/wqc19920906/article/details/79257402

  • 相关阅读:
    Codeforces 1065C Make It Equal
    Codeforces 1065B Vasya and Isolated Vertices
    Codeforces 1065A Vasya and Chocolate
    Luogu P2467 [SDOI2010]地精部落
    Codeforces 1042C Array Product
    Codeforces 1041C Coffee Break
    JMeter安装和环境变量搭建
    Jenkins
    Jenkins介绍
    Docker
  • 原文地址:https://www.cnblogs.com/lulu638/p/10366024.html
Copyright © 2020-2023  润新知