您的位置:首页 > 其它

maven初步使用

2013-05-07 17:26 295 查看
Maven功能:

1),项目构建工具;自动打包和部署;---避免项目构建的重复;

2),Jar插件库;

3),取代ant;

Apache 项目;  | 版本:3.0.5;

http://maven.apache.org/

参考:

参考书:

从上面网站下载的”maven权威指南”;(暂时不考虑看)

从上面网站下载的”Maven in action.pdf”部分,---以及其它途径下载的该书部分内容”maven实战.pdf”;

系列文章;

http://www.juvenxu.com/category/maven/page/2/

(先看maven专栏部分;从1到10;)

Maven最佳实践:

1),使用插件的时候显式声明版本。

2),配置依赖的时候显
4000
式声明版本。

3),除项目内部依赖外,不要依赖其它 SNAPSHOT。

--------------------------------------------

Maven安装:

1),下载:

官网下载apache-maven-3.0.5-bin.zip;解压缩;

2),配置操作系统环境变量:

我的电脑---右键,属性---高级选项,环境变量;---系统变量,新建,变量名:M2_HOME,变量值:D:\javaSoftInstall\apache-maven-3.0.5(个人maven解压路径)。| 修改系统变量Path,加入内容:%M2_HOME%\bin,与前面的内容使用 ; 隔开;

···

检查:

Cmd中, echo %M2_HOME% ---会输出maven安装目录;

mvn -v  出错;修改:去掉java_home变量值结尾的分号,就好了;

3),升级maven:

解压缩新的maven安装文件;

修改环境变量m2_home中的值为最新的解压文件;

----------------------------

一个实践:

复制D:\javaSoftInstall\apache-maven-3.0.5\conf(maven安装目录)下的settings.xml,文件到C:\Users\sony\.m2(用户文件)下;

.m2:

C:\Users\sony\.m2\repository,maven构件都存储到该仓库中。

···

清理,优化工作;

Eclipse安装m2eclipse插件:

http://m2eclipse.sonatype.org/sites/m2e

安装完成后,重启eclipse;文件---新建---其它,可以看到Maven选项,安装成功;

一些实践:

不要使用ide内嵌的maven,

Windows---首选项---maven,installations,add,选择本地的maven安装目录;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Maven使用:

1,Pom.xml;---定义项目基本信息,描述项目如何构建,声明项目依赖;

根元素下的第一个子元素modelVersion指定了当前POM模型的版本,对于Maven2及Maven  3来说,它只能是4.0.0。 

这段代码中最重要的是groupId,artifactId和version三行。这三个元素定义了一个项目基本的坐标,在Maven的世界,任何的jar、pom或者war都是以基于这些基本的坐标进行区分的。 

groupId定义了项目属于哪个组;

artifactId定义了当前Maven项目在组中唯一的ID;

version指定了Hello World项目当前的版本——1.0-SNAPSHOT。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version 会不断更新,如升级为1.0、1.1-SNAPSHOT、1.1、2.0等等。

最后一个name元素声明了一个对于用户更为友好的项目名称,虽然这不是必须的,但我还是推荐为每个POM声明name,以方便信息交流。

<?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/maven-v4_0_0.xsd">    

    <modelVersion>4.0.0</modelVersion>    

    <groupId>com.juvenxu.mvnbook</groupId>    

    <artifactId>hello-world</artifactId>    

    <version>1.0-SNAPSHOT</version>    

   <name>Maven Hello World Project</name>   

   

   <dependencies>    

     <dependency>    

        <groupId>junit</groupId>    

        <artifactId>junit</artifactId>    

       <version>4.7</version>    

        <scope>test</scope>    

     </dependency>    

  </dependencies> 

     

 </project> 

2,编写主代码:

默认情况下,Maven假设项目主代码位于src/main/java目录,我们遵循Maven的约定,创

建该目录;

然后在该目录下创建文件HelloWorld.java,

