maven(二) 构建配置

2020-03-16  本文已影响0人  后知不觉1

maven 构建配置

maven构建主要依赖各种插件,这插件有官方的,有第三方的;类似于npm 包的插件。在打包过程跟webpack一样,按照一定的生命周期去添加依赖,编译,移动资源改变输出目录。因此在打包过程中插件是一等公民

maven工作流程图 引用大佬们的图

1.maven提供了三套独立的生命周期,每套生命周期都有自己的作用,都是独立运行,执行顺序很重要

2.生命周期主要是maven暴露给插件绑定执行时机的,也有利于理解maven的工作流程,也能理解插件如何工作的;

(1)clean 的生命周期,一般是直接清除,不会在插件中使用clean 的生命周期;

(2)default 的生命周期

validate(校验)    校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
initialize(初始化) 初始化构建状态,比如设置属性值。
generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。
process-sources(处理源代码)  处理源代码,比如说,过滤任意值。
generate-resources(生成资源文件)  生成将会包含在项目包中的资源文件。
process-resources (处理资源文件)  复制和处理资源到目标目录,为打包阶段最好准备。
compile(编译) 编译项目的源代码。
process-classes(处理类文件)  处理编译生成的文件,比如说对Java class文件做字节码改善优化。
generate-test-sources(生成测试源代码)  生成包含在编译阶段中的任何测试源代码。
process-test-sources(处理测试源代码)   处理测试源代码,比如说,过滤任意值。
generate-test-resources(生成测试资源文件)   为测试创建资源文件。
process-test-resources(处理测试资源文件)    复制和处理测试资源到目标目录。
test-compile(编译测试源码)    编译测试源代码到测试目标目录.
process-test-classes(处理测试类文件)   处理测试源码编译生成的文件。
test(测试)    使用合适的单元测试框架运行测试(Juint是其中之一)。
prepare-package(准备打包)   在实际打包之前,执行任何的必要的操作为打包做准备。
package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
integration-test(集成测试)  处理和部署项目到可以运行集成测试环境中。
post-integration-test(集成测试后)    在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。
install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
deploy(部署)  将最终的项目包复制到远程仓库中与其他开发者和项目共享。

(3)site用来发布站点的(使用少)

pre-site:执行生成站点前的准备工作。
site:生成站点文档。
post-site:执行生成站点后需要收尾的工作。
site-deploy:将生成的站点发布到服务器上。

3.插件配置分为手动绑定时机、目标和自动绑定

maven的生命周期是给插件提供一个可执行的时机,在执行到生命周期时执行绑定对应周期的插件;maven 可以查看插件提供查看插件具体能做的事儿,插件的参数;这个能解决没有插件文档的问题

mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-jar-plugin -Ddetail=true

可以看到每个插件提供的功能goal ,已经每个goal的参数;

(1)插件中个性化配置例:将配置文件单独输出到指定的位置

(1.1)查看插件的goal mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-resources-plugin -Ddetail=true;看到部分参数

    This plugin has 4 goals:   //该插件有四个功能

   resources:copy-resources   //复制资源
     Description: Copy resources of the configured plugin attribute resources
     Implementation: org.apache.maven.plugins.resources.CopyResourcesMojo
     Language: java
   
     Available parameters:
   
       addDefaultExcludes (Default: true)   //默认排除文件
         By default files like .gitignore, .cvsignore etc. are excluded which
         means they will not being copied. If you need them for a particular
         reason you can do that by settings this to false. This means all files
         like the following will be copied.
         - Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._*
         - CVS: **/CVS, **/CVS/**, **/.cvsignore
         - RCS: **/RCS, **/RCS/**
         - SCCS: **/SCCS, **/SCCS/**
         - VSSercer: **/vssver.scc
         - MKS: **/project.pj

(2)个性化配置,主要记住两个标签phase,goals 分部对应的maven 的执行周期也就是上述周期,goals是插件自己提供的功能;也就是将插件的功能绑定到maven 执行周期上,等待被调用。

      jar:jar
          Description: Build a JAR from the current project.
          Implementation: org.apache.maven.plugins.jar.JarMojo
          Language: java
          Bound to phase: package           //这个插件就自动绑定了执行时机,所以只需要给参数就能运行;

    

 <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.2</version>
    <executions>
        <execution>
            <id>copy_test</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.basedir}/target/conf3</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                    </resource>
                </resources>

            </configuration>
        </execution>
    </executions>
</plugin>

(1.3)上述是自定义配置,也可以使用默认配置;一个插件会有自己默认的周期和功能;这种是正对插件绑定了运行时机的;如果没有需要自己绑定

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.2</version>
 
      <configuration>
            <outputDirectory>${project.basedir}/target/conf3</outputDirectory>
            <resources>
                  <resource>
                      <directory>src/main/resources</directory>
                  </resource>
            </resources>
      </configuration>
</plugin>

3.插件使用总结

就是将插件绑定到对应的maven生命周期上,去做插件能做的事情(goal);就只有两点

这个跟前端的webpack 类似但是不一样,webpack 插件周期绑定是写死的没有maven灵活;好在maven也提供开箱即用(maven 的最佳实践)
conf文件,依赖包全都打在一个jar中,如果需要拆分就需要自定义插件

附一个常用打包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>4.0.0</modelVersion>

<groupId>asd</groupId>
<artifactId>asd</artifactId>
<version>1.0-SNAPSHOT</version>

<name>lasd</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>

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

    <!-- Spring boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot</artifactId>
        <version>2.0.4.RELEASE</version>
    </dependency>

    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>

    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.4</version>
    </dependency>

    <!-- web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.0.4.RELEASE</version>
        <scope>compile</scope>
    </dependency>


    <!--日志方案 slf4j + logback-->


    <!--日志接口-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>

    <!--日志实现-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-access</artifactId>
        <version>1.2.3</version>
    </dependency>


 
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>

        <!--只会将项目代码打包成为jar不会帮你处理依赖 ,如果需要打胖包就要更使用maven-assembly-plugin 来解决了-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <archive>
                            <!--主类: 使用清单文件 -->
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <mainClass>org.asdasd.cn.App</mainClass>
                                <classpathPrefix>lib/</classpathPrefix>
                            </manifest>
                        </archive>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- 拷贝jar包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build></project>
上一篇下一篇

猜你喜欢

热点阅读