0%

Maven 安装使用

安装 (Ubuntu)

apt-get 方式

apt-get 会比较方便, 但安装出来版本可能不是最新的.

1
sudo apt-get install maven

安装完的目录为, Maven home: /usr/share/maven; Config file: /etc/maven.

settings.xml 位置: /etc/maven/settings.xml .

官网安装

apt 版本太旧了. 没有高亮, 且错误信息都不显示. 最后还得从官网装最新的.

官网下载页面 | 官网安装教程

下载后解压.

1
sudo tar -zxvf apache-maven-3.6.1-bin.tar.gz -C /usr/local/bin/

打开 /etc/profile 并添加 PATH.

1
export PATH=/usr/local/bin/apache-maven-3.6.1/bin:$PATH

重启一下系统. 然后 mvn -v 以看看是否安装成功.

1
2
3
4
5
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00)
Maven home: /usr/local/bin/apache-maven-3.6.1
Java version: 1.8.0_161, vendor: Oracle Corporation, runtime: /usr/lib/jdk/jdk1.8.0_161/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-21-generic", arch: "amd64", family: "unix"

配置文件: /usr/local/bin/apache-maven-3.6.1/conf/settings.xml.

指令

mvn clean install

1
2
3
4
5
mvn clean install -DskipTests   # 跳过单元测试

# -pl: 仅构建选中的项目 (而不是目录下所有项目)
# -am: 同时处理选定模块所依赖的模块
mvn clean install -pl :<assemblyname> -am

查看当前生效的 settings.

1
mvn help:effective-settings

第一次使用该指令时会先下一坨东西.

踩坑

下载慢

换阿里云的源.

打开 settings.xml.

<mirrors> 标签中添加

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<mirror>
<id>aliyun-public</id>
<mirrorOf>*</mirrorOf>
<name>aliyun public</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

<mirror>
<id>aliyun-central</id>
<mirrorOf>*</mirrorOf>
<name>aliyun central</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>

<mirror>
<id>aliyun-spring</id>
<mirrorOf>*</mirrorOf>
<name>aliyun spring</name>
<url>https://maven.aliyun.com/repository/spring</url>
</mirror>

<mirror>
<id>aliyun-spring-plugin</id>
<mirrorOf>*</mirrorOf>
<name>aliyun spring-plugin</name>
<url>https://maven.aliyun.com/repository/spring-plugin</url>
</mirror>

<mirror>
<id>aliyun-apache-snapshots</id>
<mirrorOf>*</mirrorOf>
<name>aliyun apache-snapshots</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>

<mirror>
<id>aliyun-google</id>
<mirrorOf>*</mirrorOf>
<name>aliyun google</name>
<url>https://maven.aliyun.com/repository/google</url>
</mirror>

<mirror>
<id>aliyun-gradle-plugin</id>
<mirrorOf>*</mirrorOf>
<name>aliyun gradle-plugin</name>
<url>https://maven.aliyun.com/repository/gradle-plugin</url>
</mirror>

<mirror>
<id>aliyun-jcenter</id>
<mirrorOf>*</mirrorOf>
<name>aliyun jcenter</name>
<url>https://maven.aliyun.com/repository/jcenter</url>
</mirror>

<mirror>
<id>aliyun-releases</id>
<mirrorOf>*</mirrorOf>
<name>aliyun releases</name>
<url>https://maven.aliyun.com/repository/releases</url>
</mirror>

<mirror>
<id>aliyun-snapshots</id>
<mirrorOf>*</mirrorOf>
<name>aliyun snapshots</name>
<url>https://maven.aliyun.com/repository/snapshots</url>
</mirror>

<mirror>
<id>aliyun-grails-core</id>
<mirrorOf>*</mirrorOf>
<name>aliyun grails-core</name>
<url>https://maven.aliyun.com/repository/grails-core</url>
</mirror>

<mirror>
<id>aliyun-mapr-public</id>
<mirrorOf>*</mirrorOf>
<name>aliyun mapr-public</name>
<url>https://maven.aliyun.com/repository/mapr-public</url>
</mirror>

啊~~ 速度起飞了.

但阿里云镜像有时候会抽风, 就突然长时间无响应, 给人一种爬虫被 ban 的感觉.

更新: 好消息特大好消息, 就在刚刚 (2019年07月09日), 腾讯云开源软件镜像站突然就上线了!!!

1
2
3
4
5
6
<mirror>
<id>nexus-tencentyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus tencentyun</name>
<url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
</mirror>

不过还没试过. 应该还可以.

Eclipse 配置 Maven

现在的 Eclipse 自带 Maven 插件.

Window -> Preference -> Maven -> Installation, 添加本地 Maven 主目录, 不要用 Eclipse 自带的.

Window -> Preference -> Maven -> User Settings, 修改配置文件地址.

This compilation unit is not on the build path of a java project.

在给 java 源文件导入包时如图报错:

解决方法: 未解决.

不支持 Lambda 等语法

Maven 默认使用语言版本比较低, 要在 POM 的 build - plugins 添加以下内容以支持 Java 8 的语法:

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

打包 Jar 时也将依赖打包入同一文件

在 POM 的 build - plugins 添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>xjf.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>

OpenJDK 8 不包含 javafx.util

打包后的 Jar 包在本机上运行的好好的, 跑服务器上报错:

1
Exception in thread "main" java.lang.NoClassDefFoundError: javafx/util/Pair

一看原来是本机用的 Oracle JDK 8, 服务器用的 OpenJDK 8. OpenJDK 8 内不包括 javafx.util 这个商用包. 不过听说 OpenJDK 10+ 之后就拥有了这些商用功能.

在不动源码, 不改服务器 JDK 的情况下, 解决方法是把 javafx.util 手动添加为 Maven 依赖, 打 Jar 包时一起打进去.

1
2
3
4
5
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>15.0.1</version>
</dependency>

然后放到服务器上又报错:

1
Exception in thread "main" java.lang.UnsupportedClassVersionError: javafx/util/Pair has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

原因是 15 版本的 javafx 编译版本太高 (55.0), 服务器上的老旧 JVM 不支持. 要改用 52.0 编译的旧版本. 但问题在于, Maven 中央仓库上 javafx 旧版本已经被删除了, 还在仓库的最老的版本是 11, 11 是 54.0 编译的, 依然不行.

最终解决方案是自己重写了一个 Pair 类... 因为好在我的项目只使用了 javafx.util.Pair 这一个类...