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>