Maven

maven的命令格式如下:

mvn [plugin-name]:[goal-name]

该命令的意思是:执行“plugin-name”插件的“goal-name”目标(或者称为动作)。

Maven的默认中央仓库:

mvn启动项目命令 java内存 mvn命令在哪执行_生命周期


当构建一个Maven项目时,首先检查pom.xml文件以确定依赖包的下载位置,执行顺序如下:

1、从本地资源库中查找并获得依赖包,如果没有,执行第2步。

2、从Maven默认中央仓库中查找并获得依赖包(http://repo1.maven.org/maven2/),如果没有,执行第3步。

3、如果在pom.xml中定义了自定义的远程仓库,那么也会在这里的仓库中进行查找并获得依赖包,如果都没有找到,那么Maven就会抛出异常。

默认中央仓库的地址:

1、http://repo1.maven.org/maven2/

2、以上地址还配有搜索页面:http://search.maven.org/

3、如果想要向中央仓库提交自己的依赖包,可以很肯定的告诉你,此功能可以实现;参考:

maven创建java项目:


maven查看插件信息:

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-archetype-plugin

根据Goal Prefix得知,这个插件有别名,所以就可以使用别名

mvn help:describe -Dplugin=archetype

mvn启动项目命令 java内存 mvn命令在哪执行_生命周期_02

比如使用archetype的generate目标创建最简单的项目
mvn archetype:generate

但是它却很慢,因为:

mvn启动项目命令 java内存 mvn命令在哪执行_maven的简单使用_03

使用本地的原型文件
所以提前下载archetype-catalog.xml
https://repo.maven.apache.org/maven2/archetype-catalog.xml
下载好以后放在C:\Users\Mustang.m2\repository\目录下

然后输入:mvn archtype:generate -DarchetypeCatalog=local
使用本地的archetype-catalog.xml
但是目标有2000多条,太多了怎么办?

使用maven内置的原型文件

mvn archetype:generate -DarchetypeCatalog=internal

只有七个目标

使用第七个项目模板

mvn启动项目命令 java内存 mvn命令在哪执行_maven_04


创建后的项目架构

mvn启动项目命令 java内存 mvn命令在哪执行_mvn启动项目命令 java内存_05

maven导入eclipse

无法导入,因为用maven创建的项目没有.project 和 .classpath 文件

mvn启动项目命令 java内存 mvn命令在哪执行_maven_06

cmd 中输入mvn help:describe -Dplugin=eclipse

发现eclipse:eclipse命令能创建.project 和 .classpath 文件

mvn启动项目命令 java内存 mvn命令在哪执行_生命周期_07

cmd 切到项目根目录

mvn启动项目命令 java内存 mvn命令在哪执行_生命周期_08

生产了这两个文件,这样eclipse就能识别order项目

mvn启动项目命令 java内存 mvn命令在哪执行_maven_09

如果导入的项目报错,检查是否有M2_REPO 变量,如果没有就如下操作:

mvn启动项目命令 java内存 mvn命令在哪执行_maven的简单使用_10


mvn启动项目命令 java内存 mvn命令在哪执行_eclipse_11

maven导入idea

首先删除刚才生产的eclipse的配置文件

进入order项目输入 mvn eclipse:clean

然后使用 mvn help:describe -Dplugin=idea 查看目标信息

使用 idea:idea 然后生成的idea的配置文件

mvn启动项目命令 java内存 mvn命令在哪执行_eclipse_12

maven编译:

进入项目根目录输入 mvn compiler:compile

mvn启动项目命令 java内存 mvn命令在哪执行_mvn启动项目命令 java内存_13

maven测试:

mvn compiler:testCompile 编译测试java文件

mvn surefire:test 运行测试class文件

执行surefire:test 必须要经过编译后的class文件才行

mvn启动项目命令 java内存 mvn命令在哪执行_生命周期_14


mvn启动项目命令 java内存 mvn命令在哪执行_maven_15


这里运行了两个Test测试单元

mvn启动项目命令 java内存 mvn命令在哪执行_mvn启动项目命令 java内存_16


运行一个Test测试单元

mvn启动项目命令 java内存 mvn命令在哪执行_eclipse_17

Maven生命周期:

有三个内置的生命周期:默认(default),清洁(clean)和站点(site)。
默认构建生命周期(Default Lifeclyle): 该生命周期表示这项目的构建过程,定义了一个项目的构建要经过的不同的阶段。

清理生命周期(Clean Lifecycle): 该生命周期负责清理项目中的多余信息,保持项目资源和代码的整洁性。一般拿来清空directory(即一般的target)目录下的文件。

站点管理生命周期(Site Lifecycle) :向我们创建一个项目时,我们有时候需要提供一个站点,来介绍这个项目的信息,如项目介绍,项目进度状态、项目组成成员,版本控制信息,项目javadoc索引信息等等。站点管理生命周期定义了站点管理过程的各个阶段。

mvn启动项目命令 java内存 mvn命令在哪执行_maven_18

执行生命周期compile:mvn compile

mvn启动项目命令 java内存 mvn命令在哪执行_生命周期_19

Maven命令分类:插件命令和生命周期命令
生命周期阶段命令是插件命令的有序集合。
插件命令是单独的,生命周期命令是把很多插件命令组合在一起,是固定的,比较省事,但是插件命令更灵活。

maven打包

mvn package

但是如果想打包出来的文件包含第三方jar包就使用插件:maven-shade-plugin 需要在pom.xml配置

mvn启动项目命令 java内存 mvn命令在哪执行_mvn启动项目命令 java内存_20


然后在cmd使用mvn package

mvn启动项目命令 java内存 mvn命令在哪执行_maven_21

打包为可执行jar

META-INF/MANIFEST.MF 文件中,配置如下

Main-Class:xxx.xxx.xxx类名

http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#ManifestResourceTransformer

mvn启动项目命令 java内存 mvn命令在哪执行_maven_22

然后进入target目录cmd运行
D:\projects\order\target>java -jar order-1.0-SNAPSHOT.jar

pom.xml结构

<!-- 第三方依赖包 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
    </dependencies>

    <!-- 把shade插件绑定到package生命周期里面 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <manifestEntries>
                                        <Main-Class>com.oops.eshop.Pay</Main-Class>
                                        <X-Compile-Source-JDK>1.8</X-Compile-Source-JDK>
                                        <X-Compile-Target-JDK>1.8</X-Compile-Target-JDK>
                                    </manifestEntries>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

<!-- 指定当前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 坐标  -->
<groupId>反写的公司网址+项目名</groupId>
<artifactId>项目名+模块名</artifactId>
<!-- 第一个0表示大版本号
       第二个0表示分支版本号
       第三个0表示小版本号
     0.0.1
     snapshot快照
     alpha内部测试
     beta公测
     Release稳定
     GA正式发布 -->
<version></version>
<!-- 默认是jar
     war zip pom -->
<packaging></packaging>
<!-- 项目描述名 -->
<name></name>
<!-- 项目地址 -->
<url></url>
<!-- 项目描述 -->
<description></description>
<!-- 开发人员表 -->
<developers></developers>
<!-- 许可证信息 -->
<license></license>
<!-- 组织信息 -->
<organization></organization>

<!-- 依赖 -->
<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <!-- 依赖范围  这个jar只存在于测试的范围
             compile:默认范围,编译测试运行都有效
             provided:在编译和测试时都有效 
             runtime:在测试和运行时有效
             test:在测试范围有效 比如junit
             system:与本机系统相关联,可移植性差
             import:导入的范围,它只是用在dependencyManagement中,表示从气他的pom中导入dependecy的配置-->
        <scope>test</scope> 
        <!-- 设置依赖是否可选 -->
        <optional></optional>
        <!-- 排除依赖传递列表 -->
        <exclusions>
            <exclusion>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<!-- 依赖管理,定义在父模块,给子模块用的 -->
<dependencyManagement>
    <dependencies>
        <dependency></dependency>
    </dependencies>
 </dependencyManagement>

<build>
    <!-- 插件列表  -->
    <plugin>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>

    </plugin>
</build>
<!-- 用于子模块对父模块的继承 -->
<parent></parent>
<!-- 聚合运行多个maven项目 -->
<modules>
    <module></module>
</modules>

在eclipse使用maven创建项目

mvn启动项目命令 java内存 mvn命令在哪执行_maven_23


mvn启动项目命令 java内存 mvn命令在哪执行_mvn启动项目命令 java内存_24

编译

mvn启动项目命令 java内存 mvn命令在哪执行_maven的简单使用_25


mvn启动项目命令 java内存 mvn命令在哪执行_eclipse_26

如果报错:
maven的[WARNING] Using platform encoding (UTF-8 actually) to copy filter
在项目中的pom.xml添加

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

mvn启动项目命令 java内存 mvn命令在哪执行_eclipse_27

如果报错:

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile

Installed JREs的环境变量jre设置为jdk

mvn启动项目命令 java内存 mvn命令在哪执行_生命周期_28