常见maven打包方式

Posted ITBusTech

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见maven打包方式相关的知识,希望对你有一定的参考价值。

介绍 maven-jar-pluginmaven-assembly-pluginmaven-shade-plugin的使用,和他们之间的区别。原文出自:https://blog.dubby.cn/detail.html?id=9091

1.maven-jar-plugin

首先,需要配置这个plugin:

 
   
   
 
  1. <plugin>

  2.    <groupId>org.apache.maven.plugins</groupId>

  3.    <artifactId>maven-jar-plugin</artifactId>

  4.    <configuration>

  5.        <archive>

  6.            <manifest>

  7.                <addClasspath>true</addClasspath>

  8.                <classpathPrefix>lib/</classpathPrefix>

  9.                <mainClass>cn.dubby.maven.jar.plugin.Main</mainClass>

  10.            </manifest>

  11.        </archive>

  12.    </configuration>

  13. </plugin>

编写启动类:

 
   
   
 
  1. public static void main(String[] args) {

  2.    System.out.println("Hello, this is a application packaged by maven-jar-plugin");

  3.      LocalDateTime localDateTime = new LocalDateTime();

  4.      System.out.println(localDateTime);

  5. }

启动:

 
   
   
 
  1.  target git:(master) java -jar maven-jar-plugin-1.0-SNAPSHOT.jar

  2. Hello, this is a application packaged by maven-jar-plugin

但是,如果加上一个依赖呢?

我们加上 joda-time的依赖:

 
   
   
 
  1. <dependencies>

  2.    <!-- https://mvnrepository.com/artifact/joda-time/joda-time -->

  3.    <dependency>

  4.        <groupId>joda-time</groupId>

  5.        <artifactId>joda-time</artifactId>

  6.        <version>2.9.9</version>

  7.    </dependency>

  8. </dependencies>

修改启动类:

 
   
   
 
  1. public static void main(String[] args) {

  2.    System.out.println("Hello, this is a application packaged by maven-jar-plugin");

  3.    LocalDateTime localDateTime = new LocalDateTime();

  4.    System.out.println(localDateTime);

  5. }

再运行:

 
   
   
 
  1.  target git:(master) java -jar maven-jar-plugin-1.0-SNAPSHOT.jar

  2. Hello, this is a application packaged by maven-jar-plugin

  3. Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/LocalDateTime

  4.        at cn.dubby.maven.jar.plugin.Main.main(Main.java:13)

  5. Caused by: java.lang.ClassNotFoundException: org.joda.time.LocalDateTime

  6.        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

  7.        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

  8.        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

  9.        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

  10.        ... 1 more

发现我们增加的依赖并没有找到,怎么办呢?

请注意观察我们上面配置 maven-jar-plugin时的另外两个配置项:

 
   
   
 
  1. <plugin>

  2.    <groupId>org.apache.maven.plugins</groupId>

  3.    <artifactId>maven-jar-plugin</artifactId>

  4.    <configuration>

  5.        <archive>

  6.            <manifest>

  7.                <addClasspath>true</addClasspath>

  8.                <classpathPrefix>lib/</classpathPrefix>

  9.                <mainClass>cn.dubby.maven.jar.plugin.Main</mainClass>

  10.            </manifest>

  11.        </archive>

  12.    </configuration>

  13. </plugin>

addClasspathclasspathPrefix表明会把 lib下的jar作为第三方依赖加入package里,所以我们需要把依赖拷贝到 lib目录下,我们可以使用 maven-dependency-plugin:

 
   
   
 
  1. <plugin>

  2.    <groupId>org.apache.maven.plugins</groupId>

  3.    <artifactId>maven-dependency-plugin</artifactId>

  4.    <executions>

  5.        <execution>

  6.            <id>copy</id>

  7.            <phase>compile</phase>

  8.            <goals>

  9.                <goal>copy-dependencies</goal>

  10.            </goals>

  11.            <configuration>

  12.                <outputDirectory>

  13.                    ${project.build.directory}/lib

  14.                </outputDirectory>

  15.            </configuration>

  16.        </execution>

  17.    </executions>

  18. </plugin>

