Maven使用入门(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fyuanfena/article/details/52290721

1. 项目坐标

  Maven通过特定的标识来定义项目名称,这样既可以唯一的匹配其他的jar包,也可以通过发布,使别人能使用自己的发布产品。这个标识就被叫做坐标,长的其实很普通,就是简单的xml而已:

<groupId>com.dhu.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<name>maventest</name>
<url>http://maven.apache.org</url>

  - groupId:所述的项目名称,由于有的项目并不是一个jar包构成的,而是由很多的jar包组成的。因此这个groupId就是整个项目的名称。

  - artifactId:包的名称。

  - version:版本号。

  - packaging:包的类型,一般都是jar,也可以是war之类的。如果不填,默认就是jar。

  - name和url,一个是名称,一个是maven的地址。主要就是上面的几个参数。

这里要注意的是jar包的命名规则:

artifactId-version[-classifier].packaging

比如上面的pom.xml生成的jar包名字就是:maventest-0.0.1-SNAPSHOT.jar。


2. 编写主代码

项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(比如jar),而测试代码只在运行测试时用到,不会被打包

默认情况下,Maven假设项目主代码位于src/main/java目录,然后在该目录下创建文件com/dhu/mvnbook/HelloWorld.java,其内容如下:

扫描二维码关注公众号,回复: 3287691 查看本文章
public class HelloWorld  
{  
   public String sayHello()  
   {  
     return "Hello Maven";  
   }  

  public static void main(String[] args)  
   {  
     System.out.print( new HelloWorld().sayHello() );  
   }  
}  

代码编写完毕后,我们使用Maven进行编译,在项目根目录下运行命令

mvn clean compile

至此,Maven在没有任何额外的配置的情况下就执行了项目的清理和编译任务,接下来,我们编写一些单元测试代码并让Maven执行自动化测试。

3. 编写测试代码

Maven项目中默认的测试代码目录是src/test/java。因此,在编写测试用例之前,我们先创建该目录。

JUnit是事实上的单元测试标准,我们首先需要为Hello World项目添加一个JUnit依赖,修改项目的POM如下:
当想要依赖什么jar的时候就可以通过下面的方式依赖:

 <dependencies>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
   </dependencies>

在Maven之前,我们可以去JUnit的官网下载分发包。而现在有了Maven,它会自动访问中央仓库(http://mvnrepository.com/

配置了测试依赖,接着就可以编写测试类,回顾一下前面的HelloWorld类,现在我们要测试该类的sayHello()方法,检查其返回值是否为“Hello Maven”。在src/test/java目录下创建文件,其内容如下:

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

一个典型的单元测试包含三个步骤:一,准备测试类及数据;二,执行要测试的行为;三,检查结果。上述样例中,我们首先初始化了一个要测试的HelloWorld实例,接着执行该实例的sayHello()方法并保存结果到result变量中,最后使用JUnit框架的Assert类检查结果是否为我们期望的”Hello Maven”。在JUnit 3中,约定所有需要执行测试的方法都以test开头,这里我们使用了JUnit 4,但我们仍然遵循这一约定,在JUnit 4中,需要执行的测试方法都应该以@Test进行标注。

测试用例编写完毕之后就可以调用Maven执行测试,运行* mvn clean test*

4. 打包和运行

Hello World的POM中没有指定打包类型,使用默认打包类型jar,我们可以简单地执行命令

mvn clean package

至此,我们得到了项目的输出,如果有需要的话,就可以复制这个jar文件到其他项目的Classpath中从而使用HelloWorld类。

但是,如何才能让其他的Maven项目直接引用这个jar呢?我们还需要一个安装的步骤,执行

mvn clean install

得到如下结果,说明

从输出我们看到该任务将项目输出的jar安装到了Maven本地仓库中,我们可以打开相应的文件夹看到Hello World项目的pom和jar。之前讲述JUnit的POM及jar的下载的时候,我们说只有构件被下载到本地仓库后,才能由所有Maven项目使用,这里是同样的道理,只有将Hello World的构件安装到本地仓库之后,其他Maven项目才能使用它


到目前为止,我们还没有运行Hello World项目,不要忘了HelloWorld类可是有一个main方法的。默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中。为了生成可执行的jar文件,我们需要借助maven-assembly-plugin,配置该插件如下:
1. 在pom.xml中添加

<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.mvnbook.helloworld.HelloWorld</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

plugin元素在POM中的相对位置应该在<project><build><plugins>下面。

上面需要注意的是\com.mvnbook.helloworld.HelloWorld\中指的是jar文件中的启动类

  1. 进行mvn assembly:assembly操作
    进入项目所在根目录
    执行
mvn assembly:assembly
  1. 执行jar
    输入
java -jar target\hello-world-0.0.1-SNAPSHOT.jar

5.问题汇总:

问题1:

[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!

解决方法:

在pom.xml里,中添加标签即可。

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

问题2:新建maven工程时报错:Could not resolve archetype org.apache.maven.archetypes .

解决方法:
删除本地仓库的archetypes-quickstart

我的本地仓库位置是D:\Program Files\Java\maven_repository

因此,只需要删除该目录下的/org/apache/maven/archetypes/archetypes-quickstart
就搞定了。
还有其他人的解法,说是重新配置archetype-catalog,但对我没用。

Reference:

Maven入门

猜你喜欢

转载自blog.csdn.net/fyuanfena/article/details/52290721
今日推荐