Maven 4.Maven项目基础

来源:互联网 发布:淘宝轮播图女装素材 编辑:程序博客网 时间:2024/06/08 19:12
Maven项目基础

    Maven为其所有项目提供了约定和标准目录布局。如第1章所讨论的,这个标准化提供了一个统一的构建接口,它也使得开发人员可以轻松地从一个项目跳转到另一个项目。本章将解释Maven项目和pom.xml文件的基础知识。


    基础项目组织
    理解Maven项目结构的最好方法是查看一个。图4-1说明了一个基于Maven的Java项目。


图4-1。 Maven Java项目结构
    现在让我们看看项目中的每个组件:    
      gswm是项目的根文件夹。通常,项目的名称与生成的工件的名称匹配。
      src文件夹包含项目相关工件,您通常希望在源控制管理(SCM)系统(如SVN或Git)中进行管理。
      src / main / java文件夹包含Java源代码。
      src / test / java文件夹包含Java单元测试代码。
      目标文件夹保存生成的工件,例如.class文件。生成的工件通常不存储在SCM中,因此不要将目标文件夹及其内容提交到SCM。
      每个Maven项目在项目的根目录都有一个pom.xml文件。它保存项目和配置信息,例如依赖项和插件。
    除了src / main和src / test目录,Maven还推荐了其他几个目录。表4-1列出了这些目录及其中的内容。    
      表4-1。 Maven目录
目录名称              说明
             src / main / resources
              保存需要在生成的工件中结束的资源,例如Spring配置文件和速度模板。           
              src / main / config
              保存配置文件,例如Tomcat上下文文件,James Server配置文件等。这些文件不会在生成的工件中结束。
              src / main / scripts
              保存系统管理员和开发人员对应用程序所需的任何脚本。
               src / test / resources
             保存测试所需的配置文件。
              src / main / webapp
              保存Web资源(如.jsp文件,样式表和图像)。
              src / it
              保存应用程序的集成测试。
              src / main / db
              保存数据库文件,例如SQL脚本。
              src / site
              保存生成项目站点期间所需的文件。
    Maven提供了原型(如第6章所讨论的)快速引导项目的概念。但是,在本章中,您将手动组合项目。使用以下说明创建项目:
    使用命令行,转到要创建项目的文件夹。在本书中,我们假设目录为c:\ apress \ gswm-book \ chapter4。
      运行命令mkdir gswm。
      cd进入新创建的目录,并创建一个空的pom.xml文件。
      创建目录src / main / java。在gswm下创建src目录,然后在src中创建主目录,最后在main下创建java目录,如图4-2所示。

    起始项目结构应类似于图4-2所示。


图4-2。 Maven项目结构

了解pom.xml文件
    pom.xml文件是Maven项目中唯一需要的工件。正如我们在本书中讨论的那样,pom.xml文件保存了Maven所需的配置信息。清单4-1显示了带有基本项目信息的pom.xml文件。我们使用project元素启动pom.xml文件。然后我们提供groupId,artifactId和版本坐标。包装元素告诉Maven它需要为此项目创建一个JAR存档。最后,我们添加有关正在处理此项目的开发人员的信息。
    列表4-1。 pom.xml文件配置

[java]view plain copy
 print?
  1. <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">    
  2. <modelVersion>4.0.0  
  3. </modelVersion>    
  4. <groupId>com.apress.gswmbook  
  5. </groupId>    
  6. <artifactId>gswm  
  7. </artifactId>    
  8. <version>1.0.0-SNAPSHOT  
  9. </version>    
  10. <packaging>jar  
  11. </packaging>    
  12. <name>Getting Started with Maven  
  13. </name>    
  14. <url>http://apress.com  
  15. </url>  
  16.   
  17. <developers>     
  18. <developer>          
  19. <id>balaji  
  20. </id>          
  21. <name>Balaji Varanasi  
  22. </name>          
  23. <email>balaji@inflinx.com  
  24. </email>         
  25. <properties>            
  26. <active>true  
  27. </active>         
  28. </properties>     
  29. </developer>     
  30. <developer>        
  31. <id>sudha  
  32. </id>        
  33. <name>Sudha Belida  
  34. </name>        
  35. <email>sudha@inflinx.com  
  36. </email>        
  37. <properties>            
  38. <active>true  
  39. </active>        
  40. </properties>     
  41. </developer>   
  42. </developers>  
  43. </project>  
