在命令行中输入:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
可以先切换到目标目录后执行此命令。
执行后,进入my-app目录
可以看到标准的maven结构:
my-app
|--pom.xml
`--src
`--main
`--java
`--test
`--java
pom.xml包含了项目对象的定义
而src则包含了代码和测试代码
解析一下以上命令
archetype:generate,archetype实际是maven中的一个插件archetype。使用原型插件和一些参数我们按照事先定义好的原型创建了一个maven项目
对项目打包:
mvn package
打好的包在工程target目录下
注:你可能看到两个命令不一样,这里涉及到一个概念,archetype:generate是一个目标,而package则是一个阶段,一个阶段是有步骤和顺序的,可能在之前有很多其他的步骤,执行这个阶段,会导致之前的阶段的阶段会执行。这些阶段都包含在项目构建的生命周期中。
maven生命周期的阶段列表:
- validate: 验证工程的正确性
- compile: 编译工程
- test: 使用测试代码测试工程,非必要
- package: 打包
- integration-test: 集成测试
- verify: 验证包的有效性
- install: 安装包到本地仓库中,作为其他项目的使用依赖
- deploy: 发布到生产环境中,可以远程发布
另外还有2个阶段不在生命周期中:
- clean:清理以前构建的项目
- site: 为项目产生文档
阶段会执行一些隐藏的目标,也可以显式的使用来产生不同的目标:
如打包时可以为阶段指定目标
mvn package war:war
阶段,目标可以在一个命令中按顺序执行
mvn clean dependency:copy-dependencies package
这个命令的执行顺序:清理工程-拷贝依赖-将项目打包
下面来看下maven工程的核心文件pom.xml这个文件包含了整个项目的必要信息,工程就是围绕这个文件来进行构建和管理的,所以必须熟悉这个文件。
pom.xml的一些基本元素:
- project 顶级元素,其他的都包含在这个里面.
- modelVersion pom模型的版本,这个东西本身的改变是非常频繁的,但是为了项目稳定,除非项目管理者觉得有必要才改变.
- groupId 公司和组织创建的项目的唯一标记.一般用公司或组织域名。
- artifactId 项目主要构件的唯一基本名称. 也是典型的jar包命令的一部分. 另外作为资源包时这也是最终命令的一部分. 典型的构件名称组成<artifactId>-<version>.<extension> (for example, myapp-1.0.jar).一般来说就是工程名。
- packaging 指定了主要构建打包的类型. 这不仅仅是包的类型定义也是构建生命周期的一个阶段. 默认为jar.
- version 项目主要构件的版本. 表示了项目的开发状态.
- name 项目的名称. 经常用来产生文档.
- url 项目的站点,找项目地址用的. 经常用来产生文档.
- description 项目基本描述. 产生文档用的.
maven的插件配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
maven使用资源文件
maven资源文件的放置路径一般为src/main/resources
放在此目录下的文件在打包时会进入包的根目录下。
另外,resources中的属性文件经常会引用一些属性在构建的时候,那么需要在pom.xml做显示的声明
一般在pom.xml文件中定义属性如下:
<properties>
<author>xxxxx</author>
</properties>
另外如果想用外部文件来定义属性。在maven中这类文件一般放置在
src/main/filters下
同时,因为引用属性在pom.xml默认是false,所以需要显式声明
<build>
<resources>
<resource>src/main/resources</resource>
</resources>
</build>
完整的引用一个外部属性文件的写法
<build>
<filters>
<filter>src/main/filters/filter.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
maven使用外部依赖
在pom.xml中添加外部依赖的写法
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
三个主要元素是groupId,artifactId,version这三个元素指定了依赖包
而scope则指定了使用范围,如test就仅在test阶段使用。一般这个值可以为compile, test, and runtime
maven会从远程库安装jar包到本地库。远程库一般在http://search.maven.org
如果你想使用某个依赖,可以到 ibiblio 中去查其maven的元数据
比如你想找log4j,在 ibiblio 中就能找到其路径,查看maven-metadata.xml
<metadata> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.1.3</version> <versioning> <versions> <version>1.1.3</version> <version>1.2.4</version> <version>1.2.5</version> <version>1.2.6</version> <version>1.2.7</version> <version>1.2.8</version> <version>1.2.11</version> <version>1.2.9</version> <version>1.2.12</version> </versions> </versioning> </metadata>
就能知道三个元素来获取依赖jar包。
然后执行mvn-complie就能安装了
部署自己的jar包到远程库中
如果你想把自己的jar包部署到远程库中,需要在pom.xml和setting.xml中配置
pom.xml
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
setting.xml中
<servers>
<server>
<id>mycompany-repository</id>
<username>jvanzyl</username>
<!-- Default value is ~/.ssh/id_dsa -->
<privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
<passphrase>my_key_passphrase</passphrase>
</server>
</servers>
使用原型创建其他类型的工程
创建一个简单的web工程
mvn archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DgroupId=com.mycompany.app \ -DartifactId=my-webapp
一次构建多个工程
如果想在war包中包含以前工程的jar包,那么可以在外层创建一个pom.xml作为父级pom
用my-web和my-app举例
在他们的上层目录新建一个pom.xml
<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.mycompany.app</groupId> <artifactId>app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>my-app</module> <module>my-webapp</module> </modules> </project>
然后在web-app的pom.xml中加入依赖
<dependency>
<groupId>com.pjj.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
然后在my-app和web-app的pom.xml中加入
<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/maven-v4_0_0.xsd">
<parent>
<groupId>com.pjj.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
..........
</project>
然后在父类pom.xml中执行mvn clean install,就可以看到war包中有my-app的jar包了
备注:常用目标
生成IntelliJ IDEA 工程
mvn ide:ide
生成eclipse工程
mvn eclipse:eclipse