美文网首页maven
mavener 别让你的工程输在起跑线上

mavener 别让你的工程输在起跑线上

作者: icloudYin | 来源:发表于2017-04-11 20:32 被阅读70次

Maven的工程构建确实给程序员带来了不要的福音,想想曾经的我们jar包都是一个个的下载,再碰到版本兼容的问题,折腾许久,痛不欲生...

Maven采用一种被称之为project object model(POM)的概念来管理项目,可以在非常短的时间里完成配置,大大简化工程的创建、报表、检查、构建和自动化测试的设置的工作。然而遗憾的是好多的工程创建者(那些所谓的架构师们)项目仅仅使用Maven来管理包的依赖,简化jar包的下载...做为maven使用者请从以下方面来考虑修改你的POM,别让你的工程输在起跑线上(这不是广告

标准的工程结构

曾几何时流行一种基于约定的做法,Maven大约也受此影响(我杜撰的,就不要考证了)对每一个文件夹都建议了它的作用和名称

Maven Standard Directory Layout


mvn-structure

真真切切的问题是违反这个结构的所增加的成本,曾有多少次你在调试时都无法认识别出资源文件。连神级的IDEA也识别不出.违反的成本就是神也帮不了你.当然了不是一定不可违反只是我不告诉你!

[1] 工程建立的起势

起势有多重要,李小龙和李连杰的起势就不一样 :-)

帅帅的起势Maven也有

mvn archetype:generate

一阵风雨过后等待你出招,请选择maven-archetype-quickstart,一般情况应该是默认选好的。接下来会让你输入一些项目的信息:

Define value for property 'groupId': icloudyin.com
Define value for property 'artifactId': mvn-starter
Define value for property 'version' 1.0-SNAPSHOT: : 
Define value for property 'package' icloudyin.com: 

最后你将见到一个大大的BUILD SUCCESS,像这样


[INFO] BUILD SUCCESS


一个最最基本的maven工程已经建立。你可以再试上几个mvn命令。完整的maven 工程的构建阶段请参考introduction-to-the-lifecycle

工程的建立请从archetype开始,那么多的archetype总有一款使合你!

[2] 让你的代码接受style的考验

代码之丑中我们已经讲过了没有style的代码是何其的悲剧...

打开pom.xml文件加入以下内容

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>2.17</version>
            <executions>
                <execution>
                    <id>verify-style</id>
                    <phase>validate</phase>
                    <configuration>
                        <configLocation>google_checks.xml</configLocation>
                        <encoding>UTF-8</encoding>
                        <consoleOutput>true</consoleOutput>
                        <failsOnError>true</failsOnError>
                        <linkXRef>false</linkXRef>
                    </configuration>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

现在执行mvn validate

mvn validate

你将看到一此warning信息。我们做了什么?在validate周期内加入了代码格式检查插件,并且使用google的风格,从而保证后来的开发者的加入,不会引起代码五官上的变化。如果感觉google的风格过严,请修改自己的价值观。(不会告诉你怎么自定义的)。

maven-checkstyle-plugin目前内置两个代码风格 sun_checks.xmlgoogle_checks.xml. 更多信息请参考maven-checkstyle-plugin

[3] 为代码加上保护伞

有程序员的地方,就会有BUG,我不在调BUG,就在写BUG的路上...google的大神们已经总结了大家共同会犯的错误,那就是error-prone。一句话就是让“catches common programming mistakes at compile-time”。

同样的打开pom.xml,在plugins标签中加入!

<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.3</version>
      <configuration>
        <compilerId>javac-with-errorprone</compilerId>
        <forceJavacCompilerUse>true</forceJavacCompilerUse>
        <!-- maven-compiler-plugin defaults to targeting Java 5, but our javac
             only supports >=6 -->
        <source>7</source>
        <target>7</target>
      </configuration>
      <dependencies>
        <dependency>
          <groupId>org.codehaus.plexus</groupId>
          <artifactId>plexus-compiler-javac-errorprone</artifactId>
          <version>2.8</version>
        </dependency>
        <!-- override plexus-compiler-javac-errorprone's dependency on
             Error Prone with the latest version -->
        <dependency>
          <groupId>com.google.errorprone</groupId>
          <artifactId>error_prone_core</artifactId>
          <version>2.0.19</version>
        </dependency>
      </dependencies>
    </plugin>

为了确保error-prone可以工作,我们需要在建立的工程加入错误的代码。

新建一个文件ShortSet:来自于error-prone示例

public class ShortSet {
  public static void main (String[] args) {
    Set<Short> s = new HashSet<>();
    for (short i = 0; i < 100; i++) {
      s.add(i);
      s.remove(i - 1);
    }
    System.out.println(s.size());
  }
}

执行mvn compile