我们将在本章后面以及本书其余部分的pom.xml文件中查看其他元素。
      MAVEN VERSIONING
      建议Maven项目使用以下约定进行版本控制:
      <major-version>。<minor-version>。<incremental-version> -qualifier
      主要,次要和增量值是数字,限定符可以具有值,例如RC,alpha,beta和SNAPSHOT。遵循该惯例的一些示例是1.0.0,2.4.5-SNAPSHOT,3.1.1-RC1等等。
      项目版本中的SNAPSHOT限定符具有特殊的含义。这表明该项目处于开发阶段。当项目使用SNAPSHOT依赖项时,每次构建项目时,Maven将获取并使用最新的SNAPSHOT工件。
      大多数存储库管理器只接受发布版本一次。但是,当您在持续集成环境中开发应用程序时,您希望经常构建并将最新版本推送到存储库管理器。因此,最好的做法是在开发期间使用SNAPSHOT来后缀您的版本。 


    构建项目
    在我们看看构建项目之前,让我们在src / main / Java文件夹下添加HelloWorld Java类。清单4-2显示了HelloWorld类的代码。
    清单4-2。 HelloWorld Java类的代码    
public class HelloWorld {public void sayHello(){

System.out.print(“Hello World”); 

}}
}}

    图4-3显示了添加类后的项目结构。


      图4-3。添加了Java类的项目结构
    现在你准备好构建应用程序,让我们从gswm运行mvn包。您应该看到类似于清单4-3所示的输出。
    代码4-3。用于构建应用程序的Maven软件包命令的输出