···

无须额外的配置,Maven会自动搜寻该目录找到项目主代码。

其次,该Java类的包名是com.juvenxu.mvnbook.helloworld,这与我们之前在POM中定义的groupId和artifactId相吻合。一般来说,项目中Java类的包都应该基于项目的groupId和artifactId,这样更加清晰,更加符合逻辑,也方便搜索构件或者Java类。 

D盘创建hello-world文件夹:

1),pom.xml;

2),src\main\java目录;

3),上面目录下,创建HelloWorld.java类;

package com.juvenxu.mvnbook.helloworld;    

       

  public class HelloWorld    

  {    

     public String sayHello()    

     {    

       return "Hello Maven";     

    }    

   public static void main(String[] args)    

    {    

      System.out.print( new HelloWorld().sayHello() );     

   }    

 }   

Cmd进入到D:\hello-world,执行mvn clean compile

编译出D:\hello-world\target\classes\com\juvenxu\mvnbook\helloworld目录,HelloWorld.class文件;

···

clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码,

默认情况下Maven构建的所有输出都在target/目录中;

Maven首先执行了clean:clean任务,删除target/目录,接着执行resources:resources 任务(未定义项目资源,暂且略过);最后执行compiler:compile 任务,将项目主代码编译至target/classes 目录;

3,编写测试代码:

在src\test\java中放置项目的测试代码;

scope为依赖范围,若依赖范围为test 则表示该依赖只对测试有效;

如果不声明依赖范围,那么默认值就是compile,表示该依赖对主代码和测试代码都有效。

package com.juvenxu.mvnbook.helloworld;    

  import static org.junit.Assert.assertEquals;    

  import org.junit.Test;    

     

  public class HelloWorldTest    

  {    

     @Test   

      public void testSayHello()     

     {    

        HelloWorld helloWorld = new HelloWorld();    

         String result = helloWorld.sayHello();    

         assertEquals( "Hello Maven", result );     

    }    

 }

mvn clean test

命令行输入的是mvn  clean  test,而Maven实际执行的可不止这两个任务,还有clean:clean、

resources:resources、compiler:compile、resources:testResources以及compiler:testCompile。暂时我们需要了解的是,在Maven执行测试(test)之前,它会先自动执行项目主资源处理,主代码编译,测试资源处理,测试代码编译等工作,这是Maven生命周期的一个特性,

4,打包和运行:

mvn clean package

默认打包为jar文件;

类似地,Maven会在打包之前执行编译、测试等操作。

该文件也位于target/输出目录中,它是根据artifact-version.jar规则进行命名的,

安装任务:

mvn clean install



生成可执行的jar文件;

1),

Pom.xml在 </project>前加入下面段

  <build>

    <plugins>

  <plugin>

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

    <artifactId>maven-shade-plugin</artifactId>    

    <version>1.2.1</version>    

    <executions>    

     <execution>    

       <phase>package</phase>    

       <goals>    

         <goal>shade</goal>    

      </goals>    

      <configuration>    

         <transformers>    

          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

            <mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>    

          </transformer>    

        </transformers>    

      </configuration>    

      </execution>    

   </executions>    

 </plugin>

 </plugins>

  </build>

···

2),再次执行mvn clean install

3),然后,

D: \hello-world>java -jar target\hello-world-1.0-SNAPSHOT.jar

输出:Hello Maven

然后该模块可以供其他maven项目使用;

-----------------------------------------------------------------

使用Archetype生成项目骨架:

D盘建立文件夹code;

Cmd进入d:code

mvn archetype:generate

紧接着我们会看到一段长长的输出,有很多可用的archetype 供我们选择,包括著名的Appfuse项目的archetype,JPA项目的archetype等等。每一个archetype前面都会对应有一个编号。

