Maven使用基础

(转)https://my.oschina.net/xiaomaoandhong/blog/104045

基于 约定优于配置(Convention Over Configuration)的原则,无特殊需求,请遵守Maven以下约定:


Maven约定

目录src/main/java java源码目录
目录src/main/resources 资源文件目录
目录src/test/java 测试java源码目录
目录src/test/resources 测试资源文件目录
目录target 打包输出目录
目录target/classes 编译输出目录
目录target/test-classes 测试编译输出目录
目录target/site 项目site输出目录
目录src/main/webapp web应用文件目录(当打包为war时),如WEB-INF/web.xml
jar 默认打包格式
*Test.java Maven只会自动运行符合该命名规则的测试类
%user_home%/.m2 Maven默认的本地仓库目录位置
中央仓库 Maven默认使用远程中央仓库:http://repo1.maven.org/maven2
1.3 Maven Compiler插件默认以1.3编译,因此需要额外配置支持1.5

其上所有的约定都可以在Maven的超级POM(super pom)中找到。由于所有的POM都继承了这个超级POM,因此它的默认配置就被继承了 。Maven3中这个超级POM位于lib\maven-model-builder-3.0.4.jar\org\apache\maven\model下

一:编写POM

引用

<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.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging> 

  <name>my-app</name>
  <url>http://maven.apache.org</url> 

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

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

1:project是所有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"> 

它还声明了一些POM相关的命名空间及xsd元素,虽然这些属性不是必须的,但使用这些属性能够让第三方工具(如IDE中的XML编辑器)帮助我们快速编辑POM。

<modelVersion>4.0.0</modelVersion> 

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

3:groupId,artifactId和version三行

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

3.1:groupId

定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联,譬如你的公司是mycom,有一个项目为myapp,那么groupId就应该是com.mycom.myapp。

3.2:artifactId

定义了当前Maven项目在组中唯一的ID,在前面的groupId为com.mycompany.app的例子中,你可能会为不同的子项目(模
块)分配artifactId,如:myapp-util、myapp-domain、myapp-web等等。本例中artifactId 为
my-app

3.3:version

顾名思义,version指定了项目当前的版本。

引用

<version>1.0-SNAPSHOT</version>

SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.1- SNAPSHOT、1.0、1.1、2.0等等。本书的6.5小节会详细介绍SNAPSHOT,第13章介绍如何使用Maven管理项目版本的升级发布。

4:name元素

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

下面不借助于IDE环境的支持,完全以手动配置的方式来说一下Maven的一个入门的小示例

1、创建HelloMaven项目

首先创建一个名为HelloMaven项目的文件夹,在该项目的根目录下建立一个pom.xml文件,该文件是Maven项目的核心,
就像Make的Makefile,Ant的build.xml一样
。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

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/xsd/maven-4.0.0.xsd">
  <!--
      modelVersion指定当前pom模型的版本,
      对于Maven2及Maven3来说,它只能是4.0.0
  -->
  <modelVersion>4.0.0</modelVersion>
  <!--
      groupId,artifactId和version这三个元素定义了一个项目基本的坐标,
      在Maven的世界,任何的jar、pom或者war都是以基于这些基本的坐标进行区分
  -->
  <!--
    groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联
  -->
  <groupId>org.apache.maven</groupId>
  <!--
    artifactId定义了当前Maven项目在组中唯一的ID
  -->
  <artifactId>hellomaven</artifactId>
  <!--
    项目当前版本,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本
  -->
  <version>1.0-SNAPSHOT</version>

  <name>HelloMaven Project</name>
</project>

2、编写项目的主代码HelloMaven.java
基于Maven的约定,我们在HelloMaven目录下创建
src\main\java\HelloMaven.java,Maven会自动搜索该src\main\java目录找到HelloMaven.java

package org.apache.maven.hellomaven;
/**
 *一般来说,项目中Java类的包都应该基于项目的groupId和artifactId
 */
