maven基础篇(4)-构建普通maven项目

        maven构建项目的默认约定为:
        |- -src
                 |- -main
                              |- -java (此包下放java源码)
                              |- -resources (此包下放资源文件等)
                 |- -test
                              |- -java (此包下放测试所需的java源码)
                              |- -resources (此包下放测试所需资源文件等)
        |- -target (字节码输出目录)
        |- -pom.xml (maven项目管理配置文件)

        因此,只要遵循maven约定,我们自己也可以手工构建项目,下面介绍三种方式来学习maven,第一种手工构建普通的maven项目,第二种则为利用maven相关构建项目 的插件,第三种则为在eclipse集成环境中借助插件来实现。


一,手工构建maven项目

1, 创建maven项目约定目录结构


maven基础篇(4)-构建普通maven项目_第1张图片
maven基础篇(4)-构建普通maven项目_第2张图片
maven基础篇(4)-构建普通maven项目_第3张图片

2,编写java主代码

首先在上图中src/main/java下创建几层目录,即为src/main/java/com/mapc/hellomaven/hm-mod1,其中com.mapc.hellomaven则符合maven坐标groupId命名规范,hm-mod1则符合maven坐标artifactId命名规范。代码如下:

//package com.mapc.hellomaven.hm-mod1;这里犯了很低级的错误,命名不能中横线,改成如下
package com.mapc.hellomaven.hmmod1;
public class HelloMaven 
{
    public void sayHello( )
    {
        System.out.println( "Hello Maven!" );
    }
}

3, 编写测试代码
首先在上图中src/main/java下创建几层目录,即为src/test/java/com/mapc/hellomaven/hm-mod1,其中com.mapc.hellomaven则符合maven坐标groupId命名规范,hm-mod1则符合maven坐标artifactId命名规范。特别注意,maven默认约定主代码类和相关的测试类的package生成是一样的。代码如下:

//package com.mapc.hellomaven.hm-mod1;这里犯了很低级的错误,命名不能中横线,改成如下
package com.mapc.hellomaven.hmmod1;
import org.junit.Test;

public class HelloMavenTest {

    @Test
    public void test(){
        HelloMaven hm=new HelloMaven();
        hm.sayHello();
    }
}

4,写maven项目配置文件pom.xml,并且放在hellomaven项目跟目录下。

maven基础篇(4)-构建普通maven项目_第4张图片

   其中代码如下:

<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.0modelVersion>

  <groupId>com.mapc.hellomavengroupId>
  <artifactId>hm-mod1artifactId>
  <version>0.0.1-SNAPSHOTversion>
  <packaging>jarpackaging>

  <name>hm-mod1name>
  <url>http://maven.apache.orgurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
  properties>

  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.10version>
      <scope>testscope>
    dependency>
  dependencies>
project>

5,使用mvn clean compile命令编译maven项目

        首先打开dos命令窗口,进入项目根目录。


maven基础篇(4)-构建普通maven项目_第5张图片

        输入mvn clean compile编译项目。但是很不幸,结果并不像我想象中那样,出现了编译异常,异常情况如下:


maven基础篇(4)-构建普通maven项目_第6张图片

        经过摸查发现,主代码和测试代码中都有package,但是把这两个类放入相应文件夹时,忘记新建package所指定的那几层文件夹,这里只列出主代码情况如下:

maven基础篇(4)-构建普通maven项目_第7张图片

        新建几层文件夹后,把主代码和测试代码移入,这里也只列出主代码情况如图:

maven基础篇(4)-构建普通maven项目_第8张图片

         再输入命令进行编译,发现依旧是编译错误,接着排查。你是否已经注意到了前面代码中的错误命名注释和文件夹命名问题?
         特别注意:主代码和测试代码中的错误命名hm-mod1改成了hmmod1,这里我把文件夹中的hm-mod1也改成了hmmod1。虽然这个问题很简单,但是浪费我很多时间去检查这个编译错误
         再次输入命令进行编译,这次终于编译成功了,编译成功后项目根目录多了target文件夹,这里面存放字节码文件以及maven很多插件目标操作报告等。如图:
maven基础篇(4)-构建普通maven项目_第9张图片
maven基础篇(4)-构建普通maven项目_第10张图片

6,使用mvn clean test命令进行测试


maven基础篇(4)-构建普通maven项目_第11张图片

         要特别注意,使用此命令测试的过程中,实质上maven执行了很多插件的很多目标。一个test测试的执行过程:
         resources:resources 主代码资源处理
         compiler:compile 主代码编译
         resources:testResources 测试代码资源处理
         compiler:testCompile 测试代码编译
         surefire:test 测试代码执行