同时命令行会提示一个默认的编号,其对应的archetype为maven-archetype-quickstart,我们直接回车以选择该archetype,紧接着Maven会提示我们输入要创建项目的groupId、artifactId、  version、以及包名package,如下输入并确认:

Define value for groupId: : com.juvenxu.mvnbook    

Define value for artifactId: : hello-world    

Define value for version:  1.0-SNAPSHOT: :     

Define value for package:  com.juvenxu.mvnbook: : com.juvenxu.mvnbook.helloworld    

Confirm properties configuration:    

groupId: com.juvenxu.mvnbook    

artifactId: hello-world    

version: 1.0-SNAPSHOT    

package: com.juvenxu.mvnbook.helloworld    

Y: : y

Archetype插件将根据我们提供的信息创建项目骨架。在当前目录下,Archetype插件会创建一个名为hello-world(我们定义的artifactId)的子目录,从中可以看到项目的基本结构:

pom.xml;

src/main/java;

src/test/java;

然后可以使用,进行继续开发;

-------------------------------------------------------------------

m2eclipse简单使用

导入Maven项目:

Eclipse;file---import---maven,exsiting maven projects,选取上面自动建立的D:\code\hello-world项目;

然后在eclipse中可以看到项目;



创建Maven项目:

File---new---other---maven,maven project---next,选择默认的工作空间路径,next;---在 new  maven project界面,Select an Archetype中,默认选项,next;---,出入group id,artifactId,

完成创建;



和上面使用Archetype插件自动构建的项目,导入eclipse后,基本同;

运行mvn命令:

Eclipse的maven项目的pom.xml,右键,run as,选择常用的maven命令;

选择想要执行的Maven命令就能执行相应的构建,同时我们也能在Eclipse的console中看到构建输出。

···

这里常见的一个问题是,默认选项中没有我们想要执行的Maven命令怎么办?比如,默认带有mvn test,但我们想执行mvn clean test,很简单,选择Maven buid… 以自定义Maven运行命令,在弹出对话框中的Goals一项中输入我们想要执行的命令,如clean  test,设置一下Name,点击Run即可。并且,下一次我们选择Maven  build,或者使用快捷键Alt + Shift + X, M快速执行Maven构建的时候,上次的配置直接就能在历史记录中找到。



···Maven实战.pdf---已看完;| maven初步完成。

////////////////////////////////////////////////////////////////////////////////////////////////////////

坐标和依赖:(”Maven in action.pdf”内容)

标识名称、版本的jar文件;maven会自动去找;

世界上任何一个构件都可以使用Maven 坐标唯一标识,Maven坐标的元素包括groupId、artifactId 、version 、packaging、classifier。

