美文网首页
maven(二) 构建配置

maven(二) 构建配置

作者: 后知不觉1 | 来源:发表于2020-03-16 00:23 被阅读0次

    maven 构建配置

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

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

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

    • clean:项目清理的处理 (常用)
    • default(或 build):构建项目
    • site:建立项目站点

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

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

    • pre-clean:执行一些需要在clean之前完成的工作
    • clean:移除所有上一次构建生成的文件 (常用)
    • post-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);就只有两点

    • 1.maven的生命周期,
    • 2.插件的功能,这个可以通过mvn help:Describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-resources-plugin -Ddetail=true查看具体goal及参数
      *3.插件自定义配置,手动绑定maven执行时机,插件的功能;需要executions -> execution -> phase 与executions -> execution -> goals,然后再配置参数
      *4.插件默认配置,直接通过 configuration配置参数
      *5.maven-jar-plugin 只会打包项目代码,不会处理依赖jar ,如果用这个打包需要用maven-dependency-plugin处理依赖

    这个跟前端的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>
    

    相关文章

      网友评论

          本文标题:maven(二) 构建配置

          本文链接:https://www.haomeiwen.com/subject/ijziehtx.html