7,使用mvn clean package打包
         打包后会在target目录生成一个命名为”artifactId-version.jar”的jar(maven默认打包生成jar)。


maven基础篇(4)-构建普通maven项目_第12张图片

8,使用mvn clean install安装
         使用此命令后,打包的jar会被安装到本地仓库中,可以供别的项目使用。

9,运行打包的jar
        默认打包生成的jar并不是可执行jar。可执行jar的META-INF/MANIFFEST.MF文件中至少有一行配置-Main-Class,这个Main-Class的值为带有main方法的类的全限定类名,也就是指定了这个jar的程序入口(了解更多可执行jar,请参考《jar文件的深入认识》)。为了达到这样的目的,还必须依赖一个maven插件maven-shade-plugin。在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.0modelVersion>

  <groupId>com.mapc.hellomavengroupId>
  <artifactId>hm-mod1artifactId>
  <version>0.0.1-SNAPSHOTversion>
  <packaging>jarpackaging>

  <name>hm-mod1name>
  <url>http://maven.apache.orgurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
  properties>

  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.10version>
      <scope>testscope>
    dependency>
  dependencies>

  <build>
    <plugins>
        <plugin>
            
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-shade-pluginartifactId>
            <version>2.4version>

            <executions>
                <execution>
                    <phase>packagephase>
                    <goals>
                        <goal>shadegoal>
                    goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>
                                com.mapc.hellomaven.hmmod1.HelloMaven
                            mainClass>
                            transformer>
                        transformers>
                    configuration>
                execution>
            executions>
        plugin>
    plugins>
  build>
project>

         执行mvn clean package打包即可生成可执行jar。


maven基础篇(4)-构建普通maven项目_第13张图片

         运行可执行jar,可以成功执行。
这里写图片描述

         运行非可执行jar,运行结果为没有主清单属性,也就是主清单主要没有Main-Class。
这里写图片描述


二,利用maven相关插件自动生成maven项目

         打开命令行,进入项目空间下,输入命令:mvn archetype:generate,dos窗口会进入交互模式,主要过程如下:

[INFO] Generating project in Interactive mode (卡了一会,原因:联网取项目模板)
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
... (这里会自动列出很多项目模板,每种模板前面会有一个数字序号)

336: remote -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)

...

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 336: (这里根据每个人机器上安装的eclipse插件不同,可能默认的数字不是这个,先不管,直接回车)

Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: (直接回车)
Define value for property 'groupId': : com.mycompany.myapp (公司名.项目名)
Define value for property 'artifactId': : myapp-mod1 (项目名-模块名,通常指子项目或者子模块)
Define value for property 'version':  1.0-SNAPSHOT: : (版本号,默认1.0-SNAPSHOT,直接回车)
Define value for property 'package':  com.mycompany.myapp: :com.mycompany.myapp.mod1 (选择默认的也可)
Confirm properties configuration:
groupId: com.mycompany.myapp
artifactId: myapp-mod1
version: 1.0-SNAPSHOT
package: com.mycompany.myapp.mod1
 Y: :  (直接回车)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.mycompany.myapp
[INFO] Parameter: packageName, Value: com.mycompany.myapp.mod1
[INFO] Parameter: package, Value: com.mycompany.myapp.mod1
[INFO] Parameter: artifactId, Value: myapp-mod1
[INFO] Parameter: basedir, Value: D:\projects\demows1
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: D:\projects\demows1\myapp-mod1
...
[INFO] BUILD SUCCESS (项目创建成功!)
...

看截图:
maven基础篇(4)-构建普通maven项目_第14张图片
清除,编译,打包,安装,运行等一系列操作和第一种手工生成maven项目中的一样,这里不再列出。


三,在eclipse利用集成的maven插件自动生成

maven基础篇(4)-构建普通maven项目_第15张图片
两次next
maven基础篇(4)-构建普通maven项目_第16张图片
maven基础篇(4)-构建普通maven项目_第17张图片
生成的项目如图
maven基础篇(4)-构建普通maven项目_第18张图片
打包
maven基础篇(4)-构建普通maven项目_第19张图片
maven基础篇(4)-构建普通maven项目_第20张图片


本博文主要参考博文和学习书籍如下:
1,《Maven实战》(书-PDF版本)
2,点击去看大神对jar和可执行jar的深入剖析
3,《maven学习(上)- 基本入门用法》(系列博文)

你可能感兴趣的:(maven,Maven学习基础篇)