Статьи

Maven 3 Анализ кода и отчетности

Если вы читали любой из моих других блогов, вы будете знать, что я фанат (и защитник) Maven 3. Одним из самых больших изменений в Maven 3 стали возможности создания отчетов с помощью плагина Maven Site .

Я покажу пример конфигурации для плагина Site 3.1 с использованием синтаксиса Markdown для содержимого страницы и проекта Markdown на Daring Fireball .

У большинства из нас есть несколько проектов. Когда я настраивал конфигурацию сайта, я должен был учитывать это. У меня возникли проблемы с агрегацией отчетов и занятиями в AspectJ с Cobertura для покрытия кода тестами.

Старый Конфиг (иначе забыть)

СТАРЫЙ раздел отчетности Maven.

<reporting/>

Новый Конфиг

Плагин Maven Site 3.x является «контейнером» для создания отчетов о плагинах.

Вот таблица некоторых из наиболее распространенных плагинов с открытым исходным кодом.

отчет Описание
Javadoc Создает JavaDoc
Java XRef Отчет о перекрестных ссылках исходного кода проекта
Список тегов Отчеты о тегах, таких как @todo и // TODO
Информация о проекте Множество разных отчетов: информация, ci, зависимости, scm, плагины и т. Д.
Проверьте Стиль Проверяет стиль кода для разработчиков
безошибочный Отчеты о результатах испытаний
PMD Анализатор исходного кода
FindBugs Отчеты о распространенных ошибках кода и подводных камнях
сонар Анализ и метрики кода с течением времени
Cobertura Отчеты о тестировании
Версии Отчеты о версиях приложений и плагинов и любых доступных обновлениях

конфигурация

...
<properties>
  <maven.checkstyle.plugin>2.7</maven.checkstyle.plugin>
  <maven.cobertura.plugin>2.5.1</maven.cobertura.plugin>
  <maven.doxia.module.markdown.version>1.3</maven.doxia.module.markdown.version>
  <maven.javadoc.plugin>2.8.1</maven.javadoc.plugin>
  <maven.jxr.plugin>2.3</maven.jxr.plugin>
  <maven.pmd.plugin>2.7.1</maven.pmd.plugin>
  <maven.project.info.reports.plugin>2.4</maven.project.info.reports.plugin>
  <maven.site.plugin>3.1</maven.site.plugin>
  <maven.sonar.plugin>3.2-RC3</maven.sonar.plugin>
  <maven.surefire.plugin>2.12</maven.surefire.plugin>
  <maven.taglist.plugin>2.4</maven.taglist.plugin>
  <maven.versions.plugin>1.3.1</maven.versions.plugin>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
...
<build>
  <plugins>
    <plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-site-plugin</artifactId>
	<version>${maven.site.plugin}</version>
	<executions>
	    <!-- used for multiproject builds -->
		<execution>
			<id>attach-descriptor</id>
			<goals>
				<goal>attach-descriptor</goal>
			</goals>
		</execution>
	</executions>
	<configuration>
		<reportPlugins>
        <!-- Report Plugins go here -->
		</reportPlugins>
		<locales>en</locales>
	</configuration>
	<dependencies>
	    <!-- To use the Markdown format -->
		<dependency>
			<groupId>org.apache.maven.doxia</groupId>
			<artifactId>doxia-module-markdown</artifactId>
			<version>${maven.doxia.module.markdown.version}</version>
		</dependency>
	</dependencies>
	</plugin>
  </plugins>
</build>
...

Теперь добавьте каждый плагин в раздел reportPlugins так же, как и любую другую зависимость.

Шаблоны страниц

Maven будет искать шаблоны страниц в каталоге src / site проекта. Если проект является родительским проектом pom, добавьте каталог src / site в корень проекта.

Here is a sample directory layout:

├── projectA
│   ├── pom.xml
│   └── src
│       ├── main
│       └── test
├── projectB
│   ├── pom.xml
│   └── src
│       ├── main
│       └── test
├── pom.xml
├── src
│   └── site
|       ├── markdown
|       │   ├── build.md
|       │   ├── index.md
|       │   └── services
|       │       └── persistence.md
|       ├── resources
|       │   └── images
|       │       └── technophile.png
|       └── site.xml
└── projectZ
    ├── pom.xml
    └── src
        ├── main
        └── test

