Java MVN 包管理工具

plus2047 于 2021-10-19 发布

MVN 的教程通常较为繁琐,这里给出一些最小化的例子,便于快速上手。

JAVA 包管理

为了理解 mvn,首先需要关于 java 包结构最低限度的理解。每个 java 文件开头应该有包声明:

package com.example.helloMvn;

public class Hello {
    public static void main(String[] args){
        hello();
    }
    public static void hello(){
        System.out.println("HelloNow");
    }
}

这个包名看上去像是反写的网址名(有时也确实是反写的网址名),通常是唯一的。于是,为了在其他包中使用这个 class,需要:

package com.emample.helloMvn2
import com.example.helloMvn.Hello;

public class HelloMvn2 {
    public static void main(String[] args){
        hello.hello();
    }
}

也即,java 是根据每个文件开头的包声明来确定包的 import 路径的。使用同一个包下的类不需要 import.

MVN 包管理

package 声明决定了导入包的语法,而 mvn 的功能是保证当前项目能够找到其他包、当前项目能够被其他包找到。

mvn 约定如下的工程结构,除非有明确的原因并且知道自己在干什么,不要违反该约定:

├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── helloMvn
    │   │               └── hello.java
    │   └── resources
    └── test
        └── java

工程中,pom.xmlmvn 的配置文件,其典型内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>helloMvn2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>helloMvn</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

项目的依赖应该都写到该配置文件中。配置已经写到该文件中后,在 IntelliJ IDE 中,在 Maven 面板上点击刷新即可自动安装依赖。

这个冗长的配置文件不便于手动创建,一般在 IDE 创建项目时自动创建或者使用如下命令创建基本的配置文件:

mvn -B archetype:generate \
  -DarchetypeGroupId=org.apache.maven.archetypes \
  -DgroupId=com.example \
  -DartifactId=helloMvn

该命令创建的 pom.xml 中有一个 junit 依赖,这是一个单元测试工具。

已经存在的工程根目录下,可以使用以下 mvn 命令:

mvn 在本地维护了一个 java 依赖库,默认位于 ~/.m2(数字 2 是第二版的意思),install 命令就是把 jar 包安装在该目录了。install 之后的包能够在本地的其他项目编译时被发现。

注意,mvn 虽然能自动解析依赖关系,但即便是对于本地项目,也不能自动更新依赖关系。比如有 A,B 两个项目,若 B 依赖 A,A 中代码若有更新,必须在 A 的目录下运行 install 然后在 B 再进行编译流程才能感知到 A 的变化。

mvn 打包生成的 jar 包可能没有指定 main 函数,这时可以使用以下命令运行:

java -classpath helloMvn-1.0-SNAPSHOT.jar com.example.helloMvn.hello

最终没找到怎么用 mvn 装依赖。也就是已经在 pom.xml 中写明了依赖包的情况下,怎么自动安装这些包。在 IntelliJ 中有一个 reimport all maven projects command 功能,其类似的命令可能是 mvn install -U

编译时打包依赖

使用以下命令,编译时会把依赖包拷贝到 target/lib.

mvn install dependency:copy-dependencies 

另一种办法是在 pom.xml 中写入以下长长的配置项(要以正确的标签嵌套方式写在正确的位置):

<project>
...
<profiles>
<profile>
<id>qa</id>
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>