public class HelloMaven {
    public String sayHello() {
        return "Hello Maven";
    }

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

3、编译
新开一个cmd窗口,在项目根目录下使用Maven命令
mvn clean compile编译该源文件HelloMaven.java,clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码

编译成功之后这时我们发现根目录下除了src和pom.xml,还多了个target目录,
默认情况下Maven构建的所有输出都在target目录中
,项目的主代码位于target/classes。

查看target目录

4、测试
遵照上面Maven的约定,测试代码目录是src/test/java。因此,在编写测试用例之前,我们先创建该目录。

在HelloMaven\src\test\java下编写测试类HelloMavenTest.java

package org.apache.maven.hellomaven;
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class HelloMavenTest
{
    @Test
    public void testSayHello()
    {
        HelloMaven hellomaven = new HelloMaven();
        String result = hellomaven.sayHello();
        assertEquals("Hello Maven", result );
    }
}

JUnit是事实上的单元测试标准。要使用JUnit,我们首先需要为HelloMaven项目添加一个JUnit依赖,修改项目的POM文件,添加junit依赖

<dependencies>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.7</version>
          <!--
            依赖范围为test 则表示该依赖只对测试有效
          -->
          <scope>test</scope>
      </dependency>
  </dependencies>

前面说到groupId、artifactId和version是任何一个Maven项目最基本的坐标,JUnit也不例外,有了这段声明,Maven就能够自动从其中央仓库下载junit-4.7.jar到本地仓库。

调用Maven执行测试,运行
mvn clean test

测试代码通过编译之后在target/test-classes下生成了二进制文件,紧接着surefire:test
任务运行测试,surefire
是Maven世界中负责执行测试的插件,这里它运行测试用例HelloMavenTest,并且输出测试报告,显示一共运行了多少测试,失败了多少,出错
了多少,跳过了多少。

5、打包
HelloMaven的POM中没有指定打包类型,使用
默认打包类型jar,简单地执行命令
mvn clean package进行打包

类似地,Maven会在打包之前执行编译、测试等操作。该jar文件hellomaven-1.0-SNAPSHOT.jar同样位于target输出目录中

我们可以复制这个jar到其它项目的classpath路径下从而使用HelloMaven类,但是要
让其他的Maven项目直接引用这个jar,还需要一个安装的步骤:mvn clean install,将这个jar文件安装到本地仓库中,就如前面的junit一样,只有被下载到本地仓库之后才能被其它Maven项目所引用。

已经接触了如下的Maven命令:

mvn clean compile、mvn clean test、mvn clean package、mvn clean install

执行test 之前是会先执行compile的,执行package之前是会先执行test 的,而类似地,install 之前会执

行package。

6、运行

默认打包生成的jar是不能够直接运行的,如:

因为带有main方法的类信息不会添加到manifest中

(

我们可以打开jar文件中的
META-INF/MANIFEST.MF 文件,将无法看到Main-Class一行

如:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: yanghong.zhou
Build-Jdk: 1.6.0_10-rc2

为了生成可执行的jar 文件,我们需要借助maven-shade-plugin,配置该插件如下:

<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>
                      org.apache.maven.hellomaven.HelloMaven
                    </mainClass>
                  </transformer>
                </transformers>
              </configuration>
            </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

现在执行 mvn clean package:
待构建完成之后打 开target/目录 ,我们可以看到

hellomaven-1.0-SNAPSHOT.jar 和original-hellomaven-1.0-SNAPSHOT.jar,前者是带有Main-Class信息的可运行jar,后者是原始的jar,打开
hellomaven-1.0-SNAPSHOT.jar
的META-INF/MANIFEST.MF,可以看到它包含这样一行信息:
Main-Class: org.apache.maven.hellomaven.HelloMaven

run:

时间: 2024-10-30 16:35:20

Maven使用基础的相关文章

maven的基础配置

一.Maven下载 http://maven.apache.org/download.cgi 当前最新版本为:apache-maven-3.1.0-bin.zip 二.Maven的安装 将下载的最新版本解压至:E:\study\Maven\apache-maven-3.1.0-bin 1.设置操作系统的环境变量 2.Path环境变量设置,增加 ;%MAVEN_HOME%\bin 3.测试 执行 mvn –v,结果如下则安装成功 三.Maven在Myeclipse中的配置 1.基础设置 2.Mav

IDEA + maven 零基础构建 java agent 项目

200316-IDEA + maven 零基础构建 java agent 项目 Java Agent(java 探针)虽说在 jdk1.5 之后就有了,但是对于绝大多数的业务开发 javaer 来说,这个东西还是比较神奇和陌生的:虽说在实际的业务开发中,很少会涉及到 agent 开发,但是每个 java 开发都用过,比如使用 idea 写了个 HelloWorld.java,并运行一下, 仔细看控制台输出 本篇将作为 Java Agent 的入门篇,手把手教你开发一个统计方法耗时的 Java A

maven入门基础

Maven的基本使用与生命周期 1.Maven是什么 Maven是一种构建工具(构建是指例如完成清理,编译,测试,打包,发布等一些自定义的过程),类似于make(最早的构建工具,通过一系列目标和依赖将整个构建过程串联起来,同时利用本地命令完成每个目标的实际行为),ant(ant可以看成一个java版 的make,ant 可以跨平台(基于java的原因),且使用xml定义构建脚本,相对于make来说更友好),gradle(基于ant与maven的开发,后续可能取代maven,就好像git逐渐取代s

Maven学习--------基础2

继续学习Maven. 4.2 变量 1) 问:如何使用变量替换?项目中的某个配置文件比如jdbc.properties使用了一些pom中的变量,如何在发布中使用包含真实内容的最终结果文件? 答:使用资源过滤功能,比如: <project> ... <properties> <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName> <jdbc.url>jdbc:mysql:

Maven开发基础总结(Maven自启动,Maven打war包,Maven热部署)

学习内容: 1.不依赖外部Tomcat,自己启动方式部署 2.Maven打war包,远程部署到centOS 3.Maven热部署(不关闭Tomcat部署应用) 做maven开发前提: 1.编码UTF-8 2.设置maven仓库位置(setting.xml文件里面配置Maven仓库的路径) 例如:<localRepository>G:\Maven\repository</localRepository>(这个仓库是公司Maven服务器仓库down下来的) 3.在eclipse中设置M

【Maven】基础概念、仓库、构建与部属

1.常见的自动化构建工具有: make.ant.maven.gradle,gradle是目前最新的,maven是目前最常用的. Eclipse是一种半自动化构建工具,主要体现在把:java文件->class文件->执行文件 2.常见的打包方式: jar-java程序 war-web程序 pom-父工程和聚合工程 3.仓库分类: 本地仓库 中央仓库,需要联网,全球唯一,由maven官方维护 中央仓库镜像:中央仓库进行分流操作,比如中国仓库.美国仓库等 maven通常下载一个jar包,先在本地仓库

Maven技术 基础

一.配置基本信息 1. 装maven解压到一个目录下,在eclipse中配置解压好的目录 2. 配置settings.xml文件: 3. settings.xml中需要配置的内容: <!-- 本地仓库地址 --> <localRepository>E:/apache-maven-3.3.3/repository</localRepository> <!-- 阿里云镜像,比国外的下载快 --> <mirror> <id>alimaven

Maven+glassfish基础搭建与使用

简介 Maven:利用它将项目打包成war包 Glassfish:是一款web应用服务器,和tomcat一样,也是一款优秀的Servlet容器. 一.过程 在官网分别下载Maven 和 Glassfish Maven安装成功标志: Glassfish安装成功标志: 二.mvn常用命令 mvn -v 显示maven安装版本信息 mvn clean 清理项目打包文件,即项目下的target目录 mvn compile 编译项目下的src/main/Java目录源代码 mvn package 项目打包

maven的基础入门

Maven是Java世界中一个很好使的项目管理工具,关于[好使]这个特性从项目的使用量上就能体现出来,虽然说现在有更好使的Gradle,但是Maven的地位也不会那么轻易被撼动,支持者还是多多. Maven的产生背景 在学习一个新知识之前,应该要以历史的眼光来看待这个技术出现的原因,以及这个技术解决的问题,也就是背景,这样能更好地理解这个技术. 在没有Maven之前,开发一个项目,当需要用到别人写的代码的时候,基本上是这样的: 1.开发一个项目,当需要用到别人写好的jar包,就需要把开源的jar