Maven的默认POM文件,如果POM文件没有指定父POM文件,那么配置都是集成Super POM
Maven项目的完全限定名:
groupId:artifactId:version
packaging元素默认是JAR,还有其他选项是WAR,EAR等等
之前在Super POM一节谈到指定了父POM的继承指定父POM的配置,实现如下:
. |--my-app | |-- my-module | | `-- pom.xml `-- pom.xml
my-app的POM <project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> </project>
my-module的POM <project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-module</artifactId> <version>1</version> </project>
修改my-module的POM,即可实现讲my-app作为一个父POM继承给my-module,实现如下:
my-module的POM <project> <parent> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-module</artifactId> <version>1</version> </project>
如果my-app不是作为my-module的父目录,如下:
. |-- my-module | `-- pom.xml `-- my-app `-- pom.xml
需要配置<relativePath>属性,配置相对my-module的相对路径如下:
<project> <parent> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> <relativePath>../parent/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>my-module</artifactId> </project>
如果我们想要对一些模块都需要执行相同的命令,但是不想进入每一个模块下进行执行命令,可以使用Aggregation.
目录结构
. |-- my-module | `-- pom.xml `-- pom.xml
将my-module模块聚合到my-app,修改my-app的POM文件如下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> <packaging>pom</packaging> <modules> <module>my-module</module> </modules> </project>
Maven的设计哲学就是不要重复自己,所以当一些配置是相同的时候,我们可以使用自己定义的变量和预定义好的变量.
比如我们要使用projcet的version给其他配置项,我们可以如此使用
<version>${project.version}</version>
我们也可以使用自己定义的变量,比如我们定义了一个mavenVersion变量,我们可以如此使用
<project> ... <properties> <mavenVersion>2.1</mavenVersion> </properties> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-artifact</artifactId> <version>${mavenVersion}</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-project</artifactId> <version>${mavenVersion}</version> </dependency> </dependencies> ... </project>
我们在思考Maven是什么的时候,其中有一个理解就是Maven是一套规范,那么这些规范体现在哪里呢,体现在他的项目目录的结构
目录 | 解释 |
---|---|
src/main/java | Application/Library sources |
src/main/resources | Application/Library resources |
src/main/filters | Resource filter files |
src/main/webapp | Web application sources |
src/test/java | Test sources |
src/test/resources | Test resources |
src/test/filters | Test resource filter files |
src/it | Integration Tests (primarily for plugins) |
src/assembly | Assembly descriptors |
src/site | Site |
LICENSE.txt | Project's license |
NOTICE.txt Notices | and attributions required by libraries that the project depends on |
README.txt | Project's readme |
mvn compile
mvn test-compile
mvn test
我们执行编译的或者测试的时候会将需要依赖下载到本地仓库(一般在${user.home}/.m2/repository)中,供我们的项目使用。那么我们是不是也可以讲自己的项目给其他项目使用呢?
mvn packaging
该命令会将打包好的文件(如果我们在POM文件设置packaging是jar,那就打成jar包,以此类推)放在目录${basedir}/target
mvn install
surefire插件会查找项目中特定命名约定的文件
默认排除:
mvn clean
只将${basedir}/target里面的文件清除
<dependencies> ... <dependency> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>