$ mvn compile
.../icloudyin/com/ShortSet.java:16: error: [CollectionIncompatibleType] Argument 'i - 1' should not be passed to this method; its type int is not compatible with its collection's type argument Short
            s.remove(i - 1);
                    ^
    (see http://errorprone.info/bugpattern/CollectionIncompatibleType)
1 error
[INFO] --------------------------
[INFO] BUILD FAILURE
[INFO] --------------------------

是的在编译阶段,就已经BUILD FAILURE。在这个世界里面没有什么东西是可靠的!记着把错误放在编译阶段...

[4] 带给自己带上紧箍咒

总有一些人在写完代码忘记了一件事,整理代码,如无效的包导入,或未使用的变量定义,作为在一个工程师,这个是要注意的!如果来约束他们?加插件...

同样的再一次打开POM,增加

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.7</version>
    <executions>
        <execution>
            <id>pmd-plugin</id>
            <phase>compile</phase>
            <configuration>
                <printFailingErrors>true</printFailingErrors>
            </configuration>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

来测试一下,打开ShortSet.java 注释掉:

// for (short i = 0; i < 100; i++) {
//            s.add(i);
//            s.remove(i - 1);
//        }
//        System.out.println(s.size());

执行mvn compile

$ mvn compile
[INFO] --- maven-pmd-plugin:3.7:check (pmd-plugin) @ mvn-starter ---
[INFO] PMD Failure: icloudyin/com/ShortSet.java:3 Rule:UnusedImports Priority:4 Avoid unused imports such as 'java.util.HashSet'.
[INFO] PMD Failure: icloudyin/com/ShortSet.java:4 Rule:UnusedImports Priority:4 Avoid unused imports such as 'java.util.Set'.
[INFO] ----------------------------------
[INFO] BUILD FAILURE
[INFO] -----------------------------------

同样的编译出错了,有说人这个太严了不方便测试,难道代码不是应该写完之后再测试的么。放纵即意味着犯错,如果有问题请参考第一篇:从尊敬一事无成的自己开始


现在开始真正的去写程序吧,有风格,常规错误,还有pmd为我们保驾护航,从此开心无极限...然而有一天开发经理说,你们单元测试做的怎么样啊,现在有多少个UT?执行怎么样啊?LLT达标了没有?他们的要求总是那么的不礼貌~怎么办?怼回去啊,但前提是你得有准备...

[5] 生成报告完美谢幕

Maven已经为我们准备了怼回去的资本...只需要生成site report.

打开POM文件,加入

<reporting>
        <plugins>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-report-plugin</artifactId>
                <version>2.19.1</version>
            </plugin>

           
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <formats>
                        <format>html</format>
                        <format>xml</format>
                    </formats>
                </configuration>
            </plugin>

        </plugins>
    </reporting>

然后执行:

mvn site

一切都已就绪, 打开target/site/index.html

拿上这些数据把开发经理给怼回去...

另请:关注公众号实时获取枪炮,icloudYin长期提供火力支援

相关文章

  • mavener 别让你的工程输在起跑线上

    Maven的工程构建确实给程序员带来了不要的福音,想想曾经的我们jar包都是一个个的下载,再碰到版本兼容的问题,折...

  • 你才是孩子的起跑线

    别让孩子输在起跑线上

  • 20170621五班一组作业点评

    1、周姜华——别让孩子输在起跑线上,这句话我们到底在讨论什么? 标题:别让孩子输在起跑线上,这句话我们到底在讨论什...

  • 过早培养竞争意识,只会适得其反

    “别让孩子输在起跑线上”,这句话,你是否感到很熟悉? 它曾经让多少中国的父母们趋之若骛。为了不让孩子输在起跑线上,...

  • 早安分享【提升学习力】

    别让孩子输在起跑线上,这句话是不是谎言? 不是谎言,只是用错了对象。不想让孩子输在起跑线上,不是将来往死里...

  • 孩子真正的起跑线,你知道是什么吗

    父母们经常会关注“别让孩子输在起跑线上”。 家长们在养育孩子的时候都会暗暗较劲,认为不能让孩子输在起跑线上。 所以...

  • day3《见识》第三章谈谈见识字数:755

    常常听到周围的人说:“不要让孩子输在起跑线上”。 知乎上看到这么一个问题:别让孩子输在起跑线上,是最大的谎言吗? ...

  • 父母的语言读后感

    输在起跑线吗? 有了娃后,总有人说,别让孩子输在起跑线上!赢在起跑线,不让孩子输,所以有了“学区房”,有了各大“智...

  • 孩子的起跑线真的输得起吗?

    近年在教育领域对家长误导最严重的一句话是“别让孩子输在起跑线上。”一些家长由于担心自己的孩子输在起跑线上,通过各种...

  • 请输在起跑线上

    近年来,在教育领域对家长误导最严重的一句话,就是“别让孩子输在起跑线上”。一些家长由于担心自己的孩子输在起跑线上,...

网友评论

    本文标题:mavener 别让你的工程输在起跑线上

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