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