maven 入门

来源:互联网 发布:王者荣耀输入法软件 编辑:程序博客网 时间:2024/05/20 10:22

maven入门

http://maven.apache.org/guides/index.html

 

Maven 能够帮助开发者完成以下工作:

构建

文档生成

报告

依赖

SCMs

发布

分发

邮件列表

总的来说,Maven 简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、文档生成、团队合作和其他任务。Maven提高了重用性,负责了大部分构建相关的任务。

 

Maven 3.3 要求 JDK 1.7 或以上

Maven 3.2 要求 JDK 1.6 或以上

Maven 3.0/3.1 要求 JDK 1.5 或以上

 

安装

#mac

tar xzvf apache-maven-3.5.0-bin.tar.gz

unzip apache-maven-3.5.0-bin.zip

 

mv apache-maven-3.5.0 ~/Programs/

vi ~/.bash_profile

  

// <MAVEN-DIR>为你的安装目录---------

export PATH=$PATH:<MAVEN-DIR>/bin

  

// 然后source一下profile文件,检查是否安装成功

source ~/.bash_profile

mvn -version

vi ~/.m2/settings.xml

 

#windows

先安装jdk

解压到个目录

bin子目录加入到path环境变量

在命令行上mvn -v 测试

简单使用

#交互方式创建项目目录结构

mvn archetype:generate

981: remote -> org.apache.maven.archetypes:maven-archetype-quickstart (-)

选择一个版本 6--1.1

选择groupId,artifactId,version,package

 

#非交互方式创建

  mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

 

mvn -B archetype:generate \

  -DarchetypeGroupId=org.apache.maven.archetypes \

  -DgroupId=com.mycompany.app \

  -DartifactId=my-app

 

以上命令是使用org.apache.maven.plugins:maven-archetype-plugin:3.0.1:generate创建的

可参考https://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html

 

#编译

命令行进入到pom.xml文件的目录

    mvn compile

使java 编译器来编译项目,可以在pom.xml中指定相关jdk版本

编译好的代码在${basedir}/target/classes目录

 

#编译测试源码并进行单元测试

Test Driven Development(TDD)

mvn test

 

#只编译测试代码

mvn test-compile

 

#生成jar

mvn package

生成的jar ${basedir}/target

 

#安装到${user.home}/.m2/repository

mvn install

 

surefire plugin 会按照名字寻找test

**/*Test.java

**/Test*.java

**/*TestCase.java

默认会排除

**/Abstract*Test.java

**/Abstract*TestCase.java

 

#关于junit

<dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.12</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

 

#运行

cd my-app

java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

mvn clean dependency:copy-dependencies package

 

#生成site

mvn site

 

#清理

mvn clean

会删除target 目录

 

#生成idea  项目

mvn idea:idea

 

#生成eclipse项目

mvn eclipse:eclipse

eclipse 中一般默认已经安装好m2eclipse插件

http://www.eclipse.org/m2e/

 

#其他

mvn jar:jar

不会重新编译源代码,仅会从target/classes目录创建一个jar

#SNAPSHOT

SNAPSHOT是开发分支的最新代码,并不保证它是stable或者unchanging.release或没有SNAPSHOT后缀的代码表示不会改变了。

换句话说对于x.y-SNAPSHOT变成x.y 就是release,而新的开发版本应该是x.(y+1)-SNAPSHOT.

 

plugin

想要定制化build,可以通过添加plugins来完成

 

以下的例子表示源文件的版本是5.0的,生成的class文件的版本也是5.0

<build>

  <plugins>

    <plugin>

      <groupId>org.apache.maven.plugins</groupId>

      <artifactId>maven-compiler-plugin</artifactId>

      <version>3.3</version>

      <configuration>

        <source>1.5</source>

        <target>1.5</target>

      </configuration>

    </plugin>

  </plugins>

</build>

 

maven中的plugin看起来像是a dependency,它会自动下载并被使用。如果不指定version默认是使用最新版

comfiguration元素应用到compiler plugin的每一个goal.

plugin 列表

http://maven.apache.org/plugins/

配置plugin的说明

http://maven.apache.org/guides/mini/guide-configuring-plugins.html

 

resources添加到jar

要使用标准目录结构

http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

 

src/main/java

src/main/resources

src/main/webapp

src/test/java

src/test/resources

src/it

LICENSE.TXT

NOTICE.TXT

README.TXT

 

resources中的文件,目录结构会以同样的结构自动加入到jar的根目录

 

|-- META-INF

|   |-- MANIFEST.MF

|   |-- application.properties

|   `-- maven

|       `-- com.mycompany.app

|           `-- my-app

|               |-- pom.properties

|               `-- pom.xml

`-- com

    `-- mycompany

        `-- app

            `-- App.class

 

下面是pom.properties的内容

version=1.0-SNAPSHOT

groupId=com.jamie

m2e.projectName=test101

m2e.projectLocation=/Users/jamie/Documents/mavenworkspace/test101

artifactId=test101

 

http://maven.apache.org/guides/getting-started/index.html

 

 

filter resource & properties

有时我们需要一个值才build时才知道。这时在resource file中使用${property name>},而这个propertypom.xml,settings.xml,在外部的properties file,或者a system property

 

为了使maven在复制时可以filter resources,设置filtering的值为truepom.xmlresource目录

 

<build>

    <resources>

      <resource>

        <directory>src/main/resources</directory>

        <filtering>true</filtering>

      </resource>

    </resources>

  </build>

 

 

resource 文件中引用时如${project.name},${project.version},

${project.build.finalName}

${settings.localRepository}

例如:放在src/main/resources目录中的资源application.properties文件中

有一些占位符

#application.properties

application.name=${project.name}