Notice that src is at the same level as the top level pom.

Files:
Line 24: site.xml defines the sites layout.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/DECORATION/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0
  http://maven.apache.org/xsd/decoration-1.0.0.xsd">

  <body>
    <menu name="Overview">
      <item name="Introduction" href="index.html"/>
      <item name="Building MyProject" href="build.html"/>
    </menu>

    <menu name="Common Services">
      <item name="Persistence Detail" href="services/persistence.html"/>
    </menu>

    <menu ref="reports"/>
  </body>
</project>

This generates a page with links for the index page, a build page and a persistence page. Also, line 17: menu ref=”reports” is a special link for the report plugins.

The *.md pages will convert from Markdown format into HTML. The build.md file might contain something like this:

![Technophile](images/technophile.png)

Building Core Spring
==========================

[Gordon Dickens](mailto:gordon@gordondickens.com)

-----

My Project
----------

This project infuses time, space and dimension into a convenient war file.

Line 1 is a reference to an image file. NOTE: this has to be in the site/resources directory.
Line 6 shows how to include a link or hyperlink.

Complete Reporting Config

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-site-plugin</artifactId>
  <version>${maven.site.plugin}</version>
  <executions>
    <execution>
      <id>attach-descriptor</id>
      <goals>
        <goal>attach-descriptor</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
   <reportPlugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-report-plugin</artifactId>
      <version>${maven.surefire.plugin}</version>
      <configuration>
        <outputDirectory>${project.reporting.outputDirectory}/testresults</outputDirectory>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>${maven.javadoc.plugin}</version>
      <configuration>
        <aggregate>true</aggregate>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin</artifactId>
      <version>${maven.checkstyle.plugin}</version>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-project-info-reports-plugin</artifactId>
      <version>${maven.project.info.reports.plugin}</version>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jxr-plugin</artifactId>
      <version>${maven.jxr.plugin}</version>
      <configuration>
        <aggregate>true</aggregate>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>cobertura-maven-plugin</artifactId>
      <version>${maven.cobertura.plugin}</version>
      <configuration>
        <aggregate>true</aggregate>
        <outputDirectory>%{project.reporting.outputDirectory}/cobertura</outputDirectory>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-pmd-plugin</artifactId>
      <version>${maven.pmd.plugin}</version>
      <configuration>
        <aggregate>true</aggregate>
        <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
        <!-- The minimum tokens before a violation -->
        <minimumTokens>100</minimumTokens>
        <!-- Turn off if no xref report -->
        <linkXRef>true</linkXRef>
        <verbose>true</verbose>
        <targetJdk>${java.version}</targetJdk>
        <rulesets>
          <ruleset>/rulesets/maven.xml</ruleset>
          <ruleset>/rulesets/migrating_to_junit4.xml</ruleset>
          <ruleset>/rulesets/design.xml</ruleset>
          <ruleset>/rulesets/unusedcode.xml</ruleset>
          <ruleset>/rulesets/typeresolution.xml</ruleset>
        </rulesets>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>findbugs-maven-plugin</artifactId>
      <version>${maven.findbugs.plugin}</version>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>versions-maven-plugin</artifactId>
      <version>${maven.versions.plugin}</version>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>taglist-maven-plugin</artifactId>
      <version>${maven.taglist.plugin}</version>
      <configuration>
        <aggregate>true</aggregate>
      </configuration>
    </plugin>
   </reportPlugins>
  <locales>en</locales>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.doxia</groupId>
      <artifactId>doxia-module-markdown</artifactId>
      <version>${maven.doxia.module.markdown.version}</version>
    </dependency>
  </dependencies>
</plugin>

Summary

Wow, that’s a lot of config! The configuration sample above has a bit of overlap. Simple remove the report plugins that are not as important to you at the present time.

Watch out for the JXR plugin, this is a very time consuming report to generate. If this becomes something you want to run infrequently, I recommend different Maven profiles, one with JXR and one without.