maven 笔记

maven解决了 使用jdk命令 编译、打包 复杂繁琐的问题,提高了效率。
把 javac 命令封装简化为 maven package

(1) 安装配置

(1.1) 安装

在apache官网下载maven压缩包,解压完即可使用
下载地址 https://maven.apache.org/download.cgi

(1.2) 配置

需要配置环境变量
MAVEN_HOME 安装路径 ( C:\ProfessionSofware\Maven\apache-maven-3.3.9 )
注意:配置M2_HOME 或者 MAVEN_HOME 都可以,两个功能上是一样的
在环境变量path里添加 %MAVEN_HOME%\bin
注意:不要在环境变量的最后加;否则以后会遇到问题

** Windows下配置 **
MAVEN_HOME = C:\ProfessionSofware\Maven\apache-maven-3.3.9

** Mac下配置 **

export MAVEN_HOME=/Users/weikeqin/SoftWare/apache-maven-3.6.1
export PATH=$PATH:$MAVEN_HOME/bin

(1.3) 验证是否安装配置成功

配置完重新打开命令行 输入

** windows **

mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: C:\ProfessionSofware\Maven\apache-maven-3.3.9
Java version: 1.8.0_111, vendor: Oracle Corporation
Java home: C:\ProfessionSofware\Java\jdk1.8.0_111\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos"

** mac **

$ mvn -version
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00)
Maven home: /Users/weikeqin1/SoftWare/apache-maven-3.6.1
Java version: 1.8.0_211, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre
Default locale: en_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.13.6", arch: "x86_64", family: "mac"

出现以上信息说明配置成功

(1.4) 配置maven仓库

maven作为一个项目管理工具确实非常好用,但是在国内下载一些jar包很慢,所以需要一些镜像仓库。
maven仓库国内镜像。 maven仓库

修改 ${maven_home}/conf/setting.xml 文件
在maven的 settings.xml 文件里的 mirrors 节点,添加如下子节点:

<!-- add aliyun mirror-->
<mirror>  
  <id>nexus-aliyun</id>  
  <mirrorOf>central</mirrorOf>    
  <name>Nexus aliyun</name>  
  <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
</mirror> 

<!-- 中央仓库1 -->
<mirror>
  <id>repo1</id>
  <mirrorOf>central</mirrorOf>
  <name>Human Readable Name for this Mirror.</name>
  <url>http://repo1.maven.org/maven2/</url>
</mirror>

<!-- 中央仓库2 -->
<mirror>
  <id>repo2</id>
  <mirrorOf>central</mirrorOf>
  <name>Human Readable Name for this Mirror.</name>
  <url>http://repo2.maven.org/maven2/</url>
</mirror>

<!-- mvnrepository镜像,常用的maven中央仓库jar查询站点,可直接当maven镜像使用 -->  
<mirror>  
  <id>mvn</id>  
  <mirrorOf>mvnrepository</mirrorOf>  
  <url>http://mvnrepository.com/</url>  
</mirror>  

<mirror>
  <id>ui</id>
  <name>Mirror from UK</name>
  <url>http://uk.maven.org/maven2/</url>
  <mirrorOf>central</mirrorOf>
</mirror>

<mirror>
  <id>jboss-public-repository-group</id>
  <mirrorOf>central</mirrorOf>
  <name>JBoss Public Repository Group</name>
  <url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>

<!-- spring的libs-release镜像,存放spring项目及其子项目的jar包,以及相关的依赖jar -->  
<mirror>  
  <id>libs-release</id>  
  <mirrorOf>repo1</mirrorOf>  
  <url>https://repo.spring.io/libs-release</url>  
</mirror>  

<!-- spring的milestone镜像,存放着spring项目及其子项目的里程碑版本jar包 -->  
<mirror>  
  <id>milestone</id>  
  <mirrorOf>repo2</mirrorOf>  
  <url>https://repo.spring.io/milestone</url>  
</mirror>  

<!-- spring的snapshot镜像,存放着spring项目及其子项目的预览版本jar包 -->  
<mirror>  
  <id>snapshot</id>  
  <mirrorOf>repo3</mirrorOf>  
  <url>https://repo.spring.io/snapshot</url>  
