准备环境
直接拉取使用现成的镜像吧:
docker pull virhuiai/maven_quick:version-aliyun
运行容器
进入一个目录:
cd /Volumes/RamDisk
运行maven并将当前目录映射到容器的工作目录,后面从容器里拷贝文件到宿主就可以不用docker cp命令了:
docker run -it --rm --name maven_quick_tmp_run \
-v "$HOME/.m2/repository":/root/.m2/repository \
-v "$PWD":/usr/src/mymaven \
-w /usr/src/mymaven \
virhuiai/maven_quick:version-aliyun \
/bin/sh
现在找下安装目录,知道maven有个settings.xml文件,就通过它来找到目录吧:
# updatedb
# locate settings.xml
/usr/share/maven/conf/settings.xml
找到了,目录是/usr/share/maven/(镜像安装有mlocate工具,有兴趣可以看看这个镜像的配置说明):
cd /usr/share/maven/
下面看一下该目录的结构和内容。
maven安装目录的结构和内容
# ls -al
total 60
drwxr-xr-x 1 root root 4096 Jan 13 07:04 .
drwxr-xr-x 1 root root 4096 Feb 1 06:55 ..
-rw-r--r-- 1 root root 17504 Nov 7 2019 LICENSE
-rw-r--r-- 1 root root 5141 Nov 7 2019 NOTICE
-rw-r--r-- 1 root root 2612 Nov 7 2019 README.txt
drwxr-xr-x 2 root root 4096 Jan 13 07:04 bin
drwxr-xr-x 2 root root 4096 Jan 13 07:04 boot
drwxr-xr-x 1 root root 4096 Feb 1 06:55 conf
drwxr-xr-x 4 root root 4096 Jan 13 07:04 lib
drwxr-xr-x 1 root root 4096 Jan 13 07:04 ref
有四个目录
drwxr-xr-x 2 root root 4096 Jan 13 07:04 bin
drwxr-xr-x 2 root root 4096 Jan 13 07:04 boot
drwxr-xr-x 1 root root 4096 Feb 1 06:55 conf
drwxr-xr-x 4 root root 4096 Jan 13 07:04 lib
drwxr-xr-x 1 root root 4096 Jan 13 07:04 ref
bin目录
# tree -N ./bin
./bin
├── m2.conf
├── mvn
├── mvn.cmd
├── mvnDebug
├── mvnDebug.cmd
└── mvnyjp
该目录包含了mvn运行的脚本,带cmd的是基于Windows平台的bat脚本,不带的是基于UNIX平台的Shell脚本。这些脚本用来配置Java命令,准备classpath和相关的Java系统属性,然后执行Java命令。带Debug的文件,只是多了条MAVEN_DEBUG_OPTS配置:
# cat mvnDebug

其作用就是在运行Maven时开启debug,以便调试Maven本身。
m2.conf是classworlds的配置文件:

boot目录
# tree -N boot
boot
├── plexus-classworlds-2.6.0.jar
└── plexus-classworlds.license
0 directories, 2 files
plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,Maven使用该框架加载自己的类库。
需要的话可以看看这边,一般用户不必太关心这个文件
https://github.com/codehaus-plexus/plexus-classworlds
<!-- https://mvnrepository.com/artifact/org.codehaus.plexus/plexus-classworlds -->
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-classworlds</artifactId>
<version>2.6.0</version>
</dependency>
conf目录
# tree conf
conf
├── logging
│ └── simplelogger.properties
├── settings.xml
└── toolchains.xml
settings.xml非常重要,控制Maven的行为。这儿的配置是全局的,最好是复制为~/.m2/settings.xml,在用户范围定制Maven的行为。
lib目录

lib目录包含了所有Maven运行时需要的Java类库。其中,maven-model-builder-3.6.3.jar中有超级POM, 我们可以解压出来看看:
cp /usr/share/maven/lib/maven-model-builder-3.6.3.jar /usr/src/mymaven
在宿主机解压后,可以在maven-model-builder-3.6.3/org/apache/maven/model目录中找到pom.xml,即超级POM。