这样我们重新打包再运行:

 
   
   
 
  1.  target git:(master) java -jar maven-jar-plugin-1.0-SNAPSHOT.jar

  2. Hello, this is a application packaged by maven-jar-plugin

  3. 2018-01-22T14:48:00.915

去target目录下也可以发现多了个lib目录。

原文出自:https://blog.dubby.cn/detail.html?id=9091

2.maven-assembly-plugin

先配置plugin:

 
   
   
 
  1. <!-- Maven Assembly Plugin -->

  2. <plugin>

  3.    <groupId>org.apache.maven.plugins</groupId>

  4.    <artifactId>maven-assembly-plugin</artifactId>

  5.    <version>2.4.1</version>

  6.    <configuration>

  7.        <!-- get all project dependencies -->

  8.        <descriptorRefs>

  9.            <descriptorRef>jar-with-dependencies</descriptorRef>

  10.        </descriptorRefs>

  11.        <!-- MainClass in mainfest make a executable jar -->

  12.        <archive>

  13.            <manifest>

  14.                <mainClass>cn.dubby.maven.assembly.plugin.Main</mainClass>

  15.            </manifest>

  16.        </archive>

  17.    </configuration>

  18.    <executions>

  19.        <execution>

  20.            <id>make-assembly</id>

  21.            <!-- bind to the packaging phase -->

  22.            <phase>package</phase>

  23.            <goals>

  24.                <goal>single</goal>

  25.            </goals>

  26.        </execution>

  27.    </executions>

  28. </plugin>

启动类同上:

 
   
   
 
  1. public static void main(String[] args) {

  2.    System.out.println("Hello, this is a application packaged by maven-assembly-plugin");

  3.    LocalDateTime localDateTime = new LocalDateTime();

  4.    System.out.println(localDateTime);

  5. }

打包运行结果:

 
   
   
 
  1.  target git:(master) java -jar maven-assembly-plugin-1.0-SNAPSHOT-jar-with-dependencies.jar

  2. Hello, this is a application packaged by maven-assembly-plugin

  3. 2018-01-22T15:44:05.166

原文出自:https://blog.dubby.cn/detail.html?id=9091

3.maven-shade-plugin

配置如下:

 
   
   
 
  1. <!-- maven-shade-plugin -->

  2. <plugin>

  3.    <groupId>org.apache.maven.plugins</groupId>

  4.    <artifactId>maven-shade-plugin</artifactId>

  5.    <version>3.1.0</version>

  6.    <executions>

  7.        <execution>

  8.            <phase>package</phase>

  9.            <goals>

  10.                <goal>shade</goal>

  11.            </goals>

  12.            <configuration>

  13.                <transformers>

  14.                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

  15.                        <mainClass>cn.dubby.maven.shade.plugin.Main</mainClass>

  16.                    </transformer>

  17.                </transformers>

  18.            </configuration>

  19.        </execution>

  20.    </executions>

  21. </plugin>

启动类同上:

 
   
   
 
  1. public static void main(String[] args) {

  2.    System.out.println("Hello, this is a application packaged by maven-shade-plugin");

  3.    LocalDateTime localDateTime = new LocalDateTime();

  4.    System.out.println(localDateTime);

  5. }

结果:

 
   
   
 
  1.  target git:(master) java -jar maven-shade-plugin-1.0-SNAPSHOT.jar

  2. Hello, this is a application packaged by maven-shade-plugin

  3. 2018-01-22T15:42:19.662

原文出自:https://blog.dubby.cn/detail.html?id=9091

4.package比较

 
   
   
 
  1. -rw-r--r--  1 teeyoung  staff   622K  1 22 15:43 maven-assembly-plugin-1.0-SNAPSHOT-jar-with-dependencies.jar

  2. -rw-r--r--  1 teeyoung  staff   3.1K  1 22 14:47 maven-jar-plugin-1.0-SNAPSHOT.jar

  3. -rw-r--r--  1 teeyoung  staff   622K  1 22 15:42 maven-shade-plugin-1.0-SNAPSHOT.jar



以上是关于常见maven打包方式的主要内容,如果未能解决你的问题,请参考以下文章

Maven常见错误

maven中如何打包源代码

Maven常用命令及其作用常见问题常用命令使用场景举例

Maven常用命令及其作用常见问题常用命令使用场景举例

java怎样调用maven打包命令

使用maven搭建工程