</mirror>  

或者在pom.xml文件里添加repositories节点,代码如下

<repository>
    <id>nexus-aliyun</id>
    <name>Nexus aliyun</name>
    <layout>default</layout>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <releases>
        <enabled>true</enabled>
    </releases>
</repository>

(2) maven常用编译打包命令

(2.1) mvn clean

mvn clean 命令把详细参数全打印出来如下

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java -Dmaven.multiModuleProjectDirectory=/Users/weikeqin1/WorkSpaces/java/java-test -Dmaven.home=/Users/weikeqin1/SoftWare/apache-maven-3.6.1 -Dclassworlds.conf=/Users/weikeqin1/SoftWare/apache-maven-3.6.1/bin/m2.conf -Dfile.encoding=UTF-8 -classpath /Users/weikeqin1/SoftWare/apache-maven-3.6.1/boot/plexus-classworlds-2.6.0.jar org.codehaus.classworlds.Launcher -s /Users/weikeqin1/.m2/settings.xml -DskipTests=true clean -P local
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java  
-Dmaven.multiModuleProjectDirectory=/Users/weikeqin1/WorkSpaces/java/java-test
-Dmaven.home=/Users/weikeqin1/SoftWare/apache-maven-3.6.1
-Dclassworlds.conf=/Users/weikeqin1/SoftWare/apache-maven-3.6.1/bin/m2.conf
-Dfile.encoding=UTF-8 
-classpath /Users/weikeqin1/SoftWare/apache-maven-3.6.1/boot/plexus-classworlds-2.6.0.jar
-s /Users/weikeqin1/.m2/settings.xml
-DskipTests=true
-P local

-s /Users/weikeqin1/.m2/settings.xml 指使用指定的 settings.xml文件 --settings /Users/weikeqin1/.m2/settings.xml

(2.2) mvn clean package -Dmaven.test.skip=true -P local

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java -Dmaven.multiModuleProjectDirectory=/Users/weikeqin1/WorkSpaces/java/java-test -Dmaven.home=/Users/weikeqin1/SoftWare/apache-maven-3.6.1 -Dclassworlds.conf=/Users/weikeqin1/SoftWare/apache-maven-3.6.1/bin/m2.conf -Dfile.encoding=UTF-8 -classpath /Users/weikeqin1/SoftWare/apache-maven-3.6.1/boot/plexus-classworlds-2.6.0.jar org.codehaus.classworlds.Launcher  -s /Users/weikeqin1/.m2/settings.xml clean package -Dmaven.test.skip=true -P local

(3) maven编译配置

maven在编译时可以指定 编码、JDK版本 等,详细配置信息见 https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#forceJavacCompilerUse

(3.1) 常用配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

(3.2) 详细配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>

        <!-- The -source argument for the Java compiler. -->
        <!-- 源代码使用的JDK版本 -->
        <source>1.8</source>
        <!-- The -target argument for the Java compiler. -->
        <!-- 需要生成的目标class文件的编译版本 -->
        <target>1.8</target>

        <!-- The -encoding argument for the Java compiler.  -->
        <!-- 字符集编码  -->
        <encoding>UTF-8</encoding>

        <!-- maven.compiler.verbose -->
        <verbose>true</verbose>
        <!-- maven.compiler.showWarnings -->
        <showWarnings>true</showWarnings>

        <!-- Allows running the compiler in a separate process. Iffalseit uses the built in compiler, while iftrueit will use an executable. -->
        <!-- 要使compilerVersion标签生效,还需要将fork设为true,用于明确表示编译版本配置的可用 -->
        <fork>true</fork>
        <!-- Initial size, in megabytes, of the memory allocation pool, ex."64", "64m" ifforkis set totrue. -->
        <!-- 编译器使用的初始内存 -->
        <meminitial>128m</meminitial>
        <!-- Sets the maximum size, in megabytes, of the memory allocation pool,ex. "128", "128m" ifforkis set totrue. -->
        <!-- 编译器使用的最大内存 -->
        <maxmem>512m</maxmem>

        <!-- 要使用的编译器的编译器id 默认为javac   对应的配置项有 aspectj  csharp  eclipse jikes  -->
        <compilerId>javac</compilerId>
        <!-- 指定插件将使用的编译器的版本 -->
        <compilerVersion>1.3</compilerVersion>
        <!-- Sets the executable of the compiler to use whenforkistrue. -->
        <!-- 使用指定的javac命令,例如:<executable>${JAVA_1_4_HOME}/bin/javac</executable> -->
        <executable><!-- path-to-javac --></executable>
        <!-- Sets the arguments to be passed to the compiler ifforkis set totrue. -->
        <compilerArgs>
            <arg>-verbose</arg>
            <arg>-Xlint:all,-options,-path</arg>
            <arg>-Xmaxerrs</arg>
            <arg>1000</arg>
            <arg>-Xlint</arg>
            <arg>-J-Duser.language=en_us</arg>
        </compilerArgs>
    </configuration>
