maven是项目构建工具,能把项目抽象成POM(Project Object Model)

Maven使用POM对项目进行构建、打包、文档化等操作

解决了项目需要类库的依赖管理,简化了项目开发环境搭建的过程

maven实现了:

  是构建项目变得容易;

  统一了构建项目的方式,通过pom.xml描述项目;

  提出了一套开发项目的最佳实践,源代码在src/main/java中,配置文件在src/main/resources中,测试代码在src/test/java中;

  包含不同环境项目构建方式;

  解决了类库依赖的问题,自动下载依赖包,协助管理jar包之间的冲突

1.maven的核心是pom.xml,用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>4.0.</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0..RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
groupId项目所属的组
artifactId 项目唯一标识
version项目的版本号
packaging项目的类型,常用的有jar和war
modelVersion maven的版本
dependencies依赖
build插件

2.下载

https://maven.apache.org/

3.安装

直接解压,如E:\baby\software\java\apache-maven-3.5.3

设置环境变量

MAVEN_HOME = E:\baby\software\java\apache-maven-3.5.
path = %MAVEN_HOME%\bin;

安装Maven是否安装成功

mvn -version

4.设置maven

中心仓库位于国外,下载速度会很慢

安装目录下,conf/settings.xml

添加仓库镜像

<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

5.常用的命令

新建一个maven目录

(1)进入此目录,创建一个maven工程

mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes  -DgroupId=com.mycompany.app -DartifactId=my-app

成功创建项目工程my-app

目录结构

maven项目采用“约定优于配置”的原则

  src/main/java约定用于存放源代码

  src/main/test用于存放单元测试代码

  src/target用于存放编译、打包后的输出文件

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/maven-v4_0_0.xsd">
<modelVersion>4.0.</modelVersion>
<groupId>com.mycompant.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

(2)编译maven工程

mvn  compile

会自动在target目录中生成class文件

打包编译时后台一直输出警告信息

在pom.xml增加

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

(3)删除target目录

mvn  clean

(4)测试

mvn clean test

/src/test/java/com/mycompant/app/AppTest.java里的junit的测试用例,把testApp()方法中的assertTrue( true );改成assertTrue( false );

mvn clean test

(5)运行

A.不需要传递参数的

mvn exec:java -Dexec.mainClass="com.mycompant.app.App"

B.需要传递参数的

mvn exec:java -Dexec.mainClass="com.mycompant.app.App" -Dexec.args="arg0 arg1 arg2" 

C.修改pom.xml

在</project>前增加下面代码

<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.</version>
<executions>
<execution>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath>
</classpath>
<argument>com.mycompant.app.App</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>

直接

mvn exec:exec

(6)打包

mvn  package

在target目录生成jar或war

直接到target目录下去执行java -jar my-app.jar命令运行jar包时出现了“my-app.jar没有主清单属性”的错误提示

加上入口类的配置,在pom.xml中的</plugins>前加入如下代码

    <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.mycompant.app.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>

说明:

  配置完成后,执行mvn package即可打包

  在target目录下会生成两个jar包,注意不是my-app.jar文件,而是另外一个

  (my-app.jar 是因为<build>中包含 <finalName>${project.artifactId}</finalName>,否则名为original-xxx.jar)

  生成的jar文件包含了所有依赖,所以可以直接运行

重新打包

mvn clean package

重新进入target

此时会有两个jar文件

java -jar my-app-1.0-SNAPSHOT.jar

如果项目中用到了Spring Framework,将依赖打到一个jar包中,运行时会出现读取XML schema文件出错。原因是Spring Framework的多个jar包中包含相同的文件spring.handlers和spring.schemas,如果生成一个jar包会互相覆盖。为了避免互相影响,可以使用AppendingTransformer来对文件内容追加合并:

完整的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/maven-v4_0_0.xsd">
<modelVersion>4.0.</modelVersion>
<groupId>com.mycompant.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.</version>
<executions>
<execution>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath>
</classpath>
<argument>com.mycompant.app.App</argument>
</arguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.mycompant.app.App</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

直接到target运行

java -jar my-app.jar

输出Hello World!

6.使用IDE设置Maven

Eclipse  windows--》preference

add,Installation home 输入maven的安装目录

添加后勾选使用新的maven

创建web的maven项目 File -> New -> Maven Project -> Next

