插件和依赖的区别
依赖:运行时开发时都需要用到的jar包,比如项目中需要一个Json的jar包,就要添加一个依赖,这个依赖在项目运行时也需要,因此在项目打包时需要把这些依赖也打包进项目里。
插件:在项目开的发时需要,但是在项目运行时不需要,因此在项目开发完成后不需要把插件打包进项目中,比如打包的时候也需要用到maven-jar-plugin这个插件,但是真正的项目包中是没有maven-jar-plugin这个包的,编译结束后就没用了,所以项目打包时并不需要把插件放进去。
plugins和pluginManagement
pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承。
pluginManagement一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;而在父POM中的pluginManagement并不会介入到Maven的生命周期。
plugins就是直接引入一个plugin,而且可以绑定到Maven相关的生命周期上。
一般第一次创建maven工程的时候会直接加上pluginManagement,很容易造成误解,容易将配置插件的时候放在了pluginManagement标签中,造成了不能使用的现状。
父pom:
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
子pom
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
</plugins>
但是如果只是想单独在一个小工程中使用某个插件的话,就不用这么麻烦,正常加入groupid,artififactid和version就行了,如下:
<?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>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.sonatype.haven.HavenCli</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
打包的时候遇到的一些问题
一般常用的是打包成jar包或者war包,使用的是maven-jar-plugin 来打包自己编写的java程序,一般是src/main/java中代码,但是一般还有很多依赖项需要一起放入jar包或者war包中,但是将依赖包放入这jar或者war中有些许不同,但是容易让人造成误解。
war包
打成war包,只需要在控制好依赖的范围:compile、test、provided,默认采用 compile。默认或者使用compile都会自动将依赖放入war中的WEB-INF/lib/中,不需要其它的插件做辅助。
jar包
打成jar包,按照上图中分布标签内容起作用,不仅如此,还要使用其它的插件才能更好的将不需要的文件排除或者包含。
maven-jar-plugin // 默认打包插件,用来创建工程中的jar包,一般是/src/main/java中的代码
maven-shade-plugin // 打可执行包,executable(fat) jar,将其它的依赖的jar包放入生成的jar中