Maven 内置了一个中央仓库的地址(http://repo1.maven.org/maven2),该中央仓库包含了世界上大部分流行的开源项目构件,Maven会在需要的时候去那里下载。

在我们开发自己项目的时候,也需要为其定义适当的坐标,这是Maven 强制要求的,在这个基础上,其他Maven 项目才能引用该项目生成的构件。

···

packaging:该元素定义Maven 项目的打包方式。

classifier :该元素用来帮助定义构建输出的一些附属构件。

注意,我们不能直接定义项目的 classifier ,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成。

依赖的配置:

type :依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar。

optional:标记依赖是否可选。

exclusions:用来排除传递性依赖。

依赖范围:

Compile,编译依赖范围;

Test,测试依赖范围;

Provided,已提供依赖范围;

Runtime,运行时依赖范围;

System,系统依赖范围;

Import,导入依赖范围;

传递性依赖;

依赖调解:

路径最近着优先;然后,顺序最靠前的那个依赖优胜;

可选依赖:不使用;

最佳实践:

排除依赖;---排除不要的依赖,或者的替换;

归类依赖;---例:提取spring版本号相同的多个项目,使用公用的版本号。

优化依赖:

Maven 会自动解析所有项目的直接依赖 和传递性依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调 节,以确保任何一个构件只有唯一的版本在依赖中存在。在这些工作之后,最后得到的那 些依赖被称为已解析依赖;

运行如下的命令查看当前项目的已解析依赖:

mvn dependency:list

可以运行如下命令查看当前项目的依赖树:

mvn dependency:tree

----------------------------------------------------------------

使用maven构建web应用:(”Maven in action.pdf”内容)

显示指定web的打包方式为war;---没有紫色句,则默认打包为jar文件;

<project>     

...     

<groupId>com.juvenxu.mvnbook</groupId>     

<artifactId>sample - war</artifactId>    

<packaging>war</packaging>     

<version>1.0- SNAPSHOT</version>     

...  

</project>

jetty -maven-plugin

使用Cargo 实现自动化部署 :

Cargo 支持两种本地部署的方式,分别为standalone 模式和existing 模式。在standalone 模式中,Cargo 会从Web 容器的安装目录复制一份配置到用户指定的目录,然后在此基础上部署应用,每次重新构建的时候,这个目录都会被清空,所有配置被重新生成。而在existing 模式中,用户需要指定现有的 Web 容器配置目录,然后Cargo 会直接使用这些配置。

standalone 模式:

1 <plugin>  

2     <groupId>org.codehaus.cargo</groupId>  

3     <artifactId>cargo-maven2-plugin</artifactId>  

4     <version>1.3.1</version>  

5     <configuration>  

6         <container>  

7             <containerId>tomcat7x</containerId>  

8             <home>D:\lib\apache-tomcat-7.0.34</home>  

9         </container>  

10         <configuration>  

11             <type>standalone</type>  

12             <home>${project.build.directory}/tomcat7x</home>  

13             <properties>  

14                 <cargo.servlet.port>8082</cargo.servlet.port>  

15             </properties>  

16         </configuration>  

17     </configuration>  

18 </plugin

···紫色,配置端口,默认不需要,为8080;

existing 模式:

<plugin>   

<groupId>org.codehaus.cargo</groupId>    

<artifactId>cargo - maven2- plugin</artifactId>    

<version>1.0</version>    

<configuration>     

<container> 

<containerId>tomcat6x</containerId>        

<home>D:\ cmd \ apache -tomcat - 6.0.29</home>     

</container>     

<configuration>       

<type>existing</type>       

<home>D:\ cmd \ apache -tomcat - 6.0.29</home>     

</configuration>    

</configuration>   

</plugin>

mvn cargo:start运行;

部署至远程web容器:

1 <plugin>  

2     <groupId>org.codehaus.cargo</groupId>  

3     <artifactId>cargo-maven2-plugin</artifactId>  

4     <version>1.3.1</version>  

5     <configuration>  

6         <container>  

7             <containerId>tomcat7x</containerId>  

8             <type>remote</type>  

9         </container>  

10         <configuration>  

11             <type>runtime</type>  

12             <properties>  

13                 <cargo.remote.username>admin</cargo.remote.username>  

14                 <cargo.remote.password>8082</cargo.remote.password>  

15                 <cargo.tomcat.manager.url>http://10.68.14.119:8080/manager</cargo.tomcat.manager.url>  

16             </properties>  

17         </configuration>  

18     </configuration>  

19 </plugin> 

configuration 的type 子元素值为runtime,表示既不使用独立的容器配置,也不使用本地现有的容器配置,而是依赖于一个已运行的容器。properties元素用来声明一些容器热部署相关的配置,例如这里的Tomcat 6就需要提供用户名、密码、以及管理地址。

运行,mvn cargo:redeploy

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

参考:

http://zhimin8haomi.iteye.com/blog/1847524 (看下上面pdf种没有的内容)

创建maven web项目:

File---new---other---maven,maven project---next,选择默认的工作空间路径,next;---在 new  maven project界面,Select an Archetype中,



next;---,输入group id,artifactId,

完成创建;



项目结构:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  maven 初步使用