我们通过实践来补充Maven构建的生命周期。

  第一步:配置POM

  接着上一篇Maven使用,我们先创建一个名为helloworld的文件夹,在helloworld目录下创建pom.xml文件,pom.xml文件配置如下:

<?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-4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.j1.hhl</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>MAVEN HELLO WORLD PROJECT</name>
</project>

  第二步:编写Maven主代码

  在helloworld目录下,创建src/main/java/com/j1/hhl/helloworld/目录,在该目录下,创建HelloWorld.java,并编写如下代码:

package com.j1.hhl.helloworld;
public class HelloWorld{
public String sayHello(){
return "Hello Maven";
}
public static void main(String [] args){
System.out.println(new HelloWorld().sayHello());
}
}

  代码编写完毕后,使用Maven进行编译,在项目根目录下运行mvn clean compile会得到如图所示输出:

  

Clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码,从输出中看到Maven首先执行了clean:clean任务,删除target/目录。默认情况下,Maven构建的所有输出都在target/目录中;接着执行resources:resources任务(未定义项目资源,暂且略过);最后执行compile:compile任务,将项目主代码编译至target/classer目录中,我们可以在target\classes\com\j1\hhl\helloworld中看到Helloworld编译文件。上面提到的clean:clean、clean:clean、compile:compile对应了一些Maven插件及插件目标。

  第三步:编写Maven测试代码

在helloworld目录下,创建src/test/java/com/j1/hhl/helloworld/目录,在该目录下,创建HelloWorldTest.java。代码如下:

package com.j1.hhl.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);
}
}

  在代码中我们看到,在测试类中用到的是junit单元测试,所以在进行测试这一步骤前,我们需要引入junit第三方java 类库。在pom配置如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.j1.hhl</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1-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>

配置完成之后,在项目根目录下运行mvn clean test命令。结果如图所示:

   

  同样也经过clean:clean\resources:resources\compile:compile\test:test这几个步骤,测试代码在编译之后会在target\test-classes生成二进制文件,测试运行完成之后,会在surefire-reports下生成测试报告。

  第四步:打包

编译测试完之后,就是打包,在项目根目录下运行mvn clean package命令,结果如图所示:

  

  同样也经过clean:clean\resources:resources\compile:compile\test:test\jar:jar这几个步骤。

  运行完之后,我们可以在target/输出目录中,看到一个依据pom.xml文件中配置artifactId-version规则的jar包:helloworld-0.0.1-SNAPSHOT.jar。同时在target中多出一个maven-archive文件夹,文件夹下放置的是pom属性文件。

  第五步:Maven安装

至此我们的构建生命周期已经基本结束,如果有需要的话,我们可以复制这个jar文件到其他项目的Classpath中从而使用HelloWorld类。但是,如何才能让其他的Maven项目直接引用这个jar包呢?还需要一个安装步骤,即运行命令mvn clean install,结果如图所示:

  

      同样也经过clean:clean\resources:resources\compile:compile\test:test\jar:jar\install:install这几个步骤。

  运行成功之后,我们可以在Maven本地仓库中找到helloworld-0.0.1-SNAPSHOT.jar和helloworld-0.0.1-SNAPSHOT.pom,我们可以复制pom文件的配置到自身Maven项目pom中,如此即可调用HelloWorld类。

  当所有完成之后, 我们可以运行helloworld-0.0.1-SNAPSHOT.jar这个文件,具体操作是运行java –jar target\helloworld-0.0.1-SNAPSHOT.jar 结果如图所示:

  包中没有主清单属性,为什么?

  原因:我们可以利用反编译软件打开刚刚生成的jar包,继续打开包中的META-INF下的MANIFEST.MF文件,发现没有Main-Class: com.j1.hhl.helloworld.HelloWorld这一行。为什么没有这一行:那是因为HelloWorld存在main方法。在不删除main方法的前提下,解决办法如下:

  在POM中修改配置如下:

<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion>
<groupId>com.j1.hhl</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1-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>
<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.j1.hhl.helloworld.HelloWorld
</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

  重新运行mvn clean install,此时我们会发现在输出目录target中会多出一个名为original-helloworld-0.0.1-SNAPSHOT.jar文件,从命名可以看出这是一个源文件,相对于helloworld-0.0.1-SNAPSHOT.jar的源文件,可运行的自然是helloworld-0.0.1-SNAPSHOT.jar,我们可以运行一下:

  