Group id和Artifact id

finish

说明:

  项目可能会出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 的错误

  点击项目右键>>Build Path>>Configure Build Path>>Libraries>>Add Library>>Server Runtime>>配置好的tomcat服务>>finish>>apply and Close

tomcat server start

浏览器中 http://localhost:8080/my-app/

输出

Hello World!

java学习之maven的更多相关文章

  1. JAVA学习:maven开发环境快速搭建

    转自:http://tech.it168.com/a2011/1204/1283/000001283307.shtml 最近,开发中要用到maven,所以对maven进行了简单的学习.因为有个mave ...

  2. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  3. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  4. Java学习-048-插件应用之 Find Bugs

    FindBugs 是一个静态分析工具,它可以检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题,使用 FindBugs 可以在不实际运行程序的情况对软件进行分析.使用时最好将字节 ...

  5. Java学习-042-获取目录文件列表(当前,级联)

    以下三个场景,在我们日常的测试开发中经常遇到: 软件自动化测试,在进行参数测试时,我们通常将所有相似功能的参数文件统一放在一个目录中,在自动化程序启动的时候,获取资源参数文件夹中所有参数文件,然后解析 ...

  6. java 学习之路

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://i ...

  7. java学习路线(好资源大家分享)

    对于入门java将近两年的时间,曾经迷惘过,一直想知道java的具体学习路线,看过了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,发现没有一个符合我个人需求的学习路线,根 ...

  8. 转:Java学习路线图

    作者: nuanyangyang 标  题: Java学习路线图(整理中,欢迎纠正) 发信站: 北邮人论坛 (Mon Aug 11 19:28:16 2014), 站内   [以下肯定是不完整的列表, ...

  9. Java 学习文章汇总

    目前JAVA可以说是产业界和学术界最热门的语言,许多人都很急切想把JAVA学好. 但学习是需要步骤的,除非像电影中演的那样,能够把需要的专业技巧下载到脑海:主角只花了几秒下载资料,就马上具备飞行员的技 ...

随机推荐

  1. sphinx/Coreseek 4.1 执行make出错

    参考的网址: http://blog.csdn.net/jcjc918/article/details/39032689 configure正确之后,执行make,出现如下的报错信息 configur ...

  2. 未能加载文件或程序集”xxxx”或它的某一个依赖项,试图加载格式不正确的程序。

    通常是因为应用程序编译的目标平台与引用的DLL类库目标平台不一致造成的,如应用程序目标编译为64位,而引用了32位的DLL. 在Visual Studio修改应用程序目标编译平台即可. 更多关于目标编 ...

  3. <七年成为百万富翁:欧洲最知名致富教练的实用教程>读书笔记

    如果说乐观主义让你看到事物积极的一面,那么自信则同时给你与阴暗面打交道的信心 只有弱者才会推卸责任 把问题当做机会,反问自己:我如何才能创造一种环境,使这个问题永不再现 提出正确的问题 你自己,而不是 ...

  4. Go Revel - Routing(路由)

    `Routing`路由控制着请求应该由哪些控制器接受. 它在项目的`conf/routes`文件中定义. 格式为: (METHOD) (URL Pattern) (Controller.Action) ...

  5. .net lock的使用

    内容参考自:http://daimajishu.iteye.com/blog/1079107 一. 基本使用形式 二.应用举例 三.需要注意的地方 四.lock应避免锁定public 类型或不受程序控 ...

  6. XML(五)dom4j增删改查

    book2.xml <? xml version="1.0" encoding="UTF-8"?> <书架> <书> < ...

  7. linq操作符:聚合操作符

    一.Aggregate操作符 Aggregate操作符对集合值执行自定义聚合运算.来看看Aggregate的定义: public static TSource Aggregate<TSource ...

  8. Keil C 中全局变量 extern 的使用

    在KEIL C中,有多个源文件使用到全局变量时,可以在一个源文件中定义全局变量,在另外的源文件中用extern 声明该变量,说明该变量定义在别的文件中,将其作用域扩展到此文件. 例如:有以下两个源文件 ...

  9. 两个有序单链表合并成一个有序单链表的java实现

    仅作为备注, 便于自己回顾. import java.util.Arrays; public class MergeSort { public static class LinkedNode<V ...

  10. JVM运行时数据区与JVM堆内存模型小结

    前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 ...