Maven镜像源及常用的插件和命令

Maven库

方便我们搜索Jar包

https://developer.aliyun.com/mvn/search

Maven仓库

1
2
3
4
5
6
7
8
9
10
11
12
<repositories>
<repository>
<id>alimaven1</id>
<name>aliyun maven1</name>
<url>https://maven.aliyun.com/repository/spring-plugin</url>
</repository>
<repository>
<id>alimaven2</id>
<name>aliyun maven2</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>

Maven打包流程

构建项目的几个环节

  • 清理(clean):删除以前的编译结果,为重新编译做好准备。
  • 编译(compile):将Java 源程序编译为字节码文件。
  • 测试(test):针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
  • 打包(package):将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应 war 包。
  • 安装(install):在 Maven 环境下特指将打包的结果(jar包或war包)安装到本地仓库中。
  • 部署(deploy):将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。

打包区别

  • mvn package:打包到本项目,一般在项目target目录下。
  • mvn install:打包到本地仓库,如果没设置Maven本地仓库,一般在用户/.m2目录下。
  • mvn deploy:打包上传到远程仓库,如:私服nexus等,需要配置pom文件。

打包过程

清理并打包

1
mvn clean package

依次执行:clean、resources、compile、testResources、testCompile、test、jar(打包)。

清理、打包并安装到本地Maven中

1
mvn clean install

依次执行:clean、resources、compile、testResources、testCompile、test、jar(打包)、install。

清理、打包并安装到本地和远程Maven中

1
mvn clean deploy

依次执行:clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy。

由上面分析主要区别如下:

  • package命令:完成项目编译、单元测试、打包功能,但打包文件未部署到本地Maven仓库和远程Maven仓库。
  • install命令:完成项目编译、单元测试、打包功能,同时把打包文件部署到本地Maven仓库,但未部署到远程Maven仓库。
  • deploy命令:完成项目编译、单元测试、打包功能,同时把打包文件部署到本地Maven仓库和远程Maven仓库。

Maven常用命令

导出依赖jar

https://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html

导出指定范围

1
mvn dependency:copy-dependencies -DincludeScope=compile

排除指定范围

1
mvn dependency:copy-dependencies -DexcludeScope=provided

以下写法是不生效的,不能同时使用-DincludeScope-DexcludeScope

1
mvn dependency:copy-dependencies -DincludeScope=compile -DexcludeScope=provided

默认会将jar包放在项目中的target下的dependency目录下面

清理

1
mvn clean

Maven中添加本地jar

安装

1
mvn install:install-file -Dfile="D:\Tools\BigData\datax\lib\datax-core-0.0.1-SNAPSHOT.jar" -DgroupId="com.datax" -DartifactId="datax-core" -Dversion="0.0.1" -Dpackaging=jar

卸载

1
mvn dependency:purge-local-repository -DmanualInclude="com.datax:datax-core"

打Jar包插件

maven提供的打包插件有如下三种:

plugin function
maven-jar-plugin 可执行jar与依赖包是分开,需建立lib目录里来存放需要的j依赖包,且需要jar和lib目录在同级目录, 这也是默认打包方式
maven-assembly-plugin 支持定制化打包方式,例如 apache 项目的打包方式
每种打包方式都具有自己的应用场景。
maven-shade-plugin 用来打可执行包,可替换包名。

maven-jar-plugin

可执行jar与依赖包是分开,需建立lib目录里来存放需要的j依赖包,且需要jar和lib目录在同级目录, 这也是默认打包方式,所以打common包不写插件也能打包

maven-assembly-plugin

这个插件可以把所有的依赖包打入到可执行jar包。需要在pom文件的plugin元素中引入才可以使用,功能非常强大,是maven中针对打包任务而提供的标准插件。它是Maven最强大的打包插件,它支持各种打包文件格式,包括zip、tar.gz、tar.bz2等等,通过一个打包描述文件设置(src/main/assembly.xml),它能够帮助用户选择具体打包哪些资源文件集合、依赖、模块,甚至本地仓库文件,每个项的具体打包路径用户也能自由控制。

但是该插件有个bug会缺失spring的xds文件,导致无法运行jar,同时如果同级目录还有其它可执行jar文件依赖可能会产生冲突。

使用Maven的package命令打包项目;

打包完成后, 即可在项目的target目录下看到生成的jar包, 其中xxx-jar-with-dependencies.jar是包含依赖jar包的jar文件, 另一个不包含依赖jar包;

使用java -jar xxxx.jar命令即可运行此jar包.

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
<build>
<plugins>
<!-- Maven Assembly Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- MainClass in mainfest make a executable jar -->
<archive>
<manifest>
<mainClass>com.healchow.consumer.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<!-- 配置执行器 -->
<execution>
<id>make-assembly</id>
<!-- 绑定到package命令的生命周期上 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

maven-shade-plugin

需要在pom文件的plugin元素中引入才可以使用,它可以让用户配置Main-Class的值,然后在打包的时候将值填入/META-INF/MANIFEST.MF文件。关于项目的依赖,它很聪明地将依赖的JAR文件全部解压后,再将得到的.class文件连同当前项目的.class文件一起合并到最终的CLI包(可以直接运行的jar包)中,这样,在执行CLI JAR文件的时候,所有需要的类就都在Classpath中了。(springboot打包插件用的就是这个)

单个可执行Jar

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
<build>
<plugins>
<!-- Maven Shade Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 主类的全限定名 -->
<mainClass>com.healchow.consumer.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

解决Jar冲突

这是解决Jar冲突,作为其他项目的依赖jar

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
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.protobuf</pattern>
<shadedPattern>cn.psvmc.protobufv3</shadedPattern>
</relocation>
</relocations>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/maven/**</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>

如何选用

  • 如果在开发一个库,直接使用默认的maven-jar-plugin插件即可;

  • 如果是开发一个库或应用程序,需要替换包名解决包冲突,可以考虑使用maven-shade-plugin进行打包生成Uber jar

    • 如果是开发一个应用程序,并且依赖项目下的Jar,那么推荐使用maven-assembly-plugin插件来自定义打包内容。

概念

FatJar 又称作 uber-Jar,是包含所有依赖的 Jar 包。

maven-war-plugin

war项目默认的打包工具,默认情况下会打包项目编译生成的.class文件、资源文件以及项目依赖的所有jar包。

1
2
3
4
5
6
7
8
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<warName>guancheng</warName>
</configuration>
</plugin>

maven-source-plugin

用来打源代码包的, 就像spring写的包,我们要下源代码来看注释,我们自己写的包有时也需要打出源码包给别人用,打完只有就会有一个-sources后缀的包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<plugin>  
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

springboot打包插件

spring-boot-maven-plugin插件在Maven中提供了对Spring Boot的支持,可以帮助我们打包出可执行的jar包或者war包。

其实spring-boot-maven-plugin所做的工作是在默认的maven-jar-plugin插件打包结束后,将项目依赖的jar包中的.class文件重新进行打包。

Tomcat

1
2
3
4
5
6
7
8
9
10
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<path>/</path>
<port>8080</port>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>

编译

1
2
3
4
5
6
7
8
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>