</plugin>

(4) maven打包配置

(4.1) spring-boot maven 打包

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

在pom文件里添加 spring-boot-maven-plugin 插件,打包时可以打成可执行jar包。

(4.2) maven打包

(5) 常见错误

1. maven项目 错误: 找不到或无法加载主类

报错信息为:Missing artifact com.company.air:air-client:jar:1.0.1
到当前用户的.m2目录下查看,jar文件已经正常下载了。
解决方法:
1 到报错的.m2的对应目录下,检查发现目录下是否存在以如下结尾的文件:
-not-available
.lastUpdated
将这两个文件删掉,重新build,如果问题解决,应该是之前未下载成功产生了这两个文件,影响了maven正常更新
2 删掉之后重新下载,下载完可能出现一种情况,本地maven仓库有了,Eclipse还提示没有,这是IDE的问题,
这个时候 选中项目 右键 maven update 记得选中force update,更新一下就好了
3 如果上述办法无效,到eclipse-help-install new software-available software sites下,
找之前安装m2eclipse插件的地址,如果是,将其卸载,
按如下地址重新安装m2eclipse插件:http://m2eclipse.sonatype.org/sites/m2e
4 如果上述方法仍无效,可尝试在eclipse中先用Close Project关掉出问题的工程,
然后再Open Project打开;或用Project-Clean重新build该工程

2. git + maven

http://www.blogjava.net/youxia/archive/2013/12/29/408182.html

3. maven可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)

http://www.tuicool.com/articles/yaeIV3

<exclusions>
    <exclusion>  <!-- declare the exclusion here -->
        <groupId>sample.ProjectC</groupId>
        <artifactId>Project-C</artifactId>
    </exclusion>
</exclusions>

4. Missing artifact jdk.tools:jdk.tools:jar:1.7

<dependency>  
    <groupId>jdk.tools</groupId>  
    <artifactId>jdk.tools</artifactId>  
    <version>1.7</version>  
    <scope>system</scope>  
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>  
</dependency>  

5. -source 1.5 中不支持 diamond 运算符

原因:在pom.xml里没有指定JDK版本

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.7</java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

6. The type org.nlpcn.commons.lang.tire.domain.Forest cannot be resolved. It is indirectly referenced from required .class files

1 JDK 版本
2 Jdk.tools
3 少nlp-lang的包

<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>${java.version}</version>
    <scope>system</scope>
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>

<dependency>
    <groupId>org.nlpcn</groupId>
    <artifactId>nlp-lang</artifactId>
    <version>1.7</version>
</dependency>

6. There are test failures.

BUILD FAILURE
There are test failures.

mvn clean install -Dmaven.test.skip=true

References

[1] Apache/ Maven/ Available Plugins
[2] Apache/Maven/Plugins/Apache Maven Compiler Plugin/Introduction
[3] Apache/ Maven/ Plugins/ Apache Maven Compiler Plugin/ compiler:compile

[1] maven常用命令
[2] 在Eclipse中创建Maven多模块工程的例子
[3] pom文件提示:Missing artifact
[4] maven项目 错误: 找不到或无法加载主类
[5] 快使用阿里云的maven仓库
[6] maven 编译时跳过单元测试
[7] Maven命令行窗口指定settings.xml
[8] maven-command-line-how-to-point-to-a-specific-settings-xml-for-a-single-command
[9] maven-command-to-determine-which-settings-xml-file-maven-is-using