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.xml 是 mvn 的配置文件,其典型内容如下:
<?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 compile:编译生成class文件mvn package:打包生成jar文件mvn install:将jar文件安装在本地mvn clean:清理所有编译生成的文件
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>