我是靠谱客的博主 安详皮卡丘,这篇文章主要介绍maven 入门,现在分享给大家,希望可以做个参考。

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>},而这个property pom.xml,settings.xml,在外部的properties file,或者a system property

 

为了使maven在复制时可以filter resources,设置filtering的值为true pom.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 phase copy 并且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.)

 

最后

以上就是安详皮卡丘最近收集整理的关于maven 入门的全部内容,更多相关maven内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部