[java]view plain copy
 print?
  1. C:\apress\gswm-book\chapter4\gswm>mvn package  
  2. [INFO] Scanning for projects...  
  3. [INFO]  
  4. [INFO] ------------------------------------------------------------------------  
  5. [INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT  
  6. [INFO] ------------------------------------------------------------------------  
  7. [INFO]  
  8. [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gswm ---  
  9. [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!  
  10. [INFO] skip non existing resourceDirectory C:\apress\gswm-book\chapter4\gswm\src\main\resources  
  11. [INFO]  
  12. [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ gswm ---  
  13.   
  14. [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!  
  15. [INFO] Compiling 1 source file to C:\apress\gswm-book\chapter4\gswm\target\classes  
  16. [INFO]  
  17. [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ gswm ---  
  18. [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!  
  19. [INFO] skip non existing resourceDirectory C:\apress\gswm-book\chapter4\gswm\src\test\resources  
  20. [INFO]  
  21. [INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ gswm---  
  22. [INFO] No sources to compile  
  23. [INFO]  
  24. [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ gswm ---  
  25. [INFO] No tests to run.  
  26. [INFO]  
  27. [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ gswm ---  
  28. [INFO] Building jar: C:\apress\gswm-book\chapter4\gswm\target\gswm-1.0.0-SNAPSHOT.jar  
  29. [INFO] ------------------------------------------------------------------------  
  30. [INFO] BUILD SUCCESS  
  31. [INFO] ------------------------------------------------------------------------  
  32. [INFO] Total time: 1.269s  
  33. [INFO] Finished at: Mon Oct 13 21:40:44 MDT 2014  
  34. [INFO] Final Memory: 9M/23M  
  35. [INFO] ------------------------------------------------------------------------  
注意如果这是你第一次运行Maven,它将下载它运行所需的插件和依赖关系。因此,您的第一次构建可能需要比预期更长的时间。
        mvn命令之后的包后缀是一个Maven阶段,用于编译Java代码并将其打包到JAR文件中。打包的JAR文件出现在gswm \ target文件夹中,如图4-4所示。

图4-4。位于目标文件夹下的打包JAR
    
    测试项目
    现在您已经完成了项目构建,让我们添加一个测试sayHello()方法的JUnit测试。让我们通过将JUnit依赖项添加到pom.xml文件来开始此过程。您可以通过使用dependencies元素来完成此任务。代码清单4-4显示了具有JUnit依赖关系的更新的pom.xml文件。
    代码4-4。使用JUnit依赖关系更新了POM

[java]view plain copy
 print?
  1. <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">    
  2. <modelVersion>4.0.0  
  3. </modelVersion>    
  4. <groupId>com.apress.gswmbook  
  5. </groupId>    
  6. <artifactId>gswm  
  7. </artifactId>    
  8. <version>1.0.0-SNAPSHOT  
  9. </version>  
  10.   
  11. <packaging>jar  
  12. </packaging>    
  13. <name>Getting Started with Maven  
  14. </name>    
  15. <url>http://apress.com  
  16. </url>    
  17. <developers>     
  18. <developer>          
  19. <id>balaji  
  20. </id>          
  21. <name>Balaji Varanasi  
  22. </name>          
  23. <email>balaji@inflinx.com  
  24. </email>         
  25. <properties>            
  26. <active>true  
  27. </active>         
  28. </properties>     
  29. </developer>     
  30. <developer>        
  31. <id>sudha  
  32. </id>        
  33. <name>Sudha Belida  
  34. </name>        
  35. <email>sudha@inflinx.com  
  36. </email>        
  37. <properties>            
  38. <active>true  
  39. </active>        
  40. </properties>     
  41. </developer>   
  42. </developers>     
  43. <dependencies>          
  44. <dependency>                  
  45. <groupId>junit  
  46. </groupId>                  
  47. <artifactId>junit  
  48. </artifactId>                  
  49. <version>4.11  
  50. </version>                  
  51. <scope>test  
  52. </scope>          
  53. </dependency>  
  54. </dependencies>  
  55. </project>  
  56.         

    请注意,您已使用范围测试,指示仅在测试阶段需要JUnit .jar。让我们通过在命令行中运行mvn dependency:tree来确保这个依赖关系已经成功添加。清单4-5显示了此操作的输出。
    清单4-5。 Maven树命令输出    
[java]view plain copy
 print?
  1. C:\apress\gswm-book\chapter4\gswm>mvn dependency:tree  
  2. [INFO] Scanning for projects...  
  3. [INFO]  
  4. [INFO] ------------------------------------------------------------------------  
  5. [INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT  
  6. [INFO] ------------------------------------------------------------------------  
  7. [INFO]  
  8. [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gswm ---  
  9. [INFO] com.apress.gswmbook:gswm:jar:1.0.0-SNAPSHOT  
  10. [INFO] \- junit:junit:jar:4.11:test  
  11. [INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test  
  12. [INFO] ----------------------------------------------------------  
  13. [INFO] BUILD SUCCESS  
  14. [INFO] ----------------------------------------------------------  
  15. [INFO] Total time: 1.646s  
  16. [INFO] Finished at: Mon Oct 13 21:54:24 MDT 2014  
  17. [INFO] Final Memory: 7M/19M  
  18. [INFO] ----------------------------------------------------------  
    依赖性插件中的树目标将项目的依赖项显示为树。请注意,JUnit依赖项在一个名为hamcrest的传递依赖项中,它是一个开源项目,可以很容易地编写匹配器对象。
现在你在类路径中有JUnit依赖项,让我们向项目中添加一个单元测试HelloWorldTest.java。 在src下创建文件夹test / java,并在它下面添加HelloWorldTest.java。 更新的项目结构如图4-5所示。

       图4-5。 Maven结构与测试类
     HelloWorldTest的源代码如清单4-6所示。
    清单4-6。 HelloWorldTest Java类的代码
[java]view plain copy
 print?
  1. import java.io.ByteArrayOutputStream;import java.io.PrintStream;import org.junit.After;import org.junit.Assert;import org.junit.Before;import org.junit.Test;public class HelloWorldTest   
  2. {  
  3. private final ByteArrayOutputStream outStream = new ByteArrayOutputStream();        @Before        public void setUp()   
  4. {            System.setOut(new PrintStream(outStream));          
  5. }        @Test        public void testSayHello()   
  6. {                HelloWorld hw = new HelloWorld();                hw.sayHello();                Assert.assertEquals("Hello World", outStream.toString());          
  7. }        @After        public void cleanUp()   
  8. {            System.setOut(null);          
  9. }  
  10. }  

     您现在已经在此项目中设置了所有内容,因此您可以再次运行mvn软件包。 运行它之后,您将看到类似于清单4-7所示的输出。
     列表4-7。 用于构建项目的Maven命令的输出

[java]view plain copy
 print?
  1. C:\apress\gswm-book\chapter4\gswm>mvn package  
  2. [INFO] Scanning for projects...  
  3. [INFO]  
  4. [INFO] ---------------------------------------------------------------  
  5. [INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT  
  6.   
  7. [INFO] ---------------------------------------------------------------  
  8. [INFO]  
  9. [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gswm ---  
  10. [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!  
  11. [INFO] skip non existing resourceDirectory C:\apress\gswm-book\chapter4\gswm\src\main\resources  
  12. [INFO]  
  13. [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ gswm ---  
  14. [INFO] Nothing to compile - all classes are up to date  
  15. [INFO]  
  16. [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ gswm --------------------------------------------------------  
  17. [INFO] Surefire report directory: C:\apress\gswm-book\chapter4\gswm\target\surefire-reports------------------------------------------------------- T E S T S-------------------------------------------------------Running HelloWorldTestTests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.038 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0  
  18. [INFO]  
  19. [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ gswm ---  
  20. [INFO] Building jar: C:\apress\gswmbook\chapter4\gswm\target\gswm-1.0.0-SNAPSHOT.jar  
  21. [INFO] ------------------------------------------------------------------------  
  22. [INFO] BUILD SUCCESS  
  23. [INFO] ------------------------------------------------------------------------  
  24. [INFO] Total time: 1.807s  
  25. [INFO] Finished at: Mon Oct 13 21:59:57 MDT 2014  
  26. [INFO] Final Memory: 9M/22M  
  27. [INFO] --------------------------------------------------------------------  
注意代码4-7中的Tests部分。它显示Maven已运行测试,并已成功完成。

      图4-6。具有测试类的目标文件夹

    图4-6显示了更新的目标文件夹。您可以看到现在有一​​个test-classes文件夹及其在该文件夹中的关联报告。


    pom.xml中的属性
    Maven允许您使用<properties />元素在pom.xml文件中声明属性。这些属性对于声明依赖关系版本非常有用。代码清单4-8显示了更新的pom.xml文件,其中JUnit版本声明为属性。注意在JUnit依赖关系的版本元素中使用$ {}语法。这在pom.xml有很多依赖项并且需要知道或更改特定依赖项的版本时尤其有用。
    代码4-8。 pom.xml带有属性的文件

[java]view plain copy
 print?
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    
  3. <modelVersion>4.0.0  
  4. </modelVersion>    
  5. <groupId>com.apress.gswmbook  
  6. </groupId>    
  7. <artifactId>gswm  
  8. </artifactId>    
  9. <version>1.0.0-SNAPSHOT  
  10. </version>    
  11. <packaging>jar  
  12. </packaging>    
  13. <name>Getting Started with Maven  
  14. </name>    
  15. <url>http://apress.com  
  16. </url>    
  17. <properties>     
  18. <junit.version>4.11  
  19. </junit.version>    
  20. </properties>    
  21. <developers>     
  22. <developer>          
  23. <id>balaji  
  24. </id>          
  25. <name>Balaji Varanasi  
  26. </name>          
  27. <email>balaji@inflinx.com  
  28. </email>         
  29. <properties>            
  30. <active>true  
  31. </active>         
  32. </properties>     
  33. </developer>     
  34. <developer>        
  35. <id>sudha  
  36. </id>        
  37. <name>Sudha Belida  
  38. </name>        
  39. <email>sudha@inflinx.com  
  40. </email>        
  41. <properties>            
  42. <active>true  
  43. </active>        
  44. </properties>   
  45. </developer>   
  46. </developers>     
  47. <dependencies>          
  48. <dependency>                  
  49. <groupId>junit  
  50. </groupId>                  
  51. <artifactId>junit  
  52. </artifactId>                  
  53. <version>${junit.version}  
  54. </version>                  
  55. <scope>test  
  56. </scope>          
  57. </dependency>  
  58. </dependencies>  
  59. </project>  

排除依赖关系
     第3章讨论了传递依赖和偶尔需要排除一个特定的传递依赖。 pom.xml文件中的exclude元素允许您排除依赖关系。
     清单4-9显示了排除hamcrest传递依赖关系的JUnit的更新依赖关系元素。 如您所见,排除元素采用您想要排除的依赖关系的groupId和artifactId坐标。
     代码4-9。 JUnit依赖与排除
[java]view plain copy
 print?
  1. <dependencies>          
  2. <dependency>                  
  3. <groupId>junit  
  4. </groupId>                  
  5. <artifactId>junit  
  6. </artifactId>                  
  7. <version>${junit.version}  
  8. </version>                  
  9. <scope>test  
  10. </scope>                  
  11. <exclusions>                          
  12. <exclusion>   
  13. <groupId> org.hamcrest  
  14. </groupId>                                  
  15. <artifactId>hamcrest  
  16. </artifactId>                          
  17. </exclusion>                  
  18. </exclusions>          
  19. </dependency>  
  20. </dependencies>  


总结
     Maven的CoC为其所有项目规定了标准目录布局。 它提供了几个敏感的目录,如src \ main \ java和src \ it,以及对每个目录的内容的建议。 您学习了强制性的pom.xml文件及其一些元素,用于配置Maven项目的行为。


     在下一章中,您将看到Maven的生命周期,插件,构建阶段,目标以及如何有效地利用它们。
0 0
原创粉丝点击