application.version=${project.version}

 

process-resources phasecopy 并且filter 资源文件

mvn process-resources

这个过程之后,在target/classes目录下的application.properties文件会看起来这样

#application.properties

application.name=Maven Quick Start Archetype

application.version=1.0-SNAPSHOT

 

如果属性定义在外部的文件中,要放在src/main/filters目录下,比如叫做filter.properties

#filter.properties

my.filter.value=hello!

 

现在可以pom.xml中加入这个文件的位置

<build>

    <filters>

      <filter>src/main/filters/filter.properties</filter>

    </filters>

    <resources>

      <resource>

        <directory>src/main/resources</directory>

        <filtering>true</filtering>

      </resource>

    </resources>

  </build>


# application.properties

application.name=${project.name}

application.version=${project.version}

message=${my.filter.value}

 

执行mvn process-resources可以看到target/classes/application.properties中的占位符被替换为filter.properties中的值

 

properties的定义除了可以放在filter.properties中,也可以放在pom文件的properties section

<properties>

    <my.filter.value>hello</my.filter.value>

  </properties>

 

filtering resouces 也可以从system properties中获得值,如java中的java.version,

user.home 或者在mvn的命令行中用了-D参数的

 

mvn process-resources "-Dcommand.line.prop=hello again"

 

使用外部依赖

 完整介绍 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

dependency节点有4个属性groupId,artifactId,version,scope

scope的值可以是compile,test,runtime

maven先从local repository(${user.home}/.m2/repository中寻到依赖;如果local repository中不存在,maven会从remote repository中下载到local repository, 默认的remote repositoryhttp://repo.maven.apache.org/maven2/  可以建立自己的maven私服

可以参考

http://maven.apache.org/guides/introduction/introduction-to-repositories.html

 

通过google搜索site:www.ibiblio.org maven2 log4j可以获知log4j的历史版本及最新版本

mvn compile 阶段完成下载

 

布署jarremote repository

pom.xml中配置那个远程repository的相关信息,如authenticaiton information.

下面的例子是使用scp username/password authentication

 

pom.xml

<distributionManagement>

    <repository>

      <id>mycompany-repository</id>

      <name>MyCompany Repository</name>

      <url>scp://repository.mycompany.com/repository/maven2</url>

    </repository>

  </distributionManagement>

 

settings.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>

 

 <server>

            <id>mycompany-nexus-releases</id>

            <username>deployment</username>

            <password>12345678</password>

        </server>

        <server>

            <id>mycompany-nexus-snapshots</id>

            <username>deployment</username>

            <password>12345678</password>

        </server>

 

更多请参考

http://maven.apache.org/guides/mini/guide-encryption.html

 

创建其他类型的项目

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp

 

会创建大约如下的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>my-webapp</artifactId>

  <version>1.0-SNAPSHOT</version>

  <packaging>war</packaging>

 

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.11</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

 

  <build>

    <finalName>my-webapp</finalName>

  </build>

</project>

 

mvn clean package

 

会看到target/my-webapp.war文件创建了

如何一次build多个project

目录结构

+- pom.xml

+- my-app

| +- pom.xml

| +- src

|   +- main

|     +- java

+- my-webapp

| +- pom.xml

| +- src

|   +- main

|     +- webapp

 

 

pom

<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>

 

webapp依赖于my-app生成的一个jar所以my-webapp/pom.xml如下

<dependencies>

    <dependency>

      <groupId>com.mycompany.app</groupId>

      <artifactId>my-app</artifactId>

      <version>1.0-SNAPSHOT</version>

    </dependency>

    ...

  </dependencies>

 

在每个子项目的pom.xml中加入parent节点

<parent>

    <groupId>com.mycompany.app</groupId>

    <artifactId>app</artifactId>

    <version>1.0-SNAPSHOT</version>

  </parent>

 

然后在 父目录下

mvn clean install

 

WAR会被创建在my-webapp/target/my-webapp.war ,其中包含了jar

$ jar tvf my-webapp/target/my-webapp-1.0-SNAPSHOT.war

   0 Fri Jun 24 10:59:56 EST 2005 META-INF/

 222 Fri Jun 24 10:59:54 EST 2005 META-INF/MANIFEST.MF

   0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/

   0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/

   0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/

3239 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.xml

   0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/

 215 Fri Jun 24 10:59:56 EST 2005 WEB-INF/web.xml

 123 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.properties

  52 Fri Jun 24 10:59:56 EST 2005 index.jsp

   0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/

2713 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/my-app-1.0-SNAPSHOT.jar

 

   如何做到的? 首先,父pompackaging值为pom,并含有一些modules,这告诉maven在所有的子模块中运行相关命令而不仅仅是父模块。(更改这种行为可以在命令行中加入--non-recursive)

   然后,我们告诉war依赖于my-app生成的jar,这做了如下的事情:把生成的jar放在war项目的classpath中以便War中的代码可以调用,确保jar总是在warbuild,并指示war pluginjar包含在它的library目录中

   你可能注意到junit-4.11.jar在依赖中,但是war中并没有。原因是它在<scope>test</scope>中,它仅用在testing,所以没有像有<compile> scopemy-app一样被加入到war

  最后一步是在子模块中包含一个parent节点,这与maven 1.0中的extend元素不是,parent元素确保了pom总会被定位,即使在repository中寻找时the project相对于父模块是各自分离的

   不同于maven 1.0,并不要求先运行mvn install,你可以只是运行mvn package,被依赖的包会从target directories被找到,而不是从local repository

    (Unlike Maven 1.0, it is not required that you run install to successfully perform these steps - you can run package on its own and the artifacts in the reactor will be used from the target directories instead of the local repository.)

 

原创粉丝点击