Maven整理笔记のMaven使用实践的更多相关文章

  1. Maven整理笔记のMaven仓库

    Maven坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式:而构件的物理表示方式是文件,Maven通过仓库来统一管理这些文件.  Maven仓库 在Maven的世界中,任何一个依赖.插件或者项 ...

  2. Maven整理笔记のMaven使用

    POM 就像Make的Makefile,Ant的build.xml一样,Maven项目的核心是pom.xml.POM(Project Object Model项目对象模型),定义了项目的基本信息,用于 ...

  3. Maven整理笔记の安装及配置

      第一部分:在Windows上安装Maven    检查JDK的安装 在安装Maven之前,首先确认你已经正确安装了JDK.Maven可以运行在JDK1.4及以上版本.先打开Windows命令,运行 ...

  4. [maven] 实战笔记 - maven 安装配置

    1.下载地址http://maven.apache.org/download.html 2.windows下安装maven(1)下载 apache-maven-3.0-bin.zip 解压到任意目录下 ...

  5. Maven整理笔记の生命周期和插件

    项目构建的生命周期,其实软件开发人员每天都在干这个事,即项目清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等,可以说几乎所有项目的构建都可以映射到这样一个生命周期上. Maven的插件 ...

  6. Maven整理笔记の初步窥探

    第一部分:引言 Maven是一款跨平台的项目管理工具,作为Apache组织的一个开源项目,主要服务于基于java平台的项目构建.依赖管理和项目信息管理. 项目构建:编译.运行单元测试.生成文档.打包和 ...

  7. MAVEN学习笔记-maven的获取和安装

      windows下maven的安装步骤:      1.下载压缩包http://maven.apache.org/download.cgi选择apache-maven-3.3.9-bin.zip下载 ...

  8. Maven 学习笔记-maven属性

    Maven有六类属性: 1)内置属性 主要有两个常用内置属性 ${basedir}:表示项目根目录,即包含pom.xml文件的目录: ${version}:表示项目版本: 2)POM属性 ${M2_H ...

  9. maven学习笔记--maven项目创建

    使用Maven命令和Eclipse的Maven插件,创建Maven项目 (1)maven命令生成项目         新建一个文件目录,dos进入该目录并执行下面命令: mvn archetype:c ...

随机推荐

  1. PHP5 ini配置文件优化

    1.1使用tmpfs作为缓存加速缓存的文件目录 [root@php-node1 ~]# mount -t tmpfs tmpfs /dev/shm/ -o size=256m [root@php-no ...

  2. 关于在Arduino中调用DS1302模块

    DS1302时钟模块中的电池是起掉电保存作用的,在实际运行中必须给他的GND和VCC供电,否则得到的是错误的时间. 也就是说,电池是保存日期的,而无法提供芯片正常运行所需的电力. 从芯片引脚上可以看出 ...

  3. leetcode334

    public class Solution { public bool IncreasingTriplet(int[] nums) { var len = nums.Length; ) { retur ...

  4. 我的Linux之路——xshell连接linux虚拟机

    出自:https://www.linuxidc.com/Linux/2016-08/134087.htm xshell 5登录本地虚拟机的具体操作步骤如下: 1.首先打开虚拟机,登录到操作系统; 2. ...

  5. VS2013 查看程序各个函数的CPU利用率<转>

    自己写的程序CPU占用率过高,无法锁定原因时,可以用VS2013帮忙检测 1. 打开VS 性能分析 2. 启动项目进行检测 3. 选择CPU采样 完成 4. 分析一段时间 然后停止分析 5. 选择显示 ...

  6. Python的输入输出

    一:Python2.x版本下的输入输出 Python2.x 下的输入 1)raw_input 格式:result = raw_input("提示信息")功能:1)会等待用户输入内容 ...

  7. Etcd的基本使用

    etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现,内部采用 raft 协议作为一致性算法. ...

  8. axis2 webService开发指南(3)

    复杂对象类型的WebService 这次我们编写复杂点的WebService方法,返回的数据是我们定义属性带getter.setter方法JavaBean,一维数组.二维数组等 1.服务源代码 新建一 ...

  9. 使用heap profiler进行内存占用分析

    最近在项目中用到了google的heap profiler工具来分析内存占用,效果非常显著,因此在这里写一篇博客记录一下使用过程中遇到的一些问题. heap profiler依赖于tcmalloc,所 ...

  10. AlphaTesting

    [Alpha Testing] The alpha test is a last chance to reject a pixel from